我有一个相当愚蠢的问题,但我缺少跟踪和解决它的知识和工具。基本上我有一个长时间运行的方法来做一些计算。在此方法启动之前,我将作为参数传递的对象合并到此方法,但此对象不会被它修改。合并操作由会话外观完成,所以我做这样的事情:
@EJB
private ScenarioFacadeLocal sfl;
@EJB
private ComputationEngineLocal solver;
...
private void longRun() {
myScenario = sfl.edit(myScenario); // merge
solver.setScenario(myScenario);
solver.run();
// get the solution and persist it
}
solver.run也是一个ejb,它需要另一个ejb facade来在计算过程中向db查询一些额外的信息。让我们说在某个时刻它会做这样的事情:
visibilityFacade.getSomeInfo, if they are not present into the db, calculate them, add the to the db and give me
单独使用此方法是一项短期运行任务,可以在单个事务中执行。
问题是,arjuna在solver.run()期间由于超时而导致某些事务被终止,我无法理解实际上正在查杀的事务。我究竟做错了什么?我可以用什么来列出我的开放交易并修复它?
是否有可能在visverlityFacade的solver.run()期间打开一个新事务,并为整个run方法保持打开状态并进入超时状态?