java - 在这种情况下,JMS 主题是否足够?或者我应该去别处看看?

标签 java jms

有一个控制实体和多个“工作”实体。控制实体向工作实体请求某些数据,它们将以自己的方式获取和返回这些数据。

由于控制实体可以不知道工作实体(并且可以随时添加/删除工作实体),因此在它们之间放置 JMS 提供程序听起来是个好主意。至少这是假设。

由于它是一对多关系( Controller -> 工作人员),因此 JMS 主题将是正确的解决方案。但是,由于控制实体取决于工作人员的返回值,因此请求/回复功能也很好(在某个地方,我读到了有关 TopicRequester 的内容,但我似乎找不到有效的示例) 。请求/回复是典型的队列功能。

为了尝试以请求/回复的方式使用主题,我创建了两个 JMS 主题:requestresponse。 Controller 发布到request主题并订阅response主题。每个工作人员都订阅request主题并发布到response主题。为了匹配请求和响应, Controller 将使用过滤器(使用 session ID 作为值)订阅对响应主题的每个请求。工作人员发布到 response 主题的消息具有与其关联的 session ID。

现在这感觉不像是一个解决方案(相反,它使用 JMS 作为锤子,并将问题(以及其他问题)视为钉子)。在这种情况下,JMS 到底是一个解决方案吗?或者还有其他我忽略的解决方案吗?

最佳答案

你的方法对我来说有点道理。我认为消息系统可以发挥作用。我认为使用主题是错误的。查看 wiki 页面 Enterprise Service Bus 。它比您需要的要复杂一些,但是您的用例的基本思想是您有一个工作人员能够从一个队列中读取数据,进行一些处理并将处理后的数据添加回另一个队列。

主题的问题在于所有工作人员都会同时收到消息,并且他们都将独立处理该主题。听起来您一次只需要一名工作人员处理每个请求。我认为您将其作为一个主题,以便不同类型的工作人员也可以监听同一队列并仅响应某些请求。为此,您最好为每种类型的工作创建一个新队列。您可能会将它们成对出现,因此您有一个 work_a_request 队列和 work_a_response 队列。或者,如果您的 Controller 能够从数据中找出响应类型,它们都可以写入单个响应队列。

如果您还没有选择消息队列供应商,我会推荐 RabbitMQ因为它很容易设置,很容易添加新队列(尤其是动态地)并且具有非常好的 Spring 支持(尽管大多数主要消息系统都有 Spring 支持,并且您甚至可能没有使用 Spring)。

我也不确定你要完成什么过滤器。如果您确保发送给工作人员的消息包含完成工作所需的所有信息,并且返回的响应消息包含 Controller 完成处理所需的所有信息,我认为您不需要它们。

关于java - 在这种情况下,JMS 主题是否足够?或者我应该去别处看看?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7493166/

相关文章:

Java:JSlider 并通过 JTextArea 获取其值

java - HSSF POI : How to know if data in cell is of Type Date?

java - Windows 注册表 : How to add a Java app to startup list?

java - 如何在运行时启用/禁用 JMS 监听器?我可以创建一个在运行时启用/禁用监听器的 api 吗?

java - 当 JMSXDeliveryCount 增加时

java - 如何避免 JMS 消息类的代码重复?

java - 将参数作为要调用的对象传递

java - 如何将 proto3 消息序列化为数组

Spring JMS MQJE001 : Completion Code '2' , 原因 '2042'

java - 如何从 JMS 队列中删除消息