我需要Web/JavaEE容器中的一个线程从外部源获取信息,并在同一个JVM中完成相应的AsyncContext objs。
我希望有一个零加延迟的解决方案,所以定期轮询或计时器被排除在外.
我可以启动一个线程,但我相信它在Web容器中是不能移植的。Q1.可以在Java容器中以可移植的方式运行线程吗?
Q2.如果我想在网络容器中运行一个线程,那么“最不邪恶”的方式是什么呢? InitializeContext?ExecutorService?Thread.run?
谢谢!
发布于 2012-04-25 05:11:08
AsyncContext.html#start可能是你能得到的最接近的。
发布于 2012-04-23 09:32:23
您可以在jsr237中使用工作管理器在Java容器中创建线程。:http://jcp.org/en/jsr/detail?id=237。如果您想要异步作业,则应该使用JMS。
发布于 2012-04-28 09:26:08
在Java 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也可以在其他bean中调用@Asynchronous方法,从而产生基本相同的效果。
https://stackoverflow.com/questions/10276028
复制相似问题