我试图使用AbstractTransactionalJUnit4SpringContextTests的子类,部署在WebLogic 8.1中的遗留应用程序创建集成测试。

我的测试方法具有以下注释:

@Test
@Rollback(true)
public void testDeployedEJBCall throws Exception {...}

我的测试类还引用类型org.springframework.ejb.access.SimpleRemoteStatelessSessionProxyFactoryBean,其代理EJB的部署我在WebLogic Server上的豆子。

当我请在我的测试方法在一个序贯的方式在此代理bean方法中,事务回滚正确地在测试的末尾。

e.g。 :

@Test
@Rollback(true)
public void testDeployedEJBCall throws Exception {
    Long result1 = myejb.method(100L);
    Long result2 = myejb.method(200L);
    ...
}

然而,我想使为相同EJB方法2级并行的呼叫。所以我做了实现可调用,以调用我的方法在2级不同的线程,并希望运行这些并行的内部类。结果 但是,这样做似乎让被称为我的事务之外的EJB方法,并没有被回滚。

下面是当我运行方法调用全测试类想什么并联:

import org.springframework.test.annotation.*;

@RunWith(SpringJUnit4ClassRunner.class)
@Transactional
@ContextConfiguration(locations = {"classpath:path/to/tests-config.xml"})
@TransactionConfiguration(defaultRollback=true)
public final class IntegrationTests extends AbstractTransactionalJUnit4SpringContextTests {
    @Autowired
    protected JndiTemplate jndiTemplate;
    @Resource
    protected Proxy myEJB;

    public IntegrationTests() {
        super();
        this.logger = Logger.getLogger(IntegrationTests.class);
    }

    @Test
    @Rollback(true)
    public void testDeployedEJBCall() throws Exception {
        // Create a thread pool for parallel execution. 
        ExecutorService exec = Executors.newFixedThreadPool(2);

        // Prepare the tasks for parallel execution
        List<CallEJBTask> tasks = new ArrayList<CallEJBTask>();
        tasks.add(new CallEJBTask(100L, this.myEJB));
        tasks.add(new CallEJBTask(200L, this.myEJB));

        // Execute all pending tasks in the exec Threadpool
        List<Future<Long>> results = exec.invokeAll(tasks);

        // Get the results of each task
        Long result1 = results.get(0).get();
        Long result2 = results.get(1).get();

        ...
    }
}

private class CallEBJTask implements Callable<Long> {
    private final Long valueToTest;
    private final MyEJB myEJB;

    public CallEJBTask(Long valueToTest, Proxy myEJBProxy)
        this.valueToTest = valueToTest;
        this.myEJB = (MyEJB)myEJBProxy;
    }

    public Long call() throws Exception {
        return getResult();
    }

    public Long getResult() {
        Long result = null;

        try {
            result = this.myEJB.method(this.patient);

        } catch (Exception e) {
            ...
        }
        return result;   
    } 
}

有一种方法使该回退???

感谢您的帮助。

此致

菲利普

有帮助吗?

解决方案

不自动,没有。问题是,这两个额外的线程不参与交易,因此他们的行为不回滚。

什么是两个并行执行的目的是什么?你会不会能够测试并发问题这种方法,如果这是你的目标是什么了。

编辑:的问题是,测试并发问题是非常困难的,因为你的测试,充其量概率 - 成功或失败取决于微妙的时机问题,可能只是表面上的十亿分运行。请参见为基础的一个很好的总结这个Serverside集团文章

经验法则应当避免手工编码线程只要有可能,因为它是很难得到正确,难以测试。如果可以的话,避免线程之间共享的状态,以及如果存在没有办法解决它,依赖于来自java.util.concurrent包并发数据结构和异步执行者。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top