JMS集群通過消息負載均衡與故障轉移提升系統並發處理能力。本文詳述基於JBoss 4.x的三步配置流程:數據庫持久化、分佈式JNDI、JMS集群化,並包含消息驅動Bean集群部署實戰。
JBoss 3.2+僅支持數據庫持久化(官方稱文件模式不可靠)。以Oracle 9.2為例:
doc/examples/jca/oracle-ds.xml至server/all/farm,修改連接參數GlobalDS複製doc/examples/jms/oracle-jdbc3-service.xml至server/all/deploy-hasingleton/jms,刪除hsqldb-jdbc2-service.xml,修改oracle-jdbc3-service.xml第56行:
<attribute name="DataSource">GlobalDS</attribute>
啟動run -c all後,Oracle將自動建立三張表:
JMS_MESSAGE_LOG:點對點消息(MessageID, Destination, TXID, TXOP, MessageBlob)JMS_REFERENCE_LOG:Topic消息(含Redelivered標記)JMS_TRANSACTION_LOG:事務日誌JBoss集群JNDI採用分佈式Singleton模式:
為防單點丟失Queue綁定,建議每個節點的server/all/deploy-hasingleton/jms/JBossmq-destinations-service.xml均添加:
<mbean code="org.jboss.mq.server.jmx.Queue"
name="jboss.mq.destination:service=Queue,name=test">
<depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
</mbean>
默認配置不支持MDB集群,需:
cdot-jbossx.jar放入server/all/deploy/jmspublic class TestJmsBean implements MessageDrivenBean, MessageListener {
public void ejbCreate() { System.out.println("MDB創建"); }
public void ejbRemove() {}
public void onMessage(Message msg) {
try { System.out.println("收到消息: " + msg.getJMSMessageID()); }
catch (Exception e) { e.printStackTrace(); }
}
public void setMessageDrivenContext(MessageDrivenContext ctx) { this.ctx = ctx; }
}
deploy-hasingleton目錄確保服務僅在Master節點啟動,避免重複消費完成上述配置後,即擁有具備消息持久化、負載均衡、故障轉移能力的企業級JMS集群。