2012-11-20 29 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可用。