JMS 是企業整合常用技術,ActiveMQ 是優秀開源實作。但傳統模式下,發送端需手動建構 Message 物件、設定屬性、序列化物件;接收端需 MessageListener 解析、類型轉換、錯誤處理。這不僅違背面向物件設計,更導致大量樣板代碼散落於業務邏輯中。
Lingo 是開源框架,核心價值在於自動處理訊息封裝與解封裝,讓開發者專注業務物件傳遞,無需關心 JMS 細節。結合 Spring JmsTemplate,可極大簡化代碼結構。
public class Hello implements Serializable {
private String id;
private Hello hello; // 巢狀物件
private PointList pointList; // 複雜集合
// getter/setter 略
}
public class SpringTest extends AbstractDependencyInjectionSpringContextTests {
protected String[] getConfigLocations() {
return new String[]{"file:D:\\wosame\\test\\com\\wosame\\room\\jms\\jms.xml"};
}
public void testSendMessage() throws Exception {
JmsTemplate jmsTemplate = (JmsTemplate) applicationContext.getBean("jmsTemplate");
jmsTemplate.send(new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
ObjectMessage message = session.createObjectMessage();
Hello hello = new Hello();
hello.setId("test");
message.setObject(hello); // 手動序列化
return message;
}
});
}
}
public class HelloMDP implements MessageListener {
protected Log log = LogFactory.getLog(HelloMDP.class);
public void onMessage(Message message) {
try {
ObjectMessage objMessage = (ObjectMessage) message;
Hello hello = (Hello) objMessage.getObject(); // 手動反序列化與轉型
System.out.println("hello.getId() = " + hello.getId());
} catch (JMSException e) {
log.error("Parse failed", e);
}
}
}
Lingo 提供 ProxyFactory 產生業務介面代理,發送端直接呼叫代理方法,框架自動完成:
// 介面定義
public interface HelloService {
void sendHello(Hello hello);
}
// Spring 配置片段
// 發送端業務代碼
helloService.sendHello(helloObject); // 一行搞定,無 JMS API 痕跡
| 維度 | 傳統 JMS | Lingo 封裝後 |
|---|---|---|
| 業務代碼侵入性 | 高(散落 JMS API) | 零(純 POJO 呼叫) |
| 訊息序列化/反序列化 | 手動編寫 | 框架自動透明處理 |
| 異常處理 | 每處 try-catch | 統一策略配置 |
| 測試難度 | 需模擬 JMS 環境 | 可對介面 Mock 測試 |
| 遷移彈性 | 綁定 JMS 實作 | 可切換傳輸協定 |
MessageConverter引入 Lingo 後,JMS 從「訊息導向程式設計」回歸「物件導向程式設計」,是現代化企業整合架構的關鍵一步。