首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >javax.transaction.Synchronization.beforeCompletion与javax.ejb.BeforeCompletion中的EJB上下文

javax.transaction.Synchronization.beforeCompletion与javax.ejb.BeforeCompletion中的EJB上下文
EN

Stack Overflow用户
提问于 2017-11-29 23:51:10
回答 0查看 470关注 0票数 0

在TomEE中,当ejb在事务同步注册表中注册同步时,beforeCompletion中没有ejb上下文。当使用bean javax.ejb.BeforeCompletion时,有。根据jee/ejb规范,应该期望什么?

参见下面的代码测试用例testWithWrappedUserTransaction失败:

代码语言:javascript
复制
import java.util.Properties;
import java.util.concurrent.Callable;

import javax.annotation.Resource;
import javax.ejb.AfterBegin;
import javax.ejb.AfterCompletion;
import javax.ejb.BeforeCompletion;
import javax.ejb.EJB;
import javax.ejb.EJBException;
import javax.ejb.Stateful;
import javax.ejb.embeddable.EJBContainer;
import javax.enterprise.context.RequestScoped;
import javax.transaction.Synchronization;
import javax.transaction.TransactionSynchronizationRegistry;
import javax.transaction.UserTransaction;

import org.apache.openejb.core.ThreadContext;

import junit.framework.TestCase;

public class TransactionTest extends TestCase
{
@Resource
private TransactionSynchronizationRegistry  registry;

@Resource
private UserTransaction transaction;
@EJB
private Caller transactionalCaller;

@EJB
private Caller transactionalCaller2;

@Override
protected void setUp() throws Exception {
    final Properties p = new Properties();
    p.put("movieDatabase", "new://Resource?type=DataSource");
    p.put("movieDatabase.JdbcDriver", "org.hsqldb.jdbcDriver");
    p.put("movieDatabase.JdbcUrl", "jdbc:hsqldb:mem:moviedb");

    EJBContainer.createEJBContainer(p).getContext().bind("inject", this);
}

private void doWork() throws Exception {
    registry.registerInterposedSynchronization(new SynchronizationImplementation());
}

class SynchronizationImplementation implements Synchronization
{
    @Override
    public void beforeCompletion() {
        System.out.println("XXX: beforeCommit");
        assertEJBContext();
    }

    @Override
    public void afterCompletion(int paramInt) {
        System.out.println("XXX: afterCommit");
        assertEJBContext();
    }
}

private static void assertEJBContext() {
    assertTrue(ThreadContext.getThreadContext() != null);
}

public void testWithWrappedUserTransaction() throws Exception {
    transaction.begin();
    try {
        transactionalCaller.call(() -> {
            doWork();
            return null;
        });
    } finally {
        transaction.commit();
    }
}

public void testWithDoubleBeanTransaction() throws Exception {
    transactionalCaller.call(() -> {
        doWork2();
        return null;
    });
}

private void doWork2() throws Exception {
    System.out.println("XXX: doWork2");
    transactionalCaller2.call(() -> {
        doWork();
        return null;
    });
}

public void testWithTransaction() throws Exception {
    transactionalCaller.call(() -> {
        doWork();
        return null;
    });
}

public static interface Caller
{
    public <V> V call(Callable<V> callable) throws Exception;
}

}

ps:我记录了TomEE的票证,但没有得到响应:https://issues.apache.org/jira/browse/TOMEE-2135

EN

回答

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47556751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档