【问题标题】:JMS Producer-Consumer-Observer (PCO)JMS 生产者-消费者-观察者 (PCO)
【发布时间】:2012-05-18 20:29:52
【问题描述】:

在 JMS 中有队列和主题。据我了解,到目前为止,队列最适合用于生产者/消费者场景,其中主题可用于发布/订阅。但是在我的场景中,我需要一种方法来结合这两种方法并创建一个生产者-消费者-观察者架构。

特别是我有生产者写入一些队列和工作人员,它们从这些队列中读取并处理这些队列中的消息,然后将其写入不同的队列(或主题)。每当工作人员完成一项工作时,我的 GUI 应该被通知并更新其当前系统状态的表示。由于工人和 GUI 是不同的进程,我不能应用简单的观察者模式或直接通知 GUI。

结合使用队列和/或主题来实现这一点的最佳方式是什么? GUI 应该总是被通知,但它不应该从队列中消耗任何东西?

我想直接用 JMS 解决这个问题,而不是使用任何额外的技术,如 RMI 来实现观察者部分。

举一个更具体的例子:

  1. 我有一个包裹队列 (PACKAGEQUEUE),由机器生产 (PackageProducer)
  2. 我有一个工人从PACKAGEQUEUE 中取出一个包裹,添加一个地址,然后将其写入MAILQUEUE (AddressWorker)
  3. 另一个工作人员处理 MAILQUEUE 并通过邮件 (MailWorker) 发送包裹。
  4. 在第 2 步之后,当向MAILQUEUE 写入消息时,我想通知 GUI 并更新包的状态。当然 GUI 不应该消费 MAILQUEUE 中的消息,只有 MailWorker 必须消费它们。

【问题讨论】:

    标签: jms producer-consumer


    【解决方案1】:

    您可以将队列和主题组合用于您的解决方案。

    您的 GUI 应用程序可以订阅一个主题,例如 MAILQUEUE_NOTIFICATION。每次(即在第 2 步)PackageProducer 将消息写入MAILQUEUE,该消息的副本应发布到MAILQUEUE_NOTIFICATION 主题。由于 GUI 应用程序已订阅该主题,它将获得包含包状态信息的发布。可以使用该出版物的内容更新 GUI。

    HTH

    【讨论】:

    • 谢谢,还有一个问题:是否总是需要结合使用队列和主题,或者我可以例如将MAILQUEUE 更改为MAILTOPIC,然后同时订阅 GUI 和 MailWorker ?有什么我目前没有看到的影响吗?
    • 没有必要。您可以使用主题而不是队列,并且 GUI 和 MailWorker 都订阅该主题。在您的解决方案中,MailWorker 将处理消息,而 GUI 将只查看消息。 MailWorker 必须创建一个持久订阅,因为即使它没有运行它也不应该错过发布。对于 GUI,您可以选择订阅类型。
    • 我明白了,所以要注意的是,如果我将 GUI 和 Worker 都订阅到一个主题,并且其中一个没有运行,那么消息就会丢失。虽然使用单独的主题和队列,但不会发生这种情况。对吗?
    • 不,没有问题。您可以为 GUI 和 Worker 创建持久订阅,这样消息就不会丢失。我建议您根据是否需要通知 GUI 发送给 Worker 的所有消息或所有通知来为 GUI 选择适当的订阅(持久或非持久)。看起来 GUI 需要收到所有消息的通知。您可以对 GUI 和 worker 使用持久订阅。希望这可以澄清。
    • 是的,它澄清了这一点。非常感谢。
    猜你喜欢
    • 2018-03-07
    • 2017-07-13
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多