Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading JavaEE5-如何在没有JMS的情况下实现异步方法调用_Multithreading_Jakarta Ee_Asynchronous_Jboss5.x - Fatal编程技术网

Multithreading JavaEE5-如何在没有JMS的情况下实现异步方法调用

Multithreading JavaEE5-如何在没有JMS的情况下实现异步方法调用,multithreading,jakarta-ee,asynchronous,jboss5.x,Multithreading,Jakarta Ee,Asynchronous,Jboss5.x,我们有一个运行在JBoss EAP 5.1上的旧应用程序,它公开了一个调用长时间运行的ejb方法的web服务,因此我们希望集成此方法调用的简单异步管理,如下所示: 当客户端调用endpoint方法时,服务器立即返回UUID,然后在单独的线程中调用业务逻辑方法。 在不使用JMS的情况下实现此的最佳方法是什么?对于EJB3.1,您可以进行方法调用。如果您稍后使用Java6o,一种可能是使用注释@Asynchronous注释您的ejb业务方法。这样,当您从web服务调用ejb时,ejb容器将立即将

我们有一个运行在JBoss EAP 5.1上的旧应用程序,它公开了一个调用长时间运行的ejb方法的web服务,因此我们希望集成此方法调用的简单异步管理,如下所示:
当客户端调用endpoint方法时,服务器立即返回UUID,然后在单独的线程中调用业务逻辑方法。

在不使用JMS的情况下实现此的最佳方法是什么?

对于EJB3.1,您可以进行方法调用。如果您稍后使用Java6o,一种可能是使用注释@Asynchronous注释您的ejb业务方法。这样,当您从web服务调用ejb时,ejb容器将立即将控制返回给WS

如果ejb方法返回一个值,事情可能会更复杂,您将需要定期检查执行状态,并在完成后获得结果。如果这是场景,请记住调用异步方法的代码必须维护对未来对象的引用


另一个选项是创建一个执行ejb方法调用的新线程。由于JEE 7(JSR 236:并发实用程序)存在创建新线程的可能性,这允许您以安全的方式在容器中运行新线程。

我建议使用消息驱动bean(MDB),并使用WebService作为将消息发送到MDB的生产者。然后MDB在其onMessage方法中调用昂贵的bean方法。这是符合EJB3.0标准的,在JBoss5.1中也是可能的

请看这里: 或对于完整规范:

您可以使用java 5的ExecutorService功能,它将提供线程池类型的实现。
您可以创建可运行对象并将其提交到线程池。可运行对象的运行方法可以调用业务方法。

如我所述,我们在JBoss EAP 5.1上使用JavaEE 5(这意味着EJB 3.0)JBoss EAP 5.1可以使用不同的java版本执行,注释javax.ejb.Asynchronous属于JavaEE 6,JBoss EAP 5.1不支持,