我有一個需求來實現偵聽單個隊列的多個MDB偵聽器。隨着隊列上的負載增加,一個監聽器不足以處理該負載。我想知道我們可以做什麼來達到這個目標的最佳方式?在同一隊列上讀取多個MDB偵聽器
a。我可以創建類似的MDB類,並將它們部署到websphere服務器上。 b。任何其他方式使用任何配置?
您能否提供正確的方法,就好像可以動態配置偵聽器並在需要時啓用它們,或者只有一個方法實現這一點?
我有一個需求來實現偵聽單個隊列的多個MDB偵聽器。隨着隊列上的負載增加,一個監聽器不足以處理該負載。我想知道我們可以做什麼來達到這個目標的最佳方式?在同一隊列上讀取多個MDB偵聽器
a。我可以創建類似的MDB類,並將它們部署到websphere服務器上。 b。任何其他方式使用任何配置?
您能否提供正確的方法,就好像可以動態配置偵聽器並在需要時啓用它們,或者只有一個方法實現這一點?
您錯過了一個關鍵點。它是實例化一個或多個bean來處理客戶端請求的容器。整個企業bean的世界具有可擴展性作爲其關鍵點。
基本上,你不需要做任何事情,比設計和部署你的bean。容器將完成剩下的工作。
如果使用JEE規範中定義的使用@MessageDriven
批註的MDB,則由服務器容器來管理這些Bean的實際實例化和縮放。我對Websphere並不熟悉,但大多數服務器都有EJB池的概念,大致轉換爲線程池 - 讓您可以立即執行並行執行。這樣,服務器就有一組實例準備好處理隊列中的消息。每個bean實例只會在執行其onMessage
方法所需的時間內處於活動狀態,之後將被清理並返回隊列。因此,可以說,你有一個MDB池,大小爲20.如果隊列中有超過20條消息在等待,那麼服務器將用盡所有可用實例並同時處理20條消息。
例如,在Wildfly/JBoss中,您可以使用EJB子系統和相應的池設置管理您的EJB池。
<subsystem xmlns="urn:jboss:domain:ejb3:4.0">
<!--omitted for brevity... -->
<mdb>
<resource-adapter-ref resource-adapter-name="${ejb.resource-adapter-name:activemq-ra.rar}"/>
<bean-instance-pool-ref pool-name="mdb-strict-max-pool"/>
</mdb>
<pools>
<bean-instance-pools>
<strict-max-pool name="mdb-strict-max-pool" derive-size="from-cpu-count" instance-acquisition-timeout="5" instance-acquisition-timeout-unit="MINUTES"/>
</bean-instance-pools>
</pools>
<!--omitted for brevity... -->
我們在這裏指定,該消息驅動Bean應使用一個名爲mdb-strict-max-pool
從我們的系統上的CPU數量得其大小池。您還可以指定絕對值,例如max-pool-size="20"
所有這些只與您在單個服務器實例上運行隊列有關。如果你真的在做一個消息密集型應用程序,那麼你可能需要一個分佈式消息傳遞,包含專用的消息代理和多個處理實例。雖然許多服務器都支持這種場景(例如Wildfly ActiveMQ羣集),但它是另一個討論的主題。
欲瞭解更多信息看看MDB tutorial和您的服務器文件。
快樂的黑客攻擊。