大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 ActiveMQ的消息事務

ActiveMQ的消息事務

更新時間:2021-07-28 17:08:12 來源:動力節點 瀏覽1694次

消息事務

消息事務,是保證消息傳遞原子性的一個重要特征,和JDBC的事務特征類似。

一個事務性發送,其中一組消息要么能夠全部保證到達服務器,要么都不到達服務器。

生產者、消費者與消息服務器直接都支持事務性;

ActiveMQ的事務主要偏向在生產者的應用。

ActiveMQ消息事務流程圖:

activemq事務

1.生產者事務:

沒有加入事務的時候,會有部分信息過去,結果如圖:

activemq事務

方式一:

 /**
     * 事務性發送--方案一
     */
    @Test
    public void sendMessageTx(){
        //獲取連接工廠
        ConnectionFactory connectionFactory = jmsMessagingTemplate.getConnectionFactory();

        Session session = null;
        try {
            //創建連接
            Connection connection = connectionFactory.createConnection();

            /**
             * 參數一:是否開啟消息事務
             */
            session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);

            //創建生產者
            MessageProducer producer = session.createProducer(session.createQueue(name));

            for(int i=1;i<=10;i++){
                //模擬異常
                if(i==4){
                    int a = 10/0;
                }

                TextMessage textMessage = session.createTextMessage("消息--" + i);
                producer.send(textMessage);
            }

            //注意:一旦開啟事務發送,那么就必須使用commit方法進行事務提交,否則消息無法到達MQ服務器
            session.commit();
        } catch (JMSException e) {
            e.printStackTrace();
            //消息事務回滾
            try {
                session.rollback();
            } catch (JMSException e1) {
                e1.printStackTrace();
            }
        }


    }

結果,沒有發送出去

方式二:

/**
 * ActiveMQ配置類
 */
@Configuration
public class ActiveMQConfig {

    /**
     * 添加Jms事務管理器
     */
    @Bean
    public PlatformTransactionManager createTransactionManager(ConnectionFactory connectionFactory){
        return new JmsTransactionManager(connectionFactory);
    }

}

/**
 * 消息發送的業務類
 */
@Service
public class MessageService {

    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;
    @Value("${activemq.name}")
    private String name;

    @Transactional // 對消息發送加入事務管理(同時也對JDBC數據庫的事務生效)
    public void sendMessage(){
        for(int i=1;i<=10;i++) {
            //模擬異常
            if(i==4){
                int a = 10/0;
            }

            jmsMessagingTemplate.convertAndSend(name, "消息---"+i);
        }
    }

}

2.消費者事務

/**
 * 用于監聽消息類(既可以用于隊列的監聽,也可以用于主題監聽)
 */
@Component // 放入IOC容器
public class MsgListener {

    /**
     * 接收TextMessage的方法
     */
    @JmsListener(destination = "${activemq.name}")
    public void receiveMessage(Message message,Session session){
        if(message instanceof TextMessage){
            TextMessage textMessage = (TextMessage)message;

            try {
                System.out.println("接收消息:"+textMessage.getText());


                int i=10/0;

                //提交事務
                session.commit();
            } catch (JMSException e) {
                e.printStackTrace();
                //回滾事務
                try {
                    session.rollback();//一旦事務回滾,MQ會重發消息,一共重發6次
                } catch (JMSException e1) {
                    e1.printStackTrace();
                }
            }

        }
    }

}

注意如果在消費者異常了,會收到消息,然后重發6次,要是期間還是異常,就會到私信隊列中

activemq事務

以上就是動力節點小編介紹的"ActiveMQ的消息事務",希望對大家有幫助,想了解更多可查看ActiveMQ教程。動力節點在線學習教程,針對沒有任何Java基礎的讀者學習,讓你從入門到精通,主要介紹了一些Java基礎的核心知識,讓同學們更好更方便的學習和了解Java編程,感興趣的同學可以關注一下。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 欧美午夜影院 | 欧美日韩亚洲在线观看 | 全免费毛片在线播放 | 久久国产精品久久久久久久久久 | 色视频一区二区三区 | 亚洲毛片儿 | 亚洲精品人成网线在线 | 九九热精品免费视频 | 亚洲欧美精品 | 亚洲第一二三四区 | 国产一区二区免费在线观看 | 久久精品视频7 | 国产在线激情 | 国产精品视频一区国模私拍 | 中文字幕日韩精品在线 | 狠狠躁夜夜躁人人爽天天3 狠狠躁夜夜躁人人爽天天miya | 一级毛片真人不卡免费播 | 久久综合国产 | 九九精品在线播放 | 国产人成精品免费视频 | 亚洲第一黄色网址 | 狠狠色狠狠色很很综合很久久 | 老子影院午夜 | 亚洲精品一区二区不卡 | 五月婷婷久 | 中文字幕一区二区日产乱码 | 日日夜夜操天天干 | 人人干人人模 | 久久99热这里只有精品7 | 国产一级精品高清一级毛片 | 丁香激情综合色伊人久久 | 亚洲精品视频一区 | 国产伦精品一区二区三区四区 | 亚州毛色毛片免费观看 | 国产精品久久久久久久久久久久 | 九九涩 | 欧美区国产区 | 成人小视频免费在线观看 | 天天se天天cao | 精品国产一区二区 | 日韩亚射 |