2

我需要 Web/JavaEE 容器中的线程来从外部源获取信息并在同一 JVM 中完成相应的 AsyncContext obj。

我希望有一个零延迟解决方案,因此排除了定期轮询或计时器。

我可以启动一个线程,但我相信它在 Web 容器中不受欢迎并且不可移植。Q1。是否可以在 Java EE 容器中可移植地运行线程?

Q2。如果我想在 Web 容器中运行一个线程,那么“最不邪恶”的方式是什么? 初始化上下文?执行服务?线程运行?

谢谢!

4

3 回答 3

3

AsyncContext.html#start可能是你能得到的最接近的。

于 2012-04-25T05:11:08.863 回答
1

您可以使用 jsr237 中的工作管理器在 Java EE 容器中创建线程。: http: //jcp.org/en/jsr/detail ?id=237 。如果你想要一个异步作业,你应该使用 JMS。

于 2012-04-23T09:32:23.780 回答
1

在 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,也可以调用其他@Asynchronousbean 中的方法以基本上具有相同的效果。

于 2012-04-28T09:26:08.813 回答