1. 程式人生 > >JMS學習五(ActiveMQ的本地事務)

JMS學習五(ActiveMQ的本地事務)

有一個 tina 操作 cep 執行 oid 銷毀 訂閱 ole

1、ActiveMQ的本地事務

在一個JMS客戶端,可以使用本地事務來組合消息的發送和接收。JMS Session接口提供了commit和rollback方法。事務提交意味著生產的所有消息被發送,消費的所有消息被確認;事務回滾意味著生產的所有消息被銷毀,消費的所有消息被恢復並重新提交,除非它們已經過期。 事務性的會話總是牽涉到事務處理中,commit或rollback方法一旦被調用,一個事務就結束了,而另一個事務被開始。關閉事務性會話將回滾其中的事務。 需要註意的是,如果使用請求/回復機制,即發送一個消息,同時希望在同一個事務中等待接收該消息的回復,那麽程序將被掛起,因為直到事務提交,發送操作才會真正執行。 需要註意的還有一個,消息的生產和消費不能包含在同一個事務中。

在事務狀態下進行發送操作,消息並未真正投遞到中間件,而只有進行session.commit操作之後,消息才會發送到中間件,再轉發到適當的消費者進行處理。如果是調用rollback操作,則表明,當前事務期間內所發送的消息都取消掉。

2、關於ActiveMQ本地事務的用法

public class Sender {  
  
    public static void main(String[] args) throws Exception {  
  
        // 1、建立ConnectionFactory工廠對象,需要填入用戶名,密碼,以及連接的地址  
        
// 僅使用默認。端口號為"tcp://localhost:61616" ConnectionFactory connectionFactory = new ActiveMQConnectionFactory( "zhangsan",// ActiveMQConnectionFactory.DEFAULT_USER, "123",// ActiveMQConnectionFactory.DEFAULT_PASSWORD, "tcp://localhost:61616");
// 2、通過ConnectionFactory工廠對象創建一個Connection連接 // 並且調用Connection的start方法開啟連接,Connection默認是不開啟的 Connection connection = connectionFactory.createConnection(); connection.start(); // 3、通過Connection對象創建Session會話(上下文環境對象), // 參數一,表示是否開啟事務 // 參數二,表示的是簽收模式,一般使用的有自動簽收和客戶端自己確認簽收 // 第一個參數設置為true,表示開啟事務 // 開啟事務後,記得要手動提交事務 Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE); // 4、通過Session創建Destination對象,指的是一個客戶端用來指定生產消息目標和消費消息來源的對象。 // 在PTP模式中,Destination指的是Queue // 在發布訂閱模式中,Destination指的是Topic Destination destination = session.createQueue("queue1"); // 5、使用Session來創建消息對象的生產者或者消費者 MessageProducer messageProducer = session.createProducer(destination); // 6、如果是,生產者,使用MessageProducer的setDeliverMode方法設置,消息的持久化和非持久化 messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); // 7、最後使用JMS規範的TextMessage形式創建數據(通過Session對象) // 並利用MessageProducer的send方法發送數據 for (int i = 0; i < 5; i++) { TextMessage textMessage = session.createTextMessage(); textMessage.setText("我是消息" + i); messageProducer.send(textMessage); } // 手動提交開啟的事務 session.commit(); // 釋放連接 if (connection != null) { connection.close(); } } }

2.1 開啟事務

// 3、通過Connection對象創建Session會話(上下文環境對象),  
        // 參數一,表示是否開啟事務  
        // 參數二,表示的是簽收模式,一般使用的有自動簽收和客戶端自己確認簽收  
  
        // 第一個參數設置為true,表示開啟事務  
        // 開啟事務後,記得要手動提交事務  
  
        Session session = connection.createSession(Boolean.TRUE,  
                Session.AUTO_ACKNOWLEDGE);  

2.2 提交事務

// 7、最後使用JMS規範的TextMessage形式創建數據(通過Session對象)  
        // 並利用MessageProducer的send方法發送數據  
        for (int i = 0; i < 5; i++) {  
            TextMessage textMessage = session.createTextMessage();  
            textMessage.setText("我是消息" + i);  
            messageProducer.send(textMessage);  
        }  
  
        // 手動提交開啟的事務  
        session.commit();  

JMS學習五(ActiveMQ的本地事務)