java—jsp servlet之间的通信(静态字段的替代方法)

wrrgggsh  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(344)

我正在实现一个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` 是一个能抓住 `AsyncContext` 已添加到哈希Map(使用会话id)、写入消息、完成上下文并在成功时取消任务的。
这是线程安全的,并且允许在守护进程线程死亡时重新启动计时器。这个实现尝试不假设任何状态符合servlet的api,但它感觉。。。脏兮兮的。在这种情况下,最佳做法是什么?如何利用http会话属性?
twh00eeo

twh00eeo1#

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

相关问题