JBOSS EAP 6在异步方法

时间:2016-10-18 14:52:15

标签: java multithreading jboss7.x

我有一个无状态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状态下找不到任何线程。我应该寻找其他关键字吗?

1 个答案:

答案 0 :(得分:2)

正如我在评论中已经指出的那样,您正在混合调用异步和同步方法。在您的示例中,您从persistSimulationResults方法(这是一个synch方法)调用addResultGraphsToDatabase方法(这是一个Asynch方法) - 因为您已在其上注释掉异步注释。因此,现在尽管有异步注释,addResultGraphsToDatabase方法的行为类似于Synchronous方法。

我不确定您是否查看了我在评论中发布的链接,但您需要使用SessionContext调用Asynch方法。像这样:

在班级:

@Inject
SessionContext ctx;

,在persistSimulationResults方法中:

ctx.addResultGraphsToDatabase

有关更详细的示例,请查看我在评论中发布的链接。