JMS (Java Message Service) 是 Java EE 標準消息交換 API,支援異步、可靠、松耦合的分布式通信。核心組件:
start() 啟動接收。| 模型 | 核心概念 | 特點 |
|---|---|---|
| 點對點 (P2P) | Queue | 一條消息僅一個消費者;多消費者競爭;FIFO;發送者無需知曉接收者 |
| 發布/訂閱 (Pub/Sub) | Topic | 一條消息多個訂閱者收到;基於主題;不保證順序;適合廣播 |
JMS 規範不強制提供者同時實現兩種模型,但主流產品(IBM MQSeries, WebLogic, SonicMQ, ActiveMQ 等)均雙支援。
MDB 實現 MessageDrivenBean + MessageListener,無 Remote Interface,僅通過消息交互。容器自動管理生命周期與實例池。缺點:單 MDB 僅能監聽一個 Destination。
public class SimpleSender {
public static void main(String[] args) { new SimpleSender(); }
public SimpleSender() {
try {
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
props.put(Context.URL_PKG_PREFIXES, "org.jnp.interfaces");
props.put(Context.PROVIDER_URL, "localhost");
Context ctx = new InitialContext(props);
QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("UIL2ConnectionFactory");
Queue queue = (Queue) ctx.lookup("queue/testQueue");
QueueConnection conn = factory.createQueueConnection();
QueueSession session = conn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
TextMessage msg = session.createTextMessage();
QueueSender sender = session.createSender(queue);
conn.start();
for (int i=0; i<10; i++) {
msg.setText("Hello World #" + i);
sender.send(msg);
}
conn.close(); ctx.close();
} catch (Exception e) { e.printStackTrace(); }
}
}
public class SyncReceiver {
public static void main(String[] args) { new SyncReceiver(); }
public SyncReceiver() {
try {
// JNDI 查找同上...
QueueReceiver receiver = session.createReceiver(queue);
conn.start();
for (int i=0; i<10; i++) {
TextMessage msg = (TextMessage) receiver.receive(); // 阻塞等待
System.out.println("Got: " + msg.getText());
}
conn.close(); ctx.close();
} catch (Exception e) { e.printStackTrace(); }
}
}
實現 MessageListener,重寫 onMessage(Message msg),註冊 consumer.setMessageListener(listener),容器自動回調。
典型應用:工作流、訂單處理、金融交易、即時通知系統。