我需要 Web/JavaEE 容器中的线程来从外部源获取信息并在同一 JVM 中完成相应的 AsyncContext obj。
我希望有一个零延迟解决方案,因此排除了定期轮询或计时器。
我可以启动一个线程,但我相信它在 Web 容器中不受欢迎并且不可移植。Q1。是否可以在 Java EE 容器中可移植地运行线程?
Q2。如果我想在 Web 容器中运行一个线程,那么“最不邪恶”的方式是什么? 初始化上下文?执行服务?线程运行?
谢谢!
我需要 Web/JavaEE 容器中的线程来从外部源获取信息并在同一 JVM 中完成相应的 AsyncContext obj。
我希望有一个零延迟解决方案,因此排除了定期轮询或计时器。
我可以启动一个线程,但我相信它在 Web 容器中不受欢迎并且不可移植。Q1。是否可以在 Java EE 容器中可移植地运行线程?
Q2。如果我想在 Web 容器中运行一个线程,那么“最不邪恶”的方式是什么? 初始化上下文?执行服务?线程运行?
谢谢!
AsyncContext.html#start可能是你能得到的最接近的。
您可以使用 jsr237 中的工作管理器在 Java EE 容器中创建线程。: http: //jcp.org/en/jsr/detail ?id=237 。如果你想要一个异步作业,你应该使用 JMS。
在 Java EE 6 中,您可以将@Asynchronous
注释放在 EJB 方法上,以使该方法中的工作由特殊的线程池处理:
@Stateless
public class SomeBean {
@Asynchronous
public void doSomething() {
// ...
}
}
然后在其他地方,注入这个 bean 并调用该doSomething()
方法。控制将立即返回。
@WebServlet("/test")
public class SyncServlet extends HttpServlet {
@EJB
private SomeBean someBean;
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
someBean.doSomething();
}
}
请注意,您可能不需要像AsyncContext asyncContext = request.startAsync()
这里这样的东西。仅当异步代码仍需要向响应发送某些内容时,您才会使用它。
如果您需要类似于周期计时器的东西,而不是响应请求,您可以在单例中使用计时器服务:
@Startup
@Singleton
public class SomeTimerBean {
@Schedule(hour = "*", minute = "*/30", second = "0", persistent = false)
public void doStuff() {
// ...
}
}
除了定期运行,您还可以使用@TimeOut
注释运行一次这样的事情:
@Startup
@Singleton
public class SomeTimerBean {
@Resource
private TimerService timerService;
@Postconstruct
public void init() {
timerService.createSingleActionTimer(0, new TimerConfig(null, false));
}
@Timeout
public void doStuff(Timer timer) {
// ...
}
}
您可以对此进行变体,例如SomeTimerBean
,也可以调用其他@Asynchronous
bean 中的方法以基本上具有相同的效果。