javaee中的异步执行

javaee中的异步执行,java,jakarta-ee,asynchronous,ejb,jms,Java,Jakarta Ee,Asynchronous,Ejb,Jms,我目前正在学习Java EE(从SE开始学习),对Java EE环境中的异步执行感到困惑。 基本上,我所理解的创建线程或计时器并不完全是推荐的。到目前为止,我发现的另一种方法是使用JMS将消息传输到EJB消息Bean,它将异步执行 实现这种行为的其他方法有哪些?因为对于简单任务来说,使用JMS看起来开销太大。您可以使用 其他作业可能将其放入数据库并执行轮询数据库的任务 对于大型应用程序,您甚至可以考虑使用企业服务总线。 这完全取决于任务的重要性以及你愿意做什么 对于不太重要的任务,简单的线程通常

我目前正在学习Java EE(从SE开始学习),对Java EE环境中的异步执行感到困惑。
基本上,我所理解的创建
线程
计时器
并不完全是推荐的。到目前为止,我发现的另一种方法是使用JMS将消息传输到EJB消息Bean,它将异步执行

实现这种行为的其他方法有哪些?因为对于简单任务来说,使用JMS看起来开销太大。

您可以使用

其他作业可能将其放入数据库并执行轮询数据库的任务

对于大型应用程序,您甚至可以考虑使用企业服务总线。

这完全取决于任务的重要性以及你愿意做什么


对于不太重要的任务,简单的线程通常可以做到这一点。

基本上,异步行为是通过线程实现的,这是无法回避的

然而,在JavaEE环境中,自己打开线程被认为是一种不好的做法。最有可能的情况是,您希望使用服务器的功能,为您提供一个(正确)管理的环境来执行异步操作

JMS是执行异步任务的一种方法,对于需要连续处理的任务流,我建议使用JMS。大多数Java应用程序服务器都有调度管理器,允许您在将来调度单个任务(例如通过quartz)。一些框架还支持
@javax.ejb.Asynchronous
的JavaEE6注释

是的,如果必须的话,您总是可以生成一个
线程
,然后将其全部忘掉。确保你知道你在做什么


这一切归结为您的确切用例是什么,以及您的环境支持哪些方法。没有一个答案是正确的。

JavaEE6中最简单的解决方案是在EJB方法(或整个类)上使用注释。它允许您异步调用业务方法,这意味着将委派一个新线程来执行此方法,并且您将在调用方方法中获得控制权

在Java EE之前的6天中,JMS被用于此目的


另外,您还可以使用异步执行;不知何故,每个人都放弃了JavaEE5中的
javax.ejb.TimerService
,我冒昧地猜测,它目前[截至2011年]是主要的平台

基本上,您将
TimerService
注入无状态或消息驱动bean中,并使用其
createTimer(…)
方法之一来调度异步执行。然后在带注释的方法中实现超时逻辑:

@Timeout
void anyMethod(javax.ejb.Timer timer) { ... }

就这样。仅为了异步性质而使用JMS从来都不是一个好的选择,除非早在J2EE中就有了。

我想我明白你的意思了:TimerService从EJB2.1和J2EE1.4开始就可用,所以在JavaEE6之前,TimerService是异步执行相对于JMS的合理选择。我不确定你所说的“仅仅为了异步特性而使用JMS从来都不是一个选项”,除非你是说“从来都不是一个好的选项”。无论如何,我很高兴@Asynchronous现在可以使用了,因为JMS和TimerService都包含了我们不需要的特性来解决这个特定问题;答案是3岁,我只模糊地记得我的想法。无论如何,我需要回复Arjan Tijms的一个更改,因为他更改了我帖子的含义。