非持久化模式下,Topic不會落地任何消息,消息入隊即出隊, 消費者如果想要保留離線后的消息需要告訴MQ實例,即注冊過程, 代碼上大概是這樣的:
connectionFactory = new ActiveMQConnectionFactory(username, password, brokerUrl);
connection = connectionFactory.createConnection();
connection.setClientID(durableSubscribe.elementText("clientId"));
connection.start();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
destination = session.createTopic(destinationName);
topicSubscriber = session.createDurableSubscriber(destination, durableSubscribe.elementText("consumerId"));
topicSubscriber.setMessageListener(new DestinationListener());
這里要補充幾個實驗收獲:
1.ActiveMQ的客戶端無論是生產者還是消費者都有兩個ID,以消費者舉例,clientId代表一個連接connection, consumerId代表該連接產生的一個消費者,所以注冊過程需要填入兩個ID才能讓MQ實例識別一個消費者
2.Topic的機制是有副本,不論是在線的消費者或者離線的持久化消費者再次上線后都會收到相同的副本消息
3.持久化訂閱和非持久化訂閱一樣都可以同時連接同時獲取消息副本,不存在所謂的同時只能發送給一個clientId的情況
4.注冊記錄不會隨着Topic的刪除而刪除,如果刪除了Topic那么只要有一個consumer再度訂閱了該Topic那么所有相關的注冊記錄即消費者數量就會恢復,只有重啟實例才可重置。