Java JBOSS EAP 6被阻止在异步方法之后调用ejb方法

Java JBOSS EAP 6被阻止在异步方法之后调用ejb方法,java,multithreading,jboss7.x,Java,Multithreading,Jboss7.x,我有一个无状态bean,它使用其他bean的异步方法(本地注入)插入一些数据。此数据插入需要一段时间,因此我不等待完成此操作。在这个数据插入之后,我调用同一bean的另一个方法。当我将调试点放到方法中时,服务器会等待大约90秒来达到该点。可能是Jboss等待事务完成的异步方法。我不知道发生了什么事 @Stateless public class SimulationNodePersistenceBean implements SimulationNodePersistenceRemote,

我有一个无状态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。这是异步工作的

    getSimulationEJB().persistSimulationResults(id, tsaParser.getLstFile().getGraphArray());
调用此方法后,我调用SimulationNodePersistenceBean的另一个方法。此方法等待几分钟

getSimulationEJB().calculateSimIndex(contSimId);
我已经使用jstack创建了一个线程转储。实际上我在JBossAS6中没有这个问题。我将我的应用程序迁移到Jboss EAP 6。4.可能我需要在配置中进行一些配置更改。但我不知道该怎么办


我检查了线程转储。我没有发现任何处于阻塞状态的线程。我是否应该寻找其他关键字?

正如我在评论中指出的,您正在混合调用异步和同步方法。在您的示例中,您正在从persistSimulationResults方法(这是一个同步方法,因为您已经注释掉了上面的异步注释)调用addResultGraphsToDatabase方法(这是一个异步方法)。因此,现在addResultGraphsToDatabase方法的行为就像一个同步方法,尽管有异步注释

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

在班级一级:

@Inject
SessionContext ctx;
persistSimulationResults方法中的:

ctx.addResultGraphsToDatabase

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

正如我在评论中指出的,您混合了异步和同步方法的调用。在您的示例中,您正在从persistSimulationResults方法(这是一个同步方法,因为您已经注释掉了上面的异步注释)调用addResultGraphsToDatabase方法(这是一个异步方法)。因此,现在addResultGraphsToDatabase方法的行为就像一个同步方法,尽管有异步注释

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

在班级一级:

@Inject
SessionContext ctx;
persistSimulationResults方法中的:

ctx.addResultGraphsToDatabase

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

如果您可以提供一些示例代码(或伪代码)来说明您的问题,这将很容易理解。我通过添加代码进行了编辑,但没有看到对addResultGraphsToDatabase()方法的调用。我猜您是从persistSimulationResults()调用它。在做任何事情之前,确保它确实是异步调用的(因为您混合了异步和同步方法)。您应该记住从sessionContext调用异步方法。我只是想确定你没有犯这种常见的错误。请看这里:(看“混合同步和异步”一段)。让我知道。我为persistensİmulationResult添加了代码。我认为这是正确的?如果您可以提供一些示例代码(或伪代码)来说明您的问题,这将很容易理解。我通过添加代码进行了编辑,但我没有看到对addResultGraphsToDatabase()方法的调用。我猜您是从persistSimulationResults()调用它。在做任何事情之前,确保它确实是异步调用的(因为您混合了异步和同步方法)。您应该记住从sessionContext调用异步方法。我只是想确定你没有犯这种常见的错误。请看这里:(看“混合同步和异步”一段)。让我知道。我为persistensİmulationResult添加了代码。我认为这是正确的?谢谢你的回答。我是否应该将persistSimulationResult方法定义为异步方法?因为从内部调用的其他方法不应异步工作,所以我已尝试使用context.getBusinessObject(SimulationNodePersistenceBean.class).addResultGraphsToDatabase(OrtensionSimulationId,graphList);;调用addResultGraphsToDatabase方法;。它抛出非法状态例外请发布stacktrace的前几行以便我能够帮助您。谢谢您的回复。我是否应该将persistSimulationResult方法定义为异步方法?因为从内部调用的其他方法不应异步工作,所以我已尝试使用context.getBusinessObject(SimulationNodePersistenceBean.class).addResultGraphsToDatabase(OrtensionSimulationId,graphList);;调用addResultGraphsToDatabase方法;。它抛出非法状态例外请发布stacktrace的前几行,以便我能够帮助您。