我已经看到了这个问题的点点滴滴,但没有任何直接回答它。
这是假设的环境:
我们希望Joe和他的浏览器(可能使用Flash或HTML5或任何客户端技术)接收发布到所有20台服务器可用的JMS主题的所有消息。
以下是一个例子:
这对我来说有点模糊。
我想我有点不清楚“订阅”是什么(过程明智)以及它与集群服务器的关系。我正在使用长轮询(cometd)和websockets来帮助客户端响应接收主题消息,但是当有许多服务器可以处理连接和订阅时,必须考虑这将如何工作。我想避免服务器固定。
感谢您的任何指示。
EDIT1:希望有些澄清。我在这里提到的具体内容可以在BlazeDS框架中找到。它允许HTTP客户端订阅JMS主题并使用长轮询来实现近乎实时的客户端更新,但它要求一旦客户端命中服务器,所有请求必须返回到该服务器。所以它必须(不知何故?)在该服务器上保持该客户端的主题订阅活动。我想摆脱这个要求(使用任何技术/框架)。
答案 0 :(得分:4)
JMS服务器会跟踪每个订阅,并在持久订阅与非持久订阅之间产生差异。假设您有客户A,B,C和主题T.
消息服务器上有管理设置来控制jms服务器等待持久订阅者返回并在将消息发送到死信队列之前声明消息的时间长度或者消息的最大数量。等待订阅者回来索赔的主题。你真的需要平衡永不松散的消息与流消息以及内存或磁盘空间不足。
请注意,持久队列的概念与持久订阅者的概念不同。持久队列和主题通过在确认收到消息之前将队列和消息的内容写入磁盘来保护您免受JMS服务器的崩溃。持久订阅者是关于在客户端未连接时消息到达时消息发生的情况。
以您对SQL数据库的看法来思考JMS服务器。从Web容器的角度来看,应该有一个到JMS服务器的连接池,所以您要做的是获取与JMS服务器的连接并订阅主题。例如。
因此,如果正在使用一个主题,则必须使用选择性消费者使用该主题中的消息,请参阅http://www.eaipatterns.com/MessageSelector.html选择性消费者将执行的操作是来自符合特定条件的主题的反向消息。例如,向主题发布JMS消息的消息生成器应该包括头或称为targetUser的JMS属性或类似的东西,然后消费者可以说从AddressChangeTopic给出任何消息,其中自定义属性targetUser =“Joe”查看一些示例选择器示例Here
关键是要意识到您可以查询数据库表的方式查询队列或主题,但查询语法有限。从概念角度来看,我强烈推荐企业集成模式书http://www.amazon.ca/Enterprise-Integration-Patterns-Designing-Deploying/dp/0321200683
答案 1 :(得分:0)
Virtual Topics is exactly the solution I have been looking for.它描述了问题和解决方案(我用更简洁的词语:-)请参阅" JMS持久性主题的限制"