我想有人点我到正确的方向对于一些要求: 我们必须在我们的服务器发送异步可靠的通知 消息的消费者将订阅/取消随意 消费者将会很大,编号为 生产者将是一个 即使服务器关闭,通知也不会丢失,并且如果服务器再次启动将会被发送。 通知数量预计很高 使用的线程数应尽可能少。JMS持久异步事件通知
鉴于上述(疯狂)的要求,我试图解决使用的ActiveMQ/JMS这个问题。这看起来像是正确的方向吗?
鉴于上述情况: 1.我用持久订阅和JMS消息和kahadb。 2对于jms生产者来说,解决方案看起来很简单。 3.对于消费者方面,我有麻烦。
a。虽然我有春天,但我不能使用jms:listener-container,因为我需要动态订阅和取消订阅消费者,这似乎是不可能的,所以我为每个听众创建了一个SimpleListenerContainer。这听起来不错? b。在SimpleListenerContainer中,我设置了clientId(因为这是持久所需的)
super.setSubscriptionDurable(durable);
if (durable) super.setClientId(clientId);
在这里,我有以下几点。鉴于以下配置:
<bean id="messageBusReceiverConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
<property name="maxConnections" value="10"/>
<property name="maximumActive" value="500"/>
<property name="connectionFactory" ref="jmsConnectionFactory"/>
<property name="idleTimeout" value="0"/>
</bean>
我预计将有10 * 500 = 5000并行消费者可能。如果消费者不耐用,情况就是如此。但是,对于消费者经久耐用,其中super.setClientId(的clientId)(超是SimpleMessageListenerContainer一样)时,10日连接后,我得到: org.springframework.jms.IllegalStateException:在使用连接设置clientID的是不允许的;嵌套的异常是javax.jms.IllegalStateException:不允许在使用的连接上设置clientID
所以看来我不能使用持久订阅者使用SimpleMessageListenerContainer进行会话,只能用于连接。这是真的? maxConnections = 500且maximumActive = 1是否合理?这解决了我的问题,但是......尽管对于JMS来说是新手,但对于经纪人来说这似乎过分了。
好吧,考虑到我仍然在正确的轨道,我现在需要取消我的消费/ listenr,动态,所以我做
container.stop();
container.destroy();
,其中容器是SimpleMessageListenerContainer一样。 container.destroy();抛出一些例外时被调用。是否有必要调用它或停止方法是足够的?
好吧,我知道这些问题是任意的,甚至对于知道jms的人来说也很难回答(如果jms是正确的解决方案),并且在我的代码中几乎没有任何东西。我希望有人给我一些指导,说明我是否在正确的轨道上,在提出的问题上尽可能多地给我提供意见,然后我可以在需要的地方提供代码以解决我剩余的问题。
复杂的问题?太广泛,不能通过一个职位回答?愚蠢的问题?我从堆栈溢出中使用得并不是很好,因此有太多时间需要回答问题。 我已经完成了它,就像我上面提到的JMS一样,所以我想这个问题不是紧急的或从我这边来的。但如果有人希望得到我的支持,请告诉我,我可以分享一些信息。我不确定,但如果我遵循最佳方法。 – Alexandros