亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

ActiveMQ中consumer的消息確認機制詳解

 更新時間:2023年10月10日 10:36:35   作者:程序員阿紅  
這篇文章主要介紹了ActiveMQ中consumer的消息確認機制詳解,對于broker而言,只有接收到確認指令,才會認為消息被正確的接收或者處理成功了,InforSuiteMQ提供以下幾種Consumer與Broker之間的消息確認方式,需要的朋友可以參考下

1. Consumer消息確認機制

簡單講就是消息被Consumer接收后,Consumer將在何時確認消息。

對于broker而言,只有接收到確認指令,才會認為消息被正確的接收或者處理成功了。InforSuiteMQ提供以下幾種Consumer與Broker之間的消息確認方式。

(1)AUTO_ACKNOWLEDGE = 1 自動確認

(2)CLIENT_ACKNOWLEDGE = 2 客戶端手動確認

(3)DUPS_OK_ACKNOWLEDGE = 3 自動批量確認

(4)SESSION_TRANSACTED = 0 事務(wù)提交并確認

(5)INDIVIDUAL_ACKNOWLEDGE = 4 單條消息確認

前四種是JMS API中提供的客戶端ACK_MODE。第五種是InforSuiteMQ自定義補充的一種ACK_MODE。

Consumer有兩種消息消費方式:同步消費consumer.receive()和異步消費MessageListener,這兩種方式下,消息確認機制也是不同的。同一Consumer中,不可同時使用這兩種消費方式。

同步調(diào)用時,在消息從receive方法返回之前,就已經(jīng)調(diào)用了ACK;因此如果Client端沒有處理成功,此消息將丟失(可能重發(fā),與ACK_MODE有關(guān))。

異步調(diào)用時,消息的確認是在onMessage方法返回之后,如果onMessage方法異常,會導(dǎo)致消息重發(fā)。

2.消息確認方式詳解

2.1自動確認

AUTO_ACKNOWLEDGE : 自動確認,這就意味著消息的確認時機將有consumer擇機確認。

使用開發(fā)者必須明確知道"擇機確認"的具體時機,否則將有可能導(dǎo)致消息的丟失,或者消息的重復(fù)接收。

2.2客戶端確認

CLIENT_ACKNOWLEDGE : 客戶端手動確認,開發(fā)者需要自己擇機確認??蛻舳耸謩哟_認時機有以下三種:

(1) message.acknowledge():確認當(dāng)前session中所有consumer中尚未ACK的消息;

(2) InforSuiteMQSession.acknowledge():確認當(dāng)前session中所有consumer中尚未ACK的消息;

(3) InforSuiteMQMessageConsumer.acknowledege():確認當(dāng)前consumer中那些尚未確認的消息。

2.3自動批量確認

DUPS_OK_ACKNOWLEDGE : 自動批量確認,也是一種自動確實方式,使用方法與AUTO_ACKNOWLEDGE相同,具有“批量”和“延遲”的確認特點。

該模式下,當(dāng)Consumer故障重啟后,那些尚未被ACK確認的消息會重新發(fā)送過來,這就意味著消息可能重復(fù)。

2.4事務(wù)確認

  • SESSION_TRANSACTED:事務(wù)提交并確認。當(dāng)session使用事務(wù)時,調(diào)用此確認方式。在事務(wù)開啟之后和session.commit()之前,所有消費的消息,要么全部正常確認,要么全部redelivery。
  • 當(dāng)session.commit方法異常時,開發(fā)者通常是調(diào)用session.rollback()回滾事務(wù)(事實上開發(fā)者不調(diào)用也沒有問題),開發(fā)這個可以在事務(wù)開始之后的任何時機調(diào)用rollback(),rollback意味著當(dāng)前事務(wù)的結(jié)束,事務(wù)中所有的消息都將被重發(fā)。調(diào)用session.rollback()而導(dǎo)致消息重發(fā),都會導(dǎo)致message.redeliveryCounter計數(shù)器增加,最終都會受限于brokerUrl中配置的"jms.redeliveryPolicy.maximumRedeliveries",如果rollback的次數(shù)過多,而達到重發(fā)次數(shù)的上限時,消息將會被DLQ(dead letter)。

2.5單條消息確認

INDIVIDUAL_ACKNOWLEDGE : 單條消息確認。此確認方式與客戶端確認方式使用CLIENT_ACKNOWLEDGE幾乎一樣,當(dāng)消息消費成功之后,調(diào)用message.acknowledege來確認此消息(單條),而CLIENT_ACKNOWLEDGE模式,調(diào)用message.acknowledge()方法將導(dǎo)致整個session中所有消息被確認(批量確認)。

3.客戶端確認使用場景解析

Consumer使用MessageListener異步監(jiān)聽隊列消息,并將消息插入到數(shù)據(jù)中。

消息確認方式為客戶端單條消息確認,消息插入數(shù)據(jù)庫成功,調(diào)用message.acknowledege()來確認此消息(單條),消息插入數(shù)據(jù)庫失敗,調(diào)用session.recover()將消息返回的隊列中重新發(fā)送。

以下為部分代碼示例。

final InforBrokerQueueSession session =  (InforBrokerQueueSession) connection.createQueueSession(Boolean.FALSE, InforBrokerSession.INDIVIDUAL_ACKNOWLEDGE);
Destination destination = session.createQueue("myqueue_rz");  		 
InforBrokerMessageConsumer consumer = (InforBrokerMessageConsumer) session.createConsumer(destination);
public void onMessage(Message m) { 		 		
	          TextMessage message =  (TextMessage)m;	 
 	         long begin=System.currentTimeMillis();//用于性能測試,跟蹤程序運行時間
 	           try {
 				  System.out.println("message::"+message.getText()); 				 
  	       	       state=insertDB(message.getText());  	
 			   } catch (JMSException e) {
 				   e.printStackTrace();
                   }
 	          long end=System.currentTimeMillis(); //用于性能測試,跟蹤程序運行時間
	          long cost=end-begin;
	          System.out.println("數(shù)據(jù)接收處理總共耗時:"+cost); //用于性能測試,跟蹤程序運行時間
 	           if(state.equals("1")){
 	              try {
 	            	 // System.out.println("stat=1"+message.getText());
					    message.acknowledge();
					    //   session.commit();
				} catch (JMSException e) {
					e.printStackTrace();
				}
 	           }else{
 	        	  try {
 	        		  //session.rollback();
 	        		 session.recover();
					System.out.println("getJMSRedelivered():"+m.getJMSRedelivered());
					m.setJMSRedelivered(true); 					System.out.println("m.getJMSDeliveryMode():"+m.getJMSDeliveryMode());
				} catch (JMSException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} 					
 	           }

到此這篇關(guān)于ActiveMQ中consumer的消息確認機制詳解的文章就介紹到這了,更多相關(guān)consumer的消息確認機制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java和C#下的參數(shù)驗證方法

    Java和C#下的參數(shù)驗證方法

    下面小編就為大家?guī)硪黄狫ava和C#下的參數(shù)驗證實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • MyEclipse配置JDK的全過程

    MyEclipse配置JDK的全過程

    這篇文章主要介紹了MyEclipse配置JDK的全過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • springboot基于docsify?實現(xiàn)隨身文檔

    springboot基于docsify?實現(xiàn)隨身文檔

    這篇文章主要介紹了springboot基于docsify實現(xiàn)隨身文檔的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • JVM的類加載過程詳細說明

    JVM的類加載過程詳細說明

    近來讀了《深入理解JVM虛擬機》的部分內(nèi)容,對JVM也慢慢有個整體的認識,今天就來分享一下我對JVM類加載過程的學(xué)習(xí)和理解,需要的朋友可以參考下
    2021-06-06
  • java面向?qū)ο缶幊讨匾拍罾^承和多態(tài)示例解析

    java面向?qū)ο缶幊讨匾拍罾^承和多態(tài)示例解析

    這篇文章主要為大家介紹了java面向?qū)ο缶幊痰膬蓚€重要概念繼承和多態(tài)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • java Class.getSimpleName() 詳解及用法

    java Class.getSimpleName() 詳解及用法

    這篇文章主要介紹了java Class.getSimpleName() 詳解及用法的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Java類初始化時機測試方法解析

    Java類初始化時機測試方法解析

    這篇文章主要介紹了Java類初始化時機測試過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • Java中SPI的一些理解

    Java中SPI的一些理解

    這篇文章主要介紹了Java中SPI的一些理解,幫助大家更好的理解和學(xué)習(xí)Java的相關(guān)知識,感興趣的朋友可以了解下
    2020-12-12
  • 解讀Spring定義Bean的兩種方式:<bean>和@Bean

    解讀Spring定義Bean的兩種方式:<bean>和@Bean

    這篇文章主要介紹了Spring定義Bean的兩種方式:<bean>和@Bean,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • mybatis plus代碼生成器配置過程解析

    mybatis plus代碼生成器配置過程解析

    這篇文章主要介紹了mybatis plus代碼生成器配置過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11

最新評論