2012-11-20 59 views
0

我想有人点我到正确的方向对于一些要求: 我们必须在我们的服务器发送异步可靠的通知 消息的消费者将订阅/取消随意 消费者将会很大,编号为 生产者将是一个 即使服务器关闭,通知也不会丢失,并且如果服务器再次启动将会被发送。 通知数量预计很高 使用的线程数应尽可能少。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是正确的解决方案),并且在我的代码中几乎没有任何东西。我希望有人给我一些指导,说明我是否在正确的轨道上,在提出的问题上尽可能多地给我提供意见,然后我可以在需要的地方提供代码以解决我剩余的问题。

+0

复杂的问题?太广泛,不能通过一个职位回答?愚蠢的问题?我从堆栈溢出中使用得并不是很好,因此有太多时间需要回答问题。 我已经完成了它,就像我上面提到的JMS一样,所以我想这个问题不是紧急的或从我这边来的。但如果有人希望得到我的支持,请告诉我,我可以分享一些信息。我不确定,但如果我遵循最佳方法。 – Alexandros

回答

1

我缺乏关于春天回答你关于IllegalStateException异常问题的知识,但我猜想它关系到MAXCONNECTIONS被设定为10

你需要的春天吗?在任何情况下,确保您的JMS Broker配置中启用了持久性,请确保使用持久队列/主题并确保在消息上使用setDurable(true)

我认为如果您想要可靠的消息传递,我一般会做出正确的决定来使用强大的JMS提供程序。您可以使用SPECjms2007基准测试各种产品,具体取决于性能对您的重要程度,也有一些results可用。