1. 程式人生 > >Spring之JMS之訊息監聽容器

Spring之JMS之訊息監聽容器

EJB中JMS訊息最常用的用法之一是驅動訊息beans(MDBs)。Spring提供了一個方案建立訊息驅動的POJOs,在這種方式下,不需要將一個使用者與一個EJB容器繫結。從Spring框架4.1開始,終端方法可以簡單地用 

@JmsListener註解。

一個訊息監聽容器可以從一個JMS訊息佇列中接受訊息並驅動MessageListener,用於注入到容器中。監聽容器響應所有執行緒的訊息接受並分發到監聽器進行處理。一個訊息監聽容器是MDP和訊息提供器的中介軟體,並考慮註冊接受訊息,事物參與,資源獲取和釋放,異常轉換等。這個允許你作為一個應用程式開發者寫與接受訊息關聯的業務邏輯(可能對其作出響應),並分派到與框架關聯的JMS底層設定。

這裡Spring提供了兩個標準的JMS訊息監聽容器,每個都有自己特定的功能。

SimpleMessageListenerContainer

這個訊息監聽容器是兩者中比較簡單的一個。它在啟動時建立了固定數量的JMS會話和消費者,使用標準JMS的MessageConsumer.setMessageListener()方法註冊監聽器,並留給JMS提供者執行監聽回撥。這個變數不允許根據執行需要動態變動或者不允許參與外面事物管理。相容性方面,與單獨的JMS規範很相似,但是與Java EE的JMS規範一般不相容。

DefaultMessageListenerContainer

這個訊息監聽容器是用的最多的一個。與SimpleMessageListenerContainer相比,這個容器變數允許根據執行需要動態適應,並可參與事物管理中。每個接受的訊息當配置JtaTransactionManager時,使用XA事物註冊;所以這樣的處理可能充分利用XA 事物語義。這個監聽容器可在JMS提供器的低需求,高階功能(比如事物參與)和Java EE環境的相容上達到一個很好的平衡。

容器的快取級別可以定製化。注意當不用快取時,針對每個訊息的接受建立一個新的連線和一個新的會話。結合到非持久的訂閱和高載入方式可能導致訊息丟失。確保在這樣的例子中使用一個合適的快取。

當代理崩潰時這個容器有恢復的能力。預設地,一個簡答的BackOff實現每五秒重試一次。可能針對更多恢復選項指定一個定製的BackOff實現類。檢視ExponentialBackOff 這個例子。

23.2.5 Transaction management(事物管理)

Spring提供了JmsTransactionManager管理單一JMS的ConnectionFactory的事物。這個允許JMS應用程式利用Spring的事物管理功能。JmsTransactionManager執行本地資源事物,從指定的ConnectionFactory到執行緒,繫結一個JMS連線/會話對。JmsTemplate自動探查這樣的事物資源並據此作出響應操作。

在Java環境中,ConnectionFactory將池化連線和會話,所以這些資源通過事物高效重用。在一個單一的環境中,使用Spring的SingleConnectionFactory 將建立一個共享的JMS連線,其每個事物都有其自己獨立的會話。作為可選地,考慮使用一個指定提供器的池化的適應器,比如ActiveMQ的PooledConnectionFactory類。

JmsTemplate也可與JtaTransactionManager和XA-capable JMSConnectionFactory共用,來執行分散式事物。注意:這要求使用一個JTA事物管理器,也需要一個XA配置的ConnectionFactory。

貫穿在一個管理的和不受管理的事物環境的程式碼重用,當使用JMS API從連線中建立會話時,可能比較混亂。這是因為JMS API 僅有一個工廠方法建立會話並且針對事物和確認模式需要值。在一個管理環境中,這些值得設定負責環境中的事物底層,因此這些值由於供應商封裝到JMS連線中而被忽略。當在一個管理環境中使用JmsTemplate,你可以通過sessionTransactedsessionAcknowledgeMode屬性的使用指定這些值。當使用JmsTemplatePlatformTransactionManager,模板將總是給定一個事務性的JMS會話。

相關推薦

SpringJMS訊息容器

EJB中JMS訊息最常用的用法之一是驅動訊息beans(MDBs)。Spring提供了一個方案建立訊息驅動的POJOs,在這種方式下,不需要將一個使用者與一個EJB容器繫結。從Spring框架4.1開始,終端方法可以簡

Android輸入子系統應用程式註冊訊息過程分析

應用程式註冊訊息監聽過程分析 CPP層InputManagerService啟動後就需要監聽按鍵輸入了,當InputManagerService監聽到鍵盤輸入的事件後就需要分發鍵盤事件,但是分發給誰呢?這裡首先應該是分發給當前啟用的Window視窗,但是當前啟

JavaScript事件概念和事件

scrip isp doctype utf itl 技術分享 創建 img ret 1、事件的概念: JavaScript使我們有能力創建動態頁面,網頁中的每一個元素都可以產生某些觸發JavaScript函數的事件。我們可以認為事件是可以被JavaScript偵測到的一種行

Androidswitch控制元件

mSwith.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(Comp

CuratorPathChildrenCache子節點

Curator之PathChildrenCache子節點監聽: /*子節點監聽*/ //子節點新增watcher //PathChildrenCache:監聽資料節點的增刪改,會觸發事件 String childNodePathCach

C++從零開始區塊鏈:P2P模組節點註冊和

ThreadPool是一個執行緒池,具體實現就不貼了,隨便找個執行緒池實現就行,也可以戳這裡檢視程式完整程式碼。 P2PNode::P2PNode(const char *if_name) { m_sock = socket(AF_INET, SOCK_DGRAM, 0);//I

Vue元件通訊二:事件函式$emit/$on/$off

在vue2.x版本中自定義時間都需要通過$emit/$on/$off函式來進行觸發、監聽和取消監聽。 如果瞭解過JavaScript的設計模式-------觀察者模式,一定知道dispatchEvent和addEventListener這兩個方法。Vue元件中也有與之類似的模式,子元件用$emi

Android多程序Binder解綁的問題

Android多程序系列 接上一篇文章《Android多程序之手動編寫Binder類》中向服務端註冊監聽事件的問題,在擴充套件了Binder類後,我們還需要改造對應的服務端和客戶端 客戶端和服務端的改

JS奇技利用scroll來resize詳解

前言大家都知道知道原生的 resize 事件只能作用於 defaultView 即 window 上,那麼我們應該通過什麼樣的方式來監聽其他元素的大小改變呢?筆者最近學習發現了一種神奇的方法,通過 scroll 事件來間接實現 resize 事件的監聽,本文將對這種方式進行原理的剖析與程式碼實現。原理首先,我

vue在頁面中鍵盤的Enter鍵來觸發某個按鈕事件

專案中得需求:給頁面某個按鈕繫結Enter鍵,但是按鈕不在form中,直接給按鈕繫結後此按鈕只有獲取了焦點按鍵才會觸發,顯然,一直保持按鈕獲取焦點是不現實得。所以通過查詢等,結合專案需求,完成了下面得程式碼,希望對大家有用,歡迎一起探討,Email:[email p

開發小技巧在Application中App中的Activity的生命週期

在有一些場景下,需要我們在app從後臺程序到前臺程序的切換過程中,做一些操作,如展示一個公司廣告頁面等等情況。這個時候,我們可以在我們的Application中來監聽當前App的狀態,Google已經給我們封裝好了方法: public class MyAppl

JAVA鍵盤,滑鼠事件

本案設計鍵盤按鈕,畫出一個簡易鍵盤, 通過按下,釋放鍵盤 滑鼠經過按鈕,滑鼠點選按鈕,滑鼠離開按鈕 詳細解釋了滑鼠鍵盤對應事件 先看一下鍵盤監聽介面的API void keyPressed(KeyEvent e) 按下鍵時呼叫。 void k

基於vue-cli的vue專案路由3--watch路由

有時候我們需要監聽路由,做出某種操作。。。程式碼主要在app.vue上 1.hello.vue頁面//獲取一個引數,第五行顯示 <template> <div class="hello"> <!--{{ this.$route.param

JavaScript事件處理()函式

JavaScript之事件處理(監聽)函式事件是使用者和瀏覽器自身進行的特定行為。這些事件都有自己的名字,如click,,load,mouseover。用於響應某個事件而呼叫的函式稱為事件處理函式,或者DOM稱之為事件監聽函式。事件處理函式有兩種分配方式:在JavaScri

Objective-CKVO(鍵值)

一,KVO的定義 KVO(Key-Value Observing),俗稱鍵值監聽。它提供一種機制,當指定的物件的屬性被修改後,則物件就會接受到通知。簡單的說就是每次指定的被觀察的物件的屬性被修改後,KVO就會自動通知相應的觀察者了。 KVO是“觀察者”設計模式的一種應用,

一個類,有新增元素(add)和獲取元素數量(size)方法。 啟動兩個線程。線程1向容器中新增數據。線程2容器元素數量,當容器元素數量為5時,線程2輸出信息並終止

override tac trace add syn countdown print import 數據 方式一: /** * 兩個線程要是可見的所以要加上votalile */public class Test_01 { public static void

Spring Boot的事件和

在Spring Boot的框架中,處理一些通用的Spring框架的事件(如ContextRefreshedEvent),在SpringApplication中也會發送一下其他的應用的事件,下面來聊聊這些事件的觸發時間和用法。 在程式的啟動中,會有以下的事件觸發【在2.0版本中所有的事件

Spring boot 專案HttpSessionListener用於session失效時移除線上使用者的全域性引數

在專案中會出現使用者不點選登出時間觸發session.invalidate()方法,此時我們就無法確定使用者的實際登入狀態,再次我們使用HttpSessionListener監聽器來管理使用者session失效,進而解決了線上使用者的統計或者全域性引數的控制 值得注意的是: @Se

spring boot中配置全域性

@Configuration @ComponentScan(basePackages = "com.pty.workflow") @MapperScan(basePackages = { "com.pty.workflow.dao" }, annotationClass = MyB

Spring中手動開啟kafka.md

0. 背景重現 最近搭建一個新專案,基於SpringBoot框架,使用Kafka做訊息中介軟體。 使用@KafkaListener註解來建立一個消費者,實現對Kafka訊息的消費。我計劃的執行順序是這樣的:服務啟動之後,建立Consumer例項,執行loadResourceConfi