我想有人點我到正確的方向對於一些要求: 我們必須在我們的服務器發送異步可靠的通知 消息的消費者將訂閱/取消隨意 消費者將會很大,編號爲 生產者將是一個 即使服務器關閉,通知也不會丟失,並且如果服務器再次啓動將會被髮送。 通知數量預計很高 使用的線程數應儘可能少。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