ActiveMQ 持久化(檔案),查詢隊列剩餘訊息數、出隊數的實現

來源:互聯網
上載者:User

《ActiveMQ發訊息和收訊息》詳細介紹了ActiveMQ發訊息和收訊息,訊息儲存在訊息佇列(queue)中,訊息佇列資料儲存在電腦記憶體中,假如ActiveMQ伺服器由於某些原因突然停止,那訊息佇列中內容還在嗎。用事實說話吧,把ActiveMQ伺服器停止,然後再看看ActiveMQ頁面上的隊列資訊queue,如圖:


activemq_queue隊列中的資訊全部丟失了。為瞭解決這個問題,可以把隊列資料持久化,分為檔案持久化和資料庫持久化。

現在詳細分析檔案持久化。直接來代碼吧:

訊息寄件者:

 

package com.activemq.queue; import javax.jms.Connection; public class Sender { private static final int SEND_NUMBER = 1; public static void main(String[] args) { // ConnectionFactory 介面(串連工廠) 使用者用來建立到JMS提供者的串連的被管對象。 // JMS客戶通過可移植的介面訪問串連,這樣當下層的實現改變時,代碼不需要進行修改。 // 管理員在JNDI名字空間中配置串連工廠,這樣,JMS客戶才能夠尋找到它們。 // 根據訊息類型的不同,使用者將使用隊列串連工廠,或者主題串連工廠。 ConnectionFactory connectionFactory; // Connection :JMS 用戶端到JMS Provider 的串連 // Connection 介面(串連) 串連代表了應用程式和Message Service器之間的通訊鏈路。 // 在獲得了串連工廠後,就可以建立一個與JMS提供者的串連。根據不同的連線類型, // 串連允許使用者建立會話,以發送和接收隊列和主題到目標。 Connection connection = null; // Session: 一個發送或接收訊息的線程 // Session 介面(會話) 表示一個單線程的上下文,用於發送和接收訊息。 // 由於會話是單線程的,所以訊息是連續的,就是說訊息是按照發送的順序一個一個接收的。 // 會話的好處是它支援事務。如果使用者選擇了事務支援,會話上下文將儲存一組訊息,直到事務被提交才發送這些訊息。 // 在提交事務之前,使用者可以使用復原操作取消這些訊息。一個會話允許使用者建立訊息生產者來發送訊息,建立訊息消費者來接收訊息。 Session session; // Destination :訊息的目的地;訊息發送給誰. // Destination 介面(目標) 目標是一個封裝了訊息目標標識符的被管對象, // 訊息目標是指訊息發布和接收的地點,或者是隊列,或者是主題。 // JMS管理員建立這些對象,然後使用者通過JNDI發現它們。 // 和串連工廠一樣,管理員可以建立兩種類型的目標,點對點模型的隊列,以及發行者/訂閱者模型的主題。 Destination destination; // MessageProducer:訊息寄件者 // MessageProducer 介面(訊息生產者) 由會話建立的對象,用於發送訊息到目標。 // 使用者可以建立某個目標的寄件者,也可以建立一個通用的寄件者,在發送訊息時指定目標。 MessageProducer producer; // TextMessage message; // 構造ConnectionFactory執行個體對象,此處採用ActiveMq的實現jar connectionFactory = new ActiveMQConnectionFactory( ActiveMQConnection.DEFAULT_USER, //null ActiveMQConnection.DEFAULT_PASSWORD, //null "tcp://localhost:61616"); try { // 構造從工廠得到連線物件 connection = connectionFactory.createConnection(); // 啟動 connection.start(); // 擷取操作串連 session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE); //1 destination = session.createQueue(RunServer.queueName); // 得到訊息產生者【寄件者】 producer = session.createProducer(destination); // 設定不持久化,可以更改 producer.setDeliveryMode(DeliveryMode.PERSISTENT); //2 // 構造訊息 sendMessage(session, producer); session.commit(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (null != connection) connection.close(); } catch (Throwable ignore) { } } } public static void sendMessage(Session session, MessageProducer producer) throws Exception { for (int i = 1; i <= SEND_NUMBER; i++) { TextMessage message = session .createTextMessage("ActiveMq 發送的訊息" + i); // 發送訊息到目的地方 System.out.println("發送訊息:" + i); producer.send(message); } } }

訊息接受者:

 

package com.activemq.queue; import javax.jms.Connection; public class Receiver { public static void main(String[] args) { // ConnectionFactory :串連工廠,JMS 用它建立串連 ConnectionFactory connectionFactory; // Connection :JMS 用戶端到JMS Provider 的串連 Connection connection = null; // Session: 一個發送或接收訊息的線程 final Session session; // Destination :訊息的目的地;訊息發送給誰. Destination destination; // 消費者,訊息接收者 // MessageConsumer 介面(訊息消費者) 由會話建立的對象,用於接收發送到目標的訊息。 // 消費者可以同步地(阻塞模式),或非同步(非阻塞)接收隊列和主題類型的訊息。 MessageConsumer consumer; connectionFactory = new ActiveMQConnectionFactory( ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616"); try { // 構造從工廠得到連線物件 connection = connectionFactory.createConnection(); // 啟動 connection.start(); // 擷取操作串連 session = connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE); //queue_name跟sender的保持一致,一個建立一個來接收 destination = session.createQueue(RunServer.queueName); consumer = session.createConsumer(destination); // //第一種情況 // int i = 0; // while (i < 3) { // i++; // TextMessage message = (TextMessage) consumer.receive(); // session.commit();<

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.