首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Tomcat + JNDI + ActiveMQ 實現 JMS 點對點消息隊列完整教程

     編輯:Java 綜合教學

Tomcat + JNDI + ActiveMQ 實現 JMS 點對點消息隊列完整教程

採用 JNDI 查找 JMS 資源,而非硬編碼 ActiveMQ API,使應用遵循 JMS 規範,可無縫切換消息中間件(HornetQ、RabbitMQ 等)。

架構圖解

Tomcat (JNDI 容器) ←→ JNDI 名稱綁定 ←→ ActiveMQ (JMS Provider) ←→ Web 應用

步驟一:Tomcat 配置 JNDI 資源

編輯 $CATALINA_BASE/conf/context.xml,添加連接工廠與隊列定義:

<Resource name="queue/connectionFactory" 
          auth="Container"
          type="org.apache.activemq.ActiveMQConnectionFactory"
          description="JMS Connection Factory"
          factory="org.apache.activemq.jndi.JNDIReferenceFactory"
          brokerURL="tcp://localhost:61616"
          brokerName="LocalActiveMQBroker" />

<Resource name="queue/queue0" 
          auth="Container"
          type="org.apache.activemq.command.ActiveMQQueue"
          description="My Queue"
          factory="org.apache.activemq.jndi.JNDIReferenceFactory"
          physicalName="TomcatQueue" />

步驟二:啟動 ActiveMQ

cd $ACTIVEMQ_HOME/bin
./activemq start  # Windows: activemq.bat start

訪問 https://localhost:8161/admin 查看隊列狀態(默認用戶/密碼 admin/admin)。

ActiveMQ 管理控制台

步驟三:Web 工程依賴

核心 JAR:activemq-all-x.x.x.jar、spring-jms.jar、javax.jms-api.jar、Tomcat 容器提供的 javax.naming、javax.servlet。

步驟四:消息生產者 Servlet

@WebServlet("/Send")
public class Send extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
            throws ServletException, IOException {
        PrintWriter out = resp.getWriter();
        try {
            InitialContext ctx = new InitialContext();
            
            // JNDI 查找(注意 java:comp/env/ 前綴)
            Queue queue = (Queue) ctx.lookup("java:comp/env/queue/queue0");
            QueueConnectionFactory factory = (QueueConnectionFactory) 
                ctx.lookup("java:comp/env/queue/connectionFactory");
            
            // 標準 JMS 流程
            QueueConnection conn = factory.createQueueConnection();
            QueueSession session = conn.createQueueSession(false, Session.DUPS_OK_ACKNOWLEDGE);
            QueueSender sender = session.createSender(queue);
            sender.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
            
            TextMessage msg = session.createTextMessage("Hello World");
            sender.send(msg);
            
            out.write("Message Sent: " + msg.getText());
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

步驟五:消息消費者 Servlet

@WebServlet("/Receive")
public class Receive extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
            throws ServletException, IOException {
        PrintWriter out = resp.getWriter();
        try {
            InitialContext ctx = new InitialContext();
            Queue queue = (Queue) ctx.lookup("java:comp/env/queue/queue0");
            QueueConnectionFactory factory = (QueueConnectionFactory) 
                ctx.lookup("java:comp/env/queue/connectionFactory");
            
            QueueConnection conn = factory.createQueueConnection();
            QueueSession session = conn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
            QueueReceiver receiver = session.createReceiver(queue);
            
            conn.start(); // 必須啟動連接才能接收
            TextMessage msg = (TextMessage) receiver.receive(); // 阻塞等待
            
            out.write("Message Received: " + msg.getText());
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

驗證流程

  1. 部署 Web 應用至 Tomcat
  2. 訪問 /Send → 返回 "Message Sent: Hello World",ActiveMQ 控制台隊列消息數 +1
  3. 發送後隊列狀態
  4. 訪問 /Receive → 返回 "Message Received: Hello World",隊列消息被消費消失
  5. 消費後隊列狀態

關鍵點總結

  • JNDI 名稱統一前綴 java:comp/env/(Java EE 標準)
  • 生產者 Session.DUPS_OK_ACKNOWLEDGE、消費者 Session.AUTO_ACKNOWLEDGE 確認模式可根據業務調整
  • 連接、會話、發送者/接收者屬於資源,用完必須 close(),建議用 try-with-resources
  • 生產環境建議配置連接池 (PooledConnectionFactory)、持久化消息、死信隊列

參考資源

HowToDoInJava JMS Point-to-Point Example

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved