繁体   English   中英

Java EE中的异步执行

[英]Asynchronous execution in Java EE

我正在学习Java EE(从SE迁移),我对Java EE环境中的异步执行感到困惑。
基本上我理解创建ThreadTimer并不是完全建议的。 到目前为止我发现的另一种方法是使用JMS将消息传递给EJB Message Bean,它将以异步方式执行。

有哪些其他方法可以实现此行为? 使用JMS的原因看起来对于简单任务来说太多开销。

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

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

作为旁注 - 在Servlet中,您也可以使用异步执行。

您可以使用spring任务执行程序

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

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

这一切都取决于任务的重要性以及您愿意做的努力。

对于不那么重要的任务,简单的线程通常会做到这一点。

基本上,异步行为是通过线程实现的,没有解决这个问题。

但是,在Java EE环境中,自己打开线程被认为是一种不好的做法。 很可能你会想要使用你的服务器工具,它会为你提供一个(适当的)托管环境来做异步工作。

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

是的,如果你必须,你总是可以产生一个Thread并忘掉它。 只要确保你知道你在做什么。

这一切都归结为您的确切用例,以及您的环境支持的方法。 没有一个真正的答案。

Java EE 6和Spring爱好者已经说过了; 不知何故,每个人都从Java EE 5中取消了javax.ejb.TimerService ,我猜想,目前[截至2011年]是主流平台。

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

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

就是这样。 仅仅为了它的异步性而使用JMS从来就不是一个好的选择,除非在很久以前就像在J2EE中一样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM