我在兩個節點(「主機-1」和「主機-2」)的域模式下運行JBoss Wildfly 8.1.0.Final並需要發送消息一個節點到集羣中的所有節點,以便對它們執行特定的操作。發送消息的客戶端和消息接收者應位於相同的EAR中。發送消息到JBoss集羣域中的所有節點
由於到目前爲止問題尚未得到答覆和未註釋,我將把問題分解成更簡單的部分。請隨時回答或評論一個子集,以便我可以進一步調查。
我正確地認爲這是一個消息驅動bean的有效用例嗎?如果不是,爲什麼?在這種情況下,問題的其餘部分可能毫無意義。
我在JBoss集羣的域控制器「host-1」的
domain.xml
中創建了javax.jms.Topic
。原則上正確嗎?打算髮送消息的客戶端通過JNDI查找
Topic
和ConnectionFactory
(而不是例如注入它)。這是正確的方法嗎?要接收消息的MDB配置爲通過
@ActivationConfigProperty
來收聽Topic
。正確?
上述設置在本地工作,即消息僅由發送它的節點接收。它不被其他節點接收。發送消息的客戶端代碼是由WAR觸發的,並且該消息由同一EAR中的EJB模塊中的MDB接收。
我不確定我們是否需要RemoteConnectionFactory
或者我們是否需要使用不同的方法來查找主題(目前注入MDB並由客戶端查找爲java:/jms/rmcTopic
),因爲它實際上是在遠程主機上定義的。
這是我在domain.xml中的主題。我知道<clustered>
標記已被棄用,但我無法找到有關Wildfly 8.1如何完成的最新文檔。
<subsystem xmlns="urn:jboss:domain:messaging:2.0">
<hornetq-server>
<clustered>true</clustered>
<cluster-user>hornetqcluster</cluster-user>
<cluster-password>hornetqcluster</cluster-password>
<!-- ... -->
<jms-connection-factories>
<!-- ... -->
<connection-factory name="RemoteConnectionFactory">
<connectors>
<connector-ref connector-name="http-connector"/>
</connectors>
<entries>
<entry name="java:jboss/exported/jms/RemoteConnectionFactory"/>
</entries>
</connection-factory>
</jms-connection-factories>
<!-- ... -->
<jms-destinations>
<!-- ... -->
<jms-topic name="rmcTopic">
<entry name="java:/jms/rmcTopic"/>
</jms-topic>
</jms-destinations>
</hornetq-server>
</subsystem>
的MDB被打包爲一個EAR EJB模塊,以及MDB註解是:
@MessageDriven(name = "ConfigurationMDB", activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),
@ActivationConfigProperty(propertyName = "destination", propertyValue = "java:/jms/rmcTopic"),
@ActivationConfigProperty(propertyName = "connectionFactoryJndiName", propertyValue = "RemoteConnectionFactory"),
@ActivationConfigProperty(propertyName = "addressList", propertyValue = "host-1"),
@ActivationConfigProperty(propertyName = "useSharedSubscriptionInClusteredContainer", propertyValue = "false") })
public class ConfigurationMDB implements MessageListener
日誌輸出表明useSharedSubscriptionInClusteredContainer
和connectionFactoryJndiName
不支持,但同樣我讓他們作爲參考,我的失敗嘗試:-)
發送所述消息是WAR中在相同的EAR的代碼:
Context ic = new InitialContext();
ConnectionFactory cf = (ConnectionFactory) ic.lookup("java:jboss/exported/jms/RemoteConnectionFactory");
Topic topic = (Topic) ic.lookup("java:/jms/rmcTopic");
Connection connection = cf.createConnection("hornetqcluster", "hornetqcluster");
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer publisher = session.createProducer(topic);
connection.start();
TextMessage message = session.createTextMessage("Test");
publisher.send(message);
任何幫助,非常感謝。
我也會有興趣的任何方式使這個問題更清晰或更容易回答,因爲它還沒有得到任何關注。 – 2014-09-29 15:54:40