ActiveMQ-事务消息-发送 与 接收

574 篇文章 4 订阅
272 篇文章 1 订阅

发送:


package com.bjpowernode.activemq.transaction;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

/**
 * ClassName:TransactionSender
 * Package:com.bjpowernode.activemq.transaction
 * Description:
 *
 * @date:2018/10/16 10:29
 * @author:  robin
 */
public class TransactionSender {

    public static void main(String[] args) {
        send();
    }

    private static void send() {
        MessageProducer producer=null;
        Session session= null;
        Connection connection=null;
        try {
            //1.根据Broker地址创建连接工厂对象
            ConnectionFactory connectionFactory=new ActiveMQConnectionFactory("tcp://192.168.31.128:61616");
            //2.创建连接对象
            connection=connectionFactory.createConnection();
            //3.创建Session回话对象,
            // 参数1为是否使用事务性的消息 false表示不使用事务 true表示使用事务
            //参数2表示消息的确认机制,会影响消息的接收方法而不会影响发送方法Session.AUTO_ACKNOWLEDGE表示自动确认
            session=connection.createSession(true,Session.AUTO_ACKNOWLEDGE);
            //4.创建一个目的地对象,createQueue创建一个基于点对点的目的地对象,参数为目的地名称,需要与接收时对应
            Destination destination=session.createQueue("myTransaction");
            //5.创建一个文本类型的消息,并设定消息的数据内容
            Message message=session.createTextMessage("queue的Transaction测试消息");
            //6.创建消息的发送者 ,并设定消息的发送位置
            producer=session.createProducer(destination);
            //7.发送消息到指定的目的地
            producer.send(message);
            //开启事务消息后,必须显示手动调用commit方法否则消息不会写入broker,注意:一个方法要发送2条或以上的消息时需要开启事务;
            session.commit();
            System.out.println("消息发送成功");
        } catch (JMSException e) {
            e.printStackTrace();
        }finally {
            if(producer!=null){
                try {
                    producer.close();
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }

            if(session!=null){
                try {
                    session.close();
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
            if(connection!=null){
                try {
                    connection.close();
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

接收:

package com.bjpowernode.activemq.transaction;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

/**
 * ClassName:TransactionReceive
 * Package:com.bjpowernode.activemq.transaction
 * Description:
 *
 * @date:2018/10/16 10:32
 * @author: robin
 */
public class TransactionReceive {
    public static void main(String[] args) {
        receive();
    }

    private static void receive() {
        MessageConsumer consumer =null;
        Session session=null;
        Connection connection=null;
        try {
            //1.根据Broker地址创建连接工厂对象
            ConnectionFactory connectionFactory=new ActiveMQConnectionFactory("tcp://192.168.31.128:61616");
            //2.创建连接对象
            connection=connectionFactory.createConnection();
            connection.start();//接收消息前前必须要start否则无法读取消息,线程会阻塞在receive()方法上
            //3.创建Session回话对象,
            // 参数1为是否使用事务性的消息 false表示不使用事务 true表示使用事务
            //参数2表示消息的确认机制,会影响消息的接收方法而不会影响发送方法Session.AUTO_ACKNOWLEDGE表示自动确认
           // 消息处理成功第三步(消息确认) 消息成功消费后从broker中删除
            session=connection.createSession(true,Session.AUTO_ACKNOWLEDGE);

            //4.创建一个目的地对象,createQueue创建一个基于点对点的目的地对象,参数为目的地名称,需要与发送时对应
            Destination destination=session.createQueue("myTransaction");

            //5.创建消息的接收者 ,并设定从哪里获取消息
            consumer =session.createConsumer(destination);

            //6从消息服务中读取消息        接收消息(消息成功消费的第一步)
            Message message= consumer.receive();
            //注意:使用事务消息后,必须显示的调用commit否则,读取的消息不会从broker中移除,这样的话后面的所有消息都不能够被消费
            //如果一个系统中的方法,需要读取多个队列中的数据来完成业务那么就需要使用事务消息,
            //接收时如果只有一接收也要尽可能使用事务性的消息
            session.commit();
            //获取消息的具体内容
            if(message instanceof TextMessage){
                // 处理消息(消息成功处理第二步)
                System.out.println(((TextMessage) message).getText());
            }

        } catch (JMSException e) {
            e.printStackTrace();
        }finally {
            if(consumer!=null){
                try {
                    consumer.close();
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }

            if(session!=null){
                try {
                    session.close();
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
            if(connection!=null){
                try {
                    connection.close();
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        }


    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值