在 SOA 架構中,許多業務流程本質上是非同步的:
| 步驟 | 傳統 JMS | Spring JMS |
|---|---|---|
| 1 | 建立 JNDI InitialContext | 配置 Spring Context,注入 JmsTemplate |
| 2 | 查詢 ConnectionFactory | |
| 3 | 查詢 Queue/Topic | |
| 4 | 建立 Session | |
| 5 | 建立 Sender/Receiver | |
| 6 | 發送/接收訊息 ← 核心業務 | 專注於訊息處理邏輯 |
| 7 | 關閉所有資源 | 容器自動管理生命週期 |
DynamicDestinationResolverSimpleMessageConverter 支援 String→TextMessage、byte[]→BytesMessage、Map→MapMessage、Serializable→ObjectMessageCreditRequestSendQueueCreditRequestReceiveQueue<!-- JNDI 模板 -->
<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<props>
<prop key="java.naming.factory.initial">org.jnp.interfaces.NamingContextFactory</prop>
<prop key="java.naming.provider.url">localhost</prop>
<prop key="java.naming.factory.url.pkgs">org.jnp.interfaces:org.jboss.naming</prop>
</props>
</property>
</bean>
<!-- 連線工廠 -->
<bean id="jmsQueueConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiTemplate" ref="jndiTemplate"/>
<property name="jndiName" value="UIL2ConnectionFactory"/>
</bean>
<!-- 發送/接收佇列 -->
<bean id="sendDestination" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiTemplate" ref="jndiTemplate"/>
<property name="jndiName" value="queue/CreditRequestSendQueue"/>
</bean>
<!-- JmsTemplate -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate102">
<property name="connectionFactory" ref="jmsQueueConnectionFactory"/>
<property name="defaultDestination" ref="sendDestination"/>
<property name="receiveTimeout" value="30000"/>
</bean>
<!-- 發送者/接收者 Bean -->
<bean id="jmsSender" class="com.example.JMSSender">
<property name="jmsTemplate" ref="jmsTemplate"/>
</bean>
// 傳統 JMS:超過 50 行樣板代碼
public void sendMessage() { /* JNDI lookup, create connection/session/sender, send, finally close */ }
// Spring JMS:核心業務邏輯只需數行
public class JMSSender {
private JmsTemplate jmsTemplate;
public void sendMessage(LoanApplication app) {
jmsTemplate.convertAndSend(app); // 自動轉換為 ObjectMessage
}
}
圖形化介面管理 JMS 資源:建立/瀏覽佇列、檢視訊息內容、監控佇列深度。支援 JBossMQ、WebSphere MQ、ActiveMQ 等主流 Broker。
Spring JMS 透過 IOC 容器管理資源生命週期、樣板代碼封裝、異常轉換(Unchecked),讓開發者專注於業務邏輯。配合 HermesJMS 監控,構建可維護、可擴展的非同步系統輕而易舉。