首頁  >  文章  >  Java  >  ActiveMQ 嵌入到Tomcat:需要掌握三個重要的知識點

ActiveMQ 嵌入到Tomcat:需要掌握三個重要的知識點

php是最好的语言
php是最好的语言原創
2018-08-03 14:34:172377瀏覽

ActiveMQ 嵌入Tomcat

在某些專案中,單獨開啟一個ActiveMQ,對於專案實作來說有時略顯繁瑣。所以我們將ActiveMQ內嵌到Tomcat,Tomcat啟動同時就順帶啟動了ActiveMQ。由此我們需要掌握三個重要的知識點
  • ActiveMQ中的BrokerService

  • 自啟動Servlet配置

  • 使用jconsole了解嵌入ActiveMQ運行狀態

一、開啟BrokerService

在pom.xml新增ActiveMQ依賴,本次程式碼實例採用5.7版本,記得只需要activemq-core就行

<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-core</artifactId>
    <version>5.7.0</version>
</dependency>

在寫BrokerService程式碼部分,主要注意三個點

  1. 是否需要在jconsole中顯示監控訊息broker.setUseJmx(true)

  2. 設定連接使用者名稱和密碼,如何使用驗證插件

  3. 是否持久化,儲存位置設置,持久化配置

所以需要啟動一個連接位址tcp://localhost:61616,用戶名稱為admin,密碼為admin,需要持久化,持久化資料檔案儲存位址為/activemq ,需要啟動jconsole監控的BrokerService的程式碼如下:

    // author:herbert qq:464884492
    BrokerService broker = new BrokerService();
    broker.setUseJmx(true); // 开启监控
    broker.setPersistent(true); // 持久化
    broker.setBrokerName("Test");
    SimpleAuthenticationPlugin sap = new SimpleAuthenticationPlugin();
    AuthenticationUser au = new AuthenticationUser("admin", "admin","users");
    ArrayList<AuthenticationUser> d = new ArrayList<AuthenticationUser>();
    d.add(au);
    sap.setUsers(d); // 用户验证
    broker.setPlugins(new BrokerPlugin[] { sap });
    String mqDataPath = "/activemq"; // 存储位置 
    broker.getPersistenceAdapter().setDirectory(new File(mqDataPath));
    broker.addConnector("tcp://localhost:61616"); // 连接地址
    broker.start();

二、生產者和消費者

ActiveMQ中,通用的訊息傳遞方式有兩種

  • 佇列,支援訊息持久化,未消費的訊息,重啟後依然存在。若有多位消費者,在每次提取一則訊息的前提下,所有消費均分佇列中的訊息

  • 主題,不支援訊息持久化,未消費的訊息,在重啟後訊息遺失。若有多個消費,每個消費者依序消費主題中所有訊息

不管是生產者還是消費者程式碼編寫,主要是4個步驟

  1. 建立連接,採用failover:()方式,自動斷線重連

  2. 建立Session,取得傳送或接收目標Destination ,指定是佇列(session.createQueue(queueName)),或主題(session.createTopic(topicName))

  3. 透過Session取得生產者或消費者

  4. 生產或消費訊息

我們現在寫一個生產者的程式碼,並且循環產生10個訊息

 // author:herbert qq:464884492
String mqConnUrl = "tcp://localhost:61616";
String connUrl = "failover:(" + mqConnUrl.trim()+ ")?initialReconnectDelay=1000&maxReconnectDelay=30000";
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("admin","admin", connUrl);
javax.jms.Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("system");
MessageProducer messageProducer = session.createProducer(destination);

for (int i = 0; i < 10; i++) {
 javax.jms.TextMessage message = session.createTextMessage("ActiveMQ 发送的消息" + i);
 System.out.println("发送消息:" + "ActiveMQ 发送的消息" + i);
 messageProducer.send(message);
}

寫一個消費,消費上邊的10個訊息

 // author:herbert qq:464884492
String mqConnUrl = "tcp://localhost:61616";
String connUrl = "failover:(" + mqConnUrl.trim()+ ")?initialReconnectDelay=1000&maxReconnectDelay=30000";
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("admin", "admin", connUrl);
javax.jms.Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("system");
MessageConsumer messageConsumer = session.createConsumer(destination);
messageConsumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(javax.jms.Message message) {
   ActiveMQTextMessage m = (ActiveMQTextMessage) message;
    try {
          System.out.println("接收到:" + m.getText());
         } catch (JMSException e) {
         e.printStackTrace();
        }
     }
});

運行效果

ActiveMQ 嵌入到Tomcat:需要掌握三個重要的知識點

#可見,我們生產者,產生的10則訊息,已成功被消費者處理了。

三、監控嵌入的ActiveMQ

對於嵌入的ActiveMQ,在BrokerService啟動前需要設定 broker.setUseJmx(true);然後找到你的JAVA_HOME,切換到bin,輸入jconsole指令。

ActiveMQ 嵌入到Tomcat:需要掌握三個重要的知識點

待jconsole啟動後,選擇ActiveMQ所在的進程。連線後選擇Mbean頁籤

ActiveMQ 嵌入到Tomcat:需要掌握三個重要的知識點

紅框的地方分別為已消費和已進入MQ中的訊息的條數。選擇操作,找到那個SendTextMessage還可以想此隊列發送訊息。

四、Selvelt跟隨Tomcat啟動

對於Tomcat7.x版本之後Tomcat,Selvelt都可以透過直接在程式碼中透過註解的方式來設定URl連接,一起是否自啟動loadOnStartup 這個值>=0表示需要自啟動,值越小優先權越高

 // author:herbert qq:464884492
@WebServlet(urlPatterns = "/initmq", loadOnStartup = 1)
public class InitMqServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
        super.init(config);
        // 这里编写启动ActiveMQ代码
 }
}

五、總結

這次以ActiveMQ作為訊息佇列使用切入點,整體上說還比較順利。其中唯一出現問題的地方就是對於activeMQ依賴過多,多依賴了jaractivemq-broker,導致訊息能連接,但不能發送訊息。後邊直接換成 activemq-all,有出現slf4j日誌衝突,使用exclusions依然無法解決問題。最終只依賴 activemq-core,完美解決所有問題。

相關文章:

相關文章:

JMS訊息持久化,將ActiveMQ訊息持久化到mySql資料庫中

#ActiveMQ中Session設定的相關理解

#

以上是ActiveMQ 嵌入到Tomcat:需要掌握三個重要的知識點的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn