我有一个无状态bean,它使用其他bean的异步方法(本地注入)插入一些数据。这个数据插入需要一些时间,所以我不等待完成此操作。插入此数据后,我正在调用同一个bean的另一个方法。当我将调试点放到方法时,服务器等待大约90秒才能达到此点。可能是Jboss等待事务完成异步方法。我不知道发生了什么事。 。
@Stateless
public class SimulationNodePersistenceBean implements SimulationNodePersistenceRemote, SimulationNodePersistenceLocal {
@Resource
SessionContext context;
@EJB
private SimulationResultGraphPersitenceBean graphPersistenceBean;
@Asynchronous
@TransactionAttribute(TransactionAttributeType.REQUIRED)
private void addResultGraphsToDatabase(long id, Graph[] graphList) {
ResultGraph paramGraph;
ResultGraphPoint dataPoint;
Graph graph;
for (int i = 0; i < graphList.length; i++) {
graph = graphList[i];
paramGraph = new ResultGraph();
try {
graphPersistenceBean.persistGraph(paramGraph);
} catch (Exception databaseException) {
// TODO add error message to the contingency simulation messages
// list
logger.error("Error saving ResultGraph:" + paramGraph);
}
}
long duration = System.nanoTime() - startTime;
logger.debug("Graphs inserted to DB in (sec) :" + (duration / NANO_SECOND_CONVERSION_FACTOR));
}
// @Asynchronous
public void persistSimulationResults(long contingencySimulationId, Graph[] graphList,
List<AB> reiList) {
if (graphList != null) {
addResultGraphsToDatabase(contingencySimulationId, graphList);
}
if (reiList != null) {
//another method
}
calculateContSimStability(contingencySimulationId);
}
@Override
public void calculateSimIndex(long id) {
}
这是从主bean调用的其他bean
@Stateless
public class SimulationResultGraphPersitenceBean {
@PersistenceContext(unitName = "DBService")
private EntityManager em;
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
@Asynchronous
public void persistGraph(ResultGraph graph) throws SiGuardPersistenceException {
try {
ResultGraphService service = new ResultGraphService(em);
service.create(graph);
em.flush();
} catch (Exception ex) {
throw new PersistenceException("Error persisting graph", ex);
}
}
这是客户端调用主bean。这是异步工作。
getSimulationEJB().persistSimulationResults(id, tsaParser.getLstFile().getGraphArray());
调用此方法后,我调用另一个SimulationNodePersistenceBean方法。此方法等待几分钟。
getSimulationEJB().calculateSimIndex(contSimId);
我使用jstack创建了一个线程转储。实际上我在Jboss As 6中没有这个问题。我将我的应用程序迁移到Jboss EAP 6. 4.可能我需要在配置中进行一些配置更改。但我不知道该怎么办。
我检查了线程转储。我在BLOCKING状态下找不到任何线程。我应该寻找其他关键字吗?
答案 0 :(得分:2)
正如我在评论中已经指出的那样,您正在混合调用异步和同步方法。在您的示例中,您从persistSimulationResults方法(这是一个synch方法)调用addResultGraphsToDatabase方法(这是一个Asynch方法) - 因为您已在其上注释掉异步注释。因此,现在尽管有异步注释,addResultGraphsToDatabase方法的行为类似于Synchronous方法。
我不确定您是否查看了我在评论中发布的链接,但您需要使用SessionContext调用Asynch方法。像这样:
在班级:
@Inject
SessionContext ctx;
,在persistSimulationResults方法中:
ctx.addResultGraphsToDatabase
有关更详细的示例,请查看我在评论中发布的链接。