【问题标题】:XPages: implementing Java PubSub subscribe with a threadXPages:使用线程实现 Java PubSub 订阅
【发布时间】:2019-10-16 08:57:10
【问题描述】:

我想在我们的 XPages 应用程序中使用发布/订阅,在 Java 中,例如与绝地武士。该应用程序在多用户设置中运行,当一个用户对文档进行一些更改时,我们希望看到这些更改反映在其他用户的屏幕上。理论上可以使用 PubSub 完成:当应用更改时,会发布“文档修改”消息并将其发送给订阅此消息的一方或多方。订阅者部分我想放在一个线程中,以便订阅的对象在收到消息时可以立即做出反应。

大多数使用 subscribe 的对象的作用域是 viewscope,当 viewscope 被销毁时它们应该被销毁。但是当对象被放弃并且订阅者线程仍然存在时会发生什么?例如,我如何告诉 JVM 线程可以被垃圾收集器安全地停止和报废?

我还没有尝试过,所以我没有可以显示的代码,但我有以下问题:

  • 我说得对,即使 viewscope 被销毁,线程还会继续运行吗?
  • 有没有办法创建垃圾回收线程?
  • 或者也许:是否有一些 API 可以在多线程 XPages 环境中执行 PubSub?

【问题讨论】:

  • 关于线程这可能值得在开始之前阅读:How to run a background task in a servlet based web application?
  • 在 JSF 2.3 中,可以使用 websockets 将来自服务器的更新推送到客户端,但我不知道这如何适合我不熟悉的 XPages。见How can server push asynchronous changes to a HTML page created by JSF?
  • 不是servlet,也不是server-client,而是server-server。 XPages 基于 JSF,尽管不是最新版本。我想通知正在运行的系统的其他部分,他们应该知道特定文档已被更改,因此他们可以相应地调整他们的行为。我已经将 Jedis 用于 Websockets,但我想在内部使用类似的东西。

标签: multithreading jsf xpages


【解决方案1】:

几年前我做过类似的事情。您可以在此处找到使用 Guava 的 Pub/Sub 示例:http://hasselba.ch/blog/?p=2158

我不确定您对订阅者线程的计划是什么 分别对你的想法有什么好处。

但要回答您的问题: 是的,一个线程会继续运行,直到您停止它。您应该使用 ExecutorService,因为它对您的管理有很大帮助。如果您想“自动”删除它,您只需执行“关闭”,然后处理所有剩余的作业并停止 ThreadPool。

如果您需要服务器范围的 Pub/Sub 系统,请考虑使用 Domino HTTP 任务自动启动/停止的 OSGi 插件。这个插件的所有对象都可以被任何应用程序使用。

【讨论】:

  • 我已经将 Jedis 用于 PubSub,主要用于服务器-客户端(浏览器)通信。是否可以在不启动线程的情况下订阅消息?可以在不丢失 NotesContext 的情况下做到这一点吗?
  • @D.Bugger:在创建自己的线程时,您将失去 NotesContext。但为什么 Pub/Sub 需要它?
  • 现在尝试不创建线程,但它有点挂起 HTTP 任务。 Jedis 不是线程安全的,所以这可能是我的问题。我想使用 PubSub,因为一个用户可以更改作为工作流应用程序一部分的文档,而另一个用户可能需要在他的屏幕上显示该信息。我想发送一条系统范围的消息,说明文档已更改,以便其他部分可以做出反应,即使它们位于其他用户的视图范围或会话范围中。
  • @D.Bugger:看看 JedisPool,它是线程安全的。对于用户 X 已更改文档 Y 的“消息”,您不需要 NotesContext。这是一个简单的 POJO。
  • java.lang.NoClassDefFoundError: org.apache.commons.pool2.PooledObjectFactory
猜你喜欢
  • 2016-03-13
  • 2012-05-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-04
  • 2014-09-03
  • 1970-01-01
  • 2017-01-12
  • 2021-12-05
相关资源
最近更新 更多