一、消息阻塞優化
1.activemq消費者在從待消費隊列中獲取消息是會先進行預讀取,默認是1000條(prefetch=1000)。這樣很容易造成消息積壓。
2.可以通過設置prefetch的默認值來調整預讀取條數,java代碼如下
//設置預讀取為1
ActiveMQPrefetchPolicy p = new ActiveMQPrefetchPolicy();
p.setQueuePrefetch(1);
//創建一個鏈接工廠
connectionFactory = new ActiveMQConnectionFactory(username, pwd, url_one);
//設置預讀取為1
connectionFactory.setPrefetchPolicy(p);
//從工廠中創建一個鏈接
connection = (ActiveMQConnection) connectionFactory.createConnection();
//啟動鏈接
connection.start();
//創建一個事物session
session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
queue = session.createQueue(queueResponse);
consumer = session.createConsumer(queue);
//設置消息監聽器
consumer.setMessageListener(new ReceiveListener());
二、消息確認機制優化
1.activemq默認是自動確認消費機制,即消費者接收了此消息,此消息便從待消費隊列中剔除,進入已消費隊列。
2.我們可以將消費確認模式改成手動確認。java代碼如下:
//創建一個事物session
session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
createSession(paramA,paramB);
paramA 取值有 : true or false 表示是否支持事務
paramB 取值有:Session.AUTO_ACKNOWLEDGE,Session.CLIENT_ACKNOWLEDGE,DUPS_OK_ACKNOWLEDGE,SESSION_TRANSACTE
createSession(paramA,paramB);
paramA是設置事務的,paramB設置acknowledgment mode
paramA設置為false時:paramB的值可為Session.AUTO_ACKNOWLEDGE,Session.CLIENT_ACKNOWLEDGE,DUPS_OK_ACKNOWLEDGE其中一個。
paramA設置為true時:paramB的值忽略, acknowledgment mode被jms服務器設置為SESSION_TRANSACTED 。
Session.AUTO_ACKNOWLEDGE為自動確認,客戶端發送和接收消息不需要做額外的工作。
Session.CLIENT_ACKNOWLEDGE為客戶端確認。客戶端接收到消息后,必須調用javax.jms.Message的acknowledge方法。jms服務器才會刪除消息。
DUPS_OK_ACKNOWLEDGE允許副本的確認模式。一旦接收方應用程序的方法調用從處理消息處返回,會話對象就會確認消息的接收;而且允許重復確認。在需要考慮資源使用時,這種模式非常有效。
3.然后在消費者監聽器中,調用
msg.acknowledge();
方法來手動返回消費確認標志。代碼如下:
@Override
public void onMessage(Message message) {
TextMessage msg = (TextMessage) message;
//do something
msg.acknowledge();
}
