ActiveMQのトランザクションメッセージ

ほとんどのメッセージ指向ミドルウェアは、例外なくActiveMQの、トランザクションメッセージングをサポートしています。

問題の定義およびACIDプロパティは、ここでそれらを繰り返すありません。


、MySQLデータベースのコントラスト

事務のMySQLの概念、

ActiveMQのは、トランザクションの概念を持っています

ここでは地元の情勢であること、rocketMqは、分散トランザクションをサポートしています


JDBCデータベースへのアクセスを規制するために開発されたJava

同じ

Javaはまた、ミドルウェアメッセージングへのアクセスを規制するために、JMS(Javaのメッセージサービス)で、ActiveMQの仕様が完全にサポートされてjms1.1


そのJavaは、MySQLのでトランザクションを実装します

おそらくあまりこれ以上何も:

 public static void main(String[] args) {
        Connection conn =getConnection();
        try {
            conn.setAutoCommit(false);
            insertUser(conn);
            insertAddress(conn);
            conn.commit();
        } catch (SQLException e) {
            System.out.println("************事务处理出现异常***********");
            e.printStackTrace();
            try {
                conn.rollback();
                System.out.println("*********事务回滚成功***********");
            } catch (Exception e2) {
                // TODO: handle exception
                e2.printStackTrace();
            }finally {
                try {
                    conn.close();
                } catch (SQLException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
        }
    }

:その後、我々は、テキストの接続春の統合にActiveMQを

実装する方法を見とるActiveMQのトランザクション・メッセージングを


    @Test
    public void p2pSender() {
        //获取连接工厂
        ConnectionFactory connectionFactory = jmsQueueTemplate.getConnectionFactory();
        Session session = null;
        try {
            Connection connection = connectionFactory.createConnection();
            // 参数一:是否开启消息事务
            session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);

            MessageProducer producer = session.createProducer(session.createQueue("test.trsaction"));
            //发送10条消息,开启事务后,要么一起成功,要么一起失败
            for (int i = 0; i < 10; i++) {
                if (i == 4) {
                    //出现异常
//                    throw new RuntimeException("i cannot equals 4");
                }
                TextMessage textMessage = session.createTextMessage("消息-----" + i);
                producer.send(textMessage);
            }
            //开启事务后,需要手动提交
            session.commit();
        } catch (JMSException e) {
            e.printStackTrace();
            //消息事务回滚
            try {
                session.rollback();
            } catch (JMSException ex) {
                ex.printStackTrace();
            }
        }
    }

図では、我々は、手動で例外を作成しました。

10件のメッセージを正常に送信することができます:いいえ例外はとき

画像-20200130211242542

私たちは、そのラインのオープンを異常が

再び実行します。

コンソールから見つけることができ、情報が出て送信されませんでした。

画像-20200130211348932

それは今持っているトランザクションの効果です。


また、言及すべきです。

春への統合後、春のトランザクション管理を委託する必要があります。

MySQLの場合、我々は構成されDatasourceTransactionManager

@Transactional注釈が可能使用してください。

ActiveMQのために同じですが、使用がJmsTransactionManagerです。


また、ここではそれらを繰り返さないで、この分散トランザクション、MySQLとリソースマネージャ(RM)としてActiveMQのと同じで、完全にサポートされていない、あまりでこのActiveMQの、XAプロトコルを達成していることに注意してください。

おすすめ

転載: www.cnblogs.com/heliusKing/p/12244047.html