当前位置: 首页 > 知识库问答 >
问题:

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

汝才良
2023-03-14

我有一个无状态bean,它使用其他bean的异步方法插入一些数据(本地注入)。此数据插入需要一段时间,所以我不等待完成此操作。在此数据插入之后,我将调用相同bean的另一个方法。当我将调试点放置到方法时,server大约要等待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) {

} 
 @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);
        }
    }
    getSimulationEJB().persistSimulationResults(id, tsaParser.getLstFile().getGraphArray());
getSimulationEJB().calculateSimIndex(contSimId);

我已经使用JStack创建了一个线程转储。实际上,我在Jboss As 6中没有这个问题。我将我的应用程序迁移到Jboss EAP6。4.可能是我需要在配置中做一些配置更改。但我不知道该怎么办。

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

共有1个答案

景凌
2023-03-14

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

我不确定您是否查看了我在注释中发布的链接,但您需要使用SessionContext调用异步方法。类似于这样:

在班级层面:

@Inject
SessionContext ctx;

在persistSimulationResults方法中:

ctx.addResultGraphsToDatabase

关于更详细的例子,请看一下我在评论中发布的链接。

 类似资料:
  • 我正试图从同步方法运行异步方法。但是我不能等待异步方法,因为我在同步方法中。我一定不理解TPL,因为这是我第一次使用它。 每个方法都需要前一个方法来完成,因为第一个方法的数据用于第二个方法。 Await运算符只能在异步方法中使用。考虑用'async'修饰符标记此方法,并将其返回类型更改为'task' 但是,如果我使用async修饰符,这将是一个异步操作。因此,如果我对的调用没有使用await运算符

  • 同步调用异步方法最安全的方法是什么?

  • 没有await并且在非异步方法中调用异步方法的行为是什么?我这样问是因为我看到Visual Studio在调用异步方法时没有显示任何警告,好像这是一件非常正常的事情。在这种情况下,异步方法的行为是否像是同步的?

  • 问题内容: 我使用的是Spring 4,我注意到了一个奇怪的行为……如果我从普通实例方法多次调用异步方法,那么它们都将在不同的线程中调用,并在随机时间完成。但是,如果我多次从另一个异步方法中调用一个异步方法,那么它们将按顺序完成。我有这样的事情: 我正在使用默认的异步执行器。我应该换一个吗?但是,该执行程序不会重用任何线程,而是每次都启动另一个线程,因此应该没问题……这仅仅是巧合吗?但是我尝试了十

  • playframework 2.2(java 7) 我有REST api,在那里接收一些json,用json数据我正在做一些事情,最后我发送电子邮件并返回结果。发送电子邮件有点慢,所以我希望在处理json后在其他线程中调用此电子邮件方法,或者我希望执行异步并返回结果,而不必等待电子邮件方法的执行。 如何在控制器中实现和调用异步方法? 下面是代码示例 编辑: 不确定它是否好,但有效。