JSP servlet之间的通信(静态字段的替代)

时间:2012-08-24 19:07:04

标签: java jsp servlets asynchronous servlet-3.0

我正在实施一个serlvet,使用AsyncContext,可以异步地将消息发送回客户端。其他servlet需要能够为客户端排队消息,然后在浏览器通过AJAX请求消息时将其提供给客户端。

我当前的实现使用静态计时器:

private static Timer messageSender = new Timer("MessageSerlvetSender", true);

它被创建为一个守护程序线程,因此它不会使servlet容器的线程保持活动的时间超过应有的时间。其他servlet通过以下方式排队消息:

public static void write(HttpServletRequest req, MessageType type, String message) {
    try {
        synchronized (messageSender) {
            messageSender.schedule(new MessageTask(hashSession(req), type, message), MSG_DELAY_MS, MSG_TIMEOUT_MS);
        }
    } catch (IllegalStateException ex) {
        // Timer daemon thread has been canceled
        messageSender = new Timer("MessageSerlvetSender", true);
        write(req, type, message);
    }
}

MessageTask是一个runnable,它可以获取已添加到哈希映射中的AsyncContext(使用会话ID),写入消息,完成上下文,并在成功时取消任务。< / p>

这是线程安全的,并且如果守护程序线程已经死亡,则允许重新启动计时器。这个实现试图不假设任何状态符合servlet的API,但感觉......很脏。在这种情况下,最佳做法是什么?如何利用HTTP会话属性?

1 个答案:

答案 0 :(得分:0)

您可以将计时器放在ServletContext中,而不是静态字段。