activemq 遇到的不能訊息確認的問題。

來源:互聯網
上載者:User

  項目需要使用activemq 來做訊息匯流排,剛開始看了下activemq in action 字型是在不好看,草草看完了,就動手下了個實現sender和receiver ,一般實現了就OK了,但是我實現以後,他雖然正常接收訊息,但是不確認訊息,很奇怪,想想這麼牛XX的訊息中介軟體,這麼大的bug ,肯定不可能,然後就想著哪裡肯定搞錯了吧,結果繼續學習查資料,功夫不負有心人啊,給解決了。廢話不說了,開始吧。

 首先 訊息發送這邊沒什麼好說的,可以查詢一些文檔,瞭解一些參數的設定。一會給出例子。

然後就是坑爹的接收訊息:

1 訊息接收有兩種方式,

一種是直接使用consumer.setMessageListener(**)這個方法,設定監聽器。他是阻塞式的,一直監聽整個訊息Queue ,

另一種是 直接consumer.receive(timeout);  直接返回訊息Message ,你可以直接對訊息進行處理。不是阻塞式的。

2 我遇到的問題在這裡

Session session = connection.createSession(Boolean.FALSE,Session.AUTO_ACKNOWLEDGE);

看見後面兩個參數了沒。

有兩種情況:

1
當createSession第一個參數為true時,表示建立的session被標記為transactional的,確認訊息就通過確認和校正來自動地處理,第二個參數應該是沒用的。   

--這句話抄別人的,沒看懂

2

當createSession的第一個參數為false時,表示建立的session沒有標記為transactional,此時有三種用於訊息確認的選項: 
**AUTO_ACKNOWLEDGE session將自動地確認收到的一則訊息; 
**CLIENT_ACKNOWLEDGE 用戶端程式將確認收到的一則訊息,調用這則訊息的確認方法; 
**DUPS_OK_ACKNOWLEDGE 這個選項命令session“懶散的”確認訊息傳遞,可以想到,這將導致訊息提供者傳遞的一些複製訊息可能出錯。 

我的問題一直設定的true ,坑爹的是在http://localhost:8161/admin/browse.jsp?JMSDestination=File_UP_001這裡看的時候總是pending message 而且他的Redelivered是true(也就是已經接收到了訊息),一頭霧水。

將true修改為false ,使用自動確認的Session.AUTO_ACKNOWLEDGE方式,結果一次性就問題就好了。

  3 有兩種方式NON_PERSISTENT、PERSISTENT

MS有兩種訊息傳遞方式。標記為NON_PERSISTENT的訊息最多傳遞一次,而標記為PERSISTENT的訊息將使用暫存後再轉寄的機理投遞。如果一個JMS服務離線,那麼持久性訊息不會丟失,但是得等到這個服務恢複聯機的時候才會被傳遞。所以預設的訊息傳遞方式是非持久性的,雖然使用非持久性訊息可能降低記憶體和需要的儲存空間,但這種傳遞方式只有當你不需要接收所有訊息時才使用。 


代碼:JmsSender.java

package com.gzhdi.bus;import javax.jms.Connection;import javax.jms.ConnectionFactory;import javax.jms.DeliveryMode;import javax.jms.Destination;import javax.jms.JMSException;import javax.jms.MessageProducer;import javax.jms.ObjectMessage;import javax.jms.Session;import org.apache.activemq.ActiveMQConnection;import org.apache.activemq.ActiveMQConnectionFactory;/** * 訊息的生產者(寄件者) *  */public class JmsSender{private static Connection connection = null;private static ConnectionFactory connectionFactory = null;private static JmsSender sender=null;private static String FILE_UP_QUEUE_NAME="File_UP_001";private static String MQ_USER=ActiveMQConnection.DEFAULT_USER;//TODO 應該加密的private static String MQ_PASSWORD=ActiveMQConnection.DEFAULT_PASSWORD;  private JmsSender(){//initial the upper var}public boolean send(Msg msg) throws JMSException{if (connectionFactory == null){// ConnectionFactory :串連工廠,JMS 用它建立串連connectionFactory = new ActiveMQConnectionFactory(MQ_USER,MQ_PASSWORD,"tcp://localhost:61616");// JMS 用戶端到JMS Provider 的串連connection = connectionFactory.createConnection();connection.start();}// Session: 一個發送或接收訊息的線程Session session = connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE);// Destination :訊息的目的地;訊息發送給誰.Destination destination = session.createQueue("File_UP_001");// MessageProducer:訊息生產者MessageProducer producer = session.createProducer(destination);// 設定不持久化producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);// 發送一條訊息ObjectMessage object = session.createObjectMessage();object.setObject(msg);producer.send(object);session.commit();//connection.close();System.out.println("commit Ok");return true;}/** * 得到一個實體 * @return JmsSender * @author yinlei |2012-10-30 下午6:55:30 * @version 0.1 */public static JmsSender getInstance(){if(sender==null){sender=new JmsSender();}return sender;}}

JmsReceiver.java


import javax.jms.Connection;import javax.jms.ConnectionFactory;import javax.jms.Destination;import javax.jms.JMSException;import javax.jms.Message;import javax.jms.MessageConsumer;import javax.jms.MessageListener;import javax.jms.ObjectMessage;import javax.jms.Session;import org.apache.activemq.ActiveMQConnection;import org.apache.activemq.ActiveMQConnectionFactory;import org.apache.log4j.Logger;/** * 訊息的消費者(接受者) *  */public class JmsReceiver implements MessageListener, Runnable{private static Logger logger = Logger.getLogger(JmsReceiver.class);public void run(){startConsumer();}public void startConsumer(){try{// ConnectionFactory :串連工廠,JMS 用它建立串連ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,ActiveMQConnection.DEFAULT_PASSWORD,"tcp://localhost:61616");// JMS 用戶端到JMS Provider 的串連Connection connection;connection = connectionFactory.createConnection();connection.start();// Session: 一個發送或接收訊息的線程// 切記 ,這裡的只有是false ,第二個參數才管用Session session = connection.createSession(Boolean.FALSE,Session.AUTO_ACKNOWLEDGE);// Destination :訊息的目的地;訊息發送給誰.Destination destination = session.createQueue("File_UP_001");// 消費者,訊息接收者MessageConsumer consumer = session.createConsumer(destination);consumer.setMessageListener(this);} catch (JMSException e){logger.error("Consumer error !!!",e);e.printStackTrace();}}// 對訊息進行監聽處理public void onMessage(Message message){FileMsg fm = null;try{if (message.getJMSRedelivered() != true){fm = (FileMsg) ((ObjectMessage) message).getObject();if(fm.process()){logger.info("訊息ObjectID:" +fm.getObjectID()+"處理完畢" );}}} catch (JMSException e){e.printStackTrace();}}public static void main(String[] args){JmsReceiver jms=new JmsReceiver();new Thread(jms).start();}}

訊息體:

public class FileMsg {private static final long serialVersionUID = -518929429090930161L;    //應用IDprivate String appID;//objectIDprivate String objectID;//檔案路徑private String path;public boolean process(){System.out.println("create a objectid objecID:"+objectID);return true;}public String getAppID(){return appID;}public void setAppID(String appID){this.appID = appID;}public String getObjectID(){return objectID;}public void setObjectID(String objectID){this.objectID = objectID;}public String getPath(){return path;}public void setPath(String path){this.path = path;}}

參考:http://riddickbryant.iteye.com/blog/441890

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.