Sunday, November 16, 2008

Підключаємося до транзакції

Часом в проекті з CMT бінами потірібно працювати з ресурсами які немають підтримки JTA, але мають підтримку двофазних транзакцій (Наприклад з бінів потрібно робити запити до CORBA ресурсів). В таких випадках трохи не зрозуміло де для таких ресурсів потрібно починати і закінчувати транзакцію. І тут на допомогу приходить інтерфейс javax.transaction.Synchronization. Його реалізацію можна зареєструвати в поточній транзакції і відслідковувати коли визвати першу і другу фазу коміту. Отже реалізація має бути типу
public class MyResourceSynchronization implements Synchronization{
public void beforeCompletion() {
    myResource.validate();
}
public void afterCompletion(int status) {
    if(status==Status.STATUS_ROLLEDBACK)
        myResource.rollback();
    else
        myResource.commit();
}}
і чіпляємо його до транзакції наспуним чином
TransactionManager manager=(TransactionManager)sessionContext.getUserTransaction();
manager.getTransaction().registerSynchronization(new MyResourceSynchronization());

Wednesday, November 5, 2008

Toplink Essentials в Resin 2 і не тільки

В продовження теми Toplink Essentials on Caucho Resin.

Як відомо Toplink Essentials являється Reference Implementation специфікації JPA і тому підтримує буквально два сервери - це SunAS9 i OC4J_10_1_3. Щоб пересвітчитись достатньо заглянути в клас oracle.toplink.essentials.config.TargetServer. З рештою серверів Toplink працює як в середовищі без підтримки JTA (при коміті ejb транзакції Toplink зміни в базу не синхронізує). 

Щоб добавити підтримку JTA для свого сервера потрібно створити два класи - перший це клас, що серверну платформу і повинен реалізовувати інтерфейс oracle.toplink.essentials.platform.server.ServerPlatform, як початковуреалізацію можна взяти клас oracle.toplink.essentials.platform.server.ServerPlatformBase. Головним методом в цьому класі є getExternalTransactionControllerClass, який повертає клас що вміє для конкретного сервера шукати референс на javax.transaction.TransactionManager. В нашому випадку це другий клас який потрібно сворити і наслідує він oracle.toplink.essentials.transaction.JTATransactionController

Назвемо перший клас ResinServerPlatform, а другий ResinTransactionController. ResinTransactionController повинен переопреділити метод acquireTransactionManager наступним чином

protected TransactionManager acquireTransactionManager() throws Exception {
  return (TransactionManager)jndiLookup("java:comp/UserTransaction");
 }

Тепер залишилося в persistence.xml прописати для властивості toplink.target-server значення ResinServerPlatform.

Я не наводжу повних кодів для класів, так як достатньо в сорцах подивитися на реалізацю oracle.toplink.essentials.platform.server.sunas.SunAS9ServerPlatform та oracle.toplink.essentials.transaction.sunas.SunAS9TransactionController і все стане зрозуміло.

Monday, November 3, 2008

Javahl в SVN плагіні для eclipse

В tigris є хороший плагін для екліпси, який може працювати як на явовському клієнті так і на натівному. Щоб активувати натівний клієнт, потрібно встановити пакет libsvn-java, а в eclipse.ini прописати -Djava.library.path=/usr/lib/jni.