Spring JMS 抽象框架簡化 JMS API,與 IBM WebSphere MQ 5.3 無縫整合。本文以點對點 (P2P) 系統為例,示範發送/接收簡單文本訊息。需下載源碼、Spring 框架、WebSphere MQ 5.3、Apache Ant。
org.springframework.jms.core:核心功能,JmsTemplate 處理資源建立/釋放,提供發送/同步接收/暴露 Session/Producer 回調org.springframework.jms.support:JMSException 轉非檢查異常層級org.springframework.jms.support.converter:MessageConverter Java 物件 ⇄ JMS 訊息org.springframework.jms.support.destination:JNDI 目標服務定位器等策略org.springframework.jms.connection:獨立應用適用的 ConnectionFactory、JMS 專用 PlatformTransactionManagerJmsTemplate:JMS 1.1 APIJmsTemplate102:JMS 1.0.2 API (本文採用)回調機制協調訊息傳遞:MessageCreator (建訊息)、SessionCallback (給 Session)、ProducerCallback (給 Session+Producer)。
1. JMS 模板 (spring-mqseries-jms.xml):
<bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate102">
<property name="connectionFactory"><ref bean="jmsQueueConnectionFactory"/></property>
<property name="destinationResolver"><ref bean="jmsDestinationResolver"/></property>
<property name="pubSubDomain"><value>false</value></property> <!-- P2P -->
<property name="receiveTimeout"><value>20000</value></property>
</bean>
2. 連線工廠從 JNDI 取得:
<bean id="internalJmsQueueConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiTemplate"><ref bean="jndiTemplate"/></property>
<property name="jndiName"><value>MQ_JMS_MANAGER</value></property>
</bean>
3. JNDI Template 設定 (檔案系統 FSContext):
<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<props>
<prop key="java.naming.factory.initial">com.sun.jndi.fscontext.RefFSContextFactory</prop>
<prop key="java.naming.provider.url">file:/C:/JNDI-Directory</prop>
</props>
</property>
</bean>
4. 綁定到應用 Bean:
<bean id="jmsSender" class="springexample.client.JMSSender">
<property name="jmsTemplate102"><ref bean="jmsQueueTemplate"/></property>
</bean>
<bean id="jmsReceiver" class="springexample.client.JMSReceiver">
<property name="jmsTemplate102"><ref bean="jmsQueueTemplate"/></property>
</bean>
public void sendMesage() {
jmsTemplate102.send("JMS_RequestResponseQueue",
new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage("This is a sample message");
}
});
}
send(隊列名, MessageCreator),Session 由模板提供,建立 TextMessage。
public void processMessage() {
Message msg = jmsTemplate102.receive("JMS_RequestResponseQueue");
try {
TextMessage tm = (TextMessage) msg;
if (msg != null) System.out.println("Message Received -->" + tm.getText());
} catch (Exception e) { e.printStackTrace(); }
}
同步 receive(隊列名),等待時間由模板 receiveTimeout 控制。
mqsetup.bat (需 PATH 含 MQ bin) → 建立 QueueManager MQJMS.QManager、Queue RequestResponseQueue (MQ Explorer 可視化確認,圖 1、2)classpath.cmdJMSAdmin.config:啟用 RefFSContextFactory + file:/C:/JNDI-DirectoryC:/JNDI-Directory,跑 JMSAdmin 批次檔輸入:def qcf(MQ_JMS_MANAGER) qmgr(MQJMS.QManager)def q(JMS_RequestResponseQueue) qmgr(MQJMS.QManager) queue(RequestResponseQueue)
圖 1:QueueManager 配置

圖 2:Request/Response 隊列
c:\spring-framework-1.2-rc2)c:\SpringSeriesPart4JMS,複製 spring.jar、commons-logging.jar、MQ 所有 jar 到專案 libant -f build-jmssender.xml → 編譯運行 SendMQSpringJMS,裝載 Spring 配置、取得 jmsSender Bean、發送訊息ant -f build-jmsreceiver.xml → 編譯運行 ReceiveMQSpringJMS,控制台輸出:Message Received --> This is a sample message.Spring JMS 模板讓 MQ 訊息收發化繁為簡:配置 JNDI 連線工廠/目標解析器 → 注入 JmsTemplate → 回調發送/同步接收。雖示例簡單,步驟可擴展至複雜企業應用。Spring 系列至此完結,更多細節請參考官方文檔。