activemq基础部分总结

activemq总结

消息组成

1.消息头

在发送消息时可以设置消息头的属性
在这里插入图片描述
常用方法:
JMSDestination:发送消息的目的地主要指queue和topic
JMSDeliveryMode:持久和非持久
JMSExpiration:过期时间(0表示永不过期)
JMSPriority:优先级(0-4普通消息,5-9加急消息,默认4)
JMSMessageID:唯一识别(mq有自己生成的)

send方法也提供了 一些设置
在这里插入图片描述

2.消息体

五种格
在这里插入图片描述

3.消息属性

对消息头和消息体的加强。可以对数据进行识别、去重、标识。
mq提供了设置各种属性值的方法。
在这里插入图片描述

消息可靠性

1.持久化

在这里插入图片描述
MQ默认是持久化

topic持久化
生产者

   public static final String ACTIVEMQ_URL="tcp://192.168.164.134:61616";
    public static final String TOPIC_NAME="topic_pristst";
    public static void main(String[] args) throws JMSException {
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
        Connection connection = activeMQConnectionFactory.createConnection();
        //第一个参数事务,第二个参数签收
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //创建主题,设置主题的名称
        Topic topic = session.createTopic(TOPIC_NAME);
        //创建生产者
        MessageProducer producer = session.createProducer(topic);
        //持久化设置
        producer.setDeliveryMode(DeliveryMode.PERSISTENT);
        connection.start();
        //向mq发送三条消息
        for(int i=0;i<3;i++){
            TextMessage textMessage = session.createTextMessage("msg------"+i);
            producer.send(textMessage);
        }
        producer.close();
        session.close();
        connection.close();
        System.out.println("------------------------------消息发送完成");
    }

消费者

  public static final String ACTIVEMQ_URL="tcp://192.168.164.134:61616";
    public static final String TOPIC_NAME="topic_pristst";
    public static void main(String[] args) throws JMSException, IOException {
        System.out.println("我是1号消费者");
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
        Connection connection = activeMQConnectionFactory.createConnection();
        connection.setClientID("1号");
        //第一个参数事务,第二个参数签收
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //创建主题,设置主题的名称
        Topic topic = session.createTopic(TOPIC_NAME);
        TopicSubscriber durableSubscriber = session.createDurableSubscriber(topic, "remark------------------------");
        connection.start();
        Message receive = durableSubscriber.receive();
        while (null!=receive){
            TextMessage textMessage = (TextMessage) receive;
            System.out.println("监听持久化消息。。。。。。。。。。"+textMessage.getText());
            receive=durableSubscriber.receive();
        }
        session.close();
        connection.close();
    }

注意:必须先启动消费者,只有消费者先注册后,当消费者宕机后重新连接才可以接受到所有消息。否则只能接收到订阅后的数据。

2.事务

事务偏生产者


//第一个参数事务,第二个参数签收
        Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
        

开启事务后必须提交,否则mq接受不到消息

  //关闭资源
        producer.close();
        session.commit(); //事务提交
        session.close();
        connection.close();

生产者开启事务

 public static final String ACTIVEMQ_URL="tcp://192.168.164.134:61616";
    public static final String TOPIC_NAME="topic_pristst";
    public static void main(String[] args) throws JMSException {
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
        Connection connection = activeMQConnectionFactory.createConnection();
        //第一个参数事务,第二个参数签收
        Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
        //创建主题,设置主题的名称
        Topic topic = session.createTopic(TOPIC_NAME);
        //创建生产者
        MessageProducer producer = session.createProducer(topic);
        //持久化设置
        producer.setDeliveryMode(DeliveryMode.PERSISTENT);
        connection.start();
        try {
            //向mq发送三条消息
            for(int i=0;i<10000;i++){
                TextMessage textMessage = session.createTextMessage("msg------"+i);
                producer.send(textMessage);
            }
            //关闭资源
            producer.close();
            session.commit();
            session.close();
            connection.close();
            System.out.println("------------------------------消息发送完成");
        } catch (Exception e){
            e.printStackTrace();
            session.rollback();
        }finally {

        }
    }

消费者开启事务

注意:消费者开启事务后如果事务没有提交,当消费者重新连接mq后消息会重复消费。
总结
开启事务的优点:当生产者数据发送到一半时出现异常可以进行回滚

3.签收

签收偏消费者

Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);

四种签收类型
在这里插入图片描述
AUTO_ACKNOWLEDGE:自动签收
CLIENT_ACKNOWLEDGE:手动签收
DUPS_OK_ACKNOWLEDGE:允许部分重复签收
SESSION_TRANSACTED:事务级
总结
1.消费者开起手动签收,如果没有确认签收,消费者下次连接会重复消费。
2.开启事务后签收将自动签收,即使签收成功,如果事务没有提交还是会重复消费

根据配置文件启动 activeMQ

在bin目录下执行性下面命令
./activemq start xbeen:file:文件地址(例如 ./activemq start xbean:file:…/conf/activemq.xml)

Java硬编码启动自己mq

 public static void main(String[] args) throws Exception {
        BrokerService brokerService = new BrokerService();
        brokerService.setUseJmx(true);
       brokerService.addConnector("tcp://localhost:61616");
        brokerService.start();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

桀骜浮沉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值