尚硅谷ActiveMQ学习笔记(3)-- JMS规范和落地产品

本文深入解析JMS组件及其在MQ中的应用,涵盖JMSProvider、生产者、消费者和消息结构,重点讲解了持久性队列与非持久主题的区别,以及何时选择持久订阅。实例展示了如何在ActiveMQ中实现持久性消息传递和非持久发布订阅模式。
摘要由CSDN通过智能技术生成

一、是什么

在这里插入图片描述

二、MQ中间件的其他落地产品

在这里插入图片描述
消息队列的详细对比
在这里插入图片描述

三、JMS的组成和特点

1、JMS privider

实现JMS接口与规范的消息中间件,也就是我们的MQ服务器

2、JMS producer

消息生产者,创建与发送JMS消息的客户端应用

3、JMS consumer

消息的消费者,接受与处理JMS消息的客户端应用

4、JMS message
①、消息头

JMSdesination:消息发送的目的地,主要是指Queue与Topic
JMSDeliveryMode
在这里插入图片描述
JMSExpiration
在这里插入图片描述
JMSPriority
在这里插入图片描述
JMSMessageID:唯一识别每个消息的表示,由MQ产生

②、消息体

1、封装具体消息的数据
2、五种消息体的格式
在这里插入图片描述
3、发送和接受的消息体类型必须是一致对应的

③、消息属性

在这里插入图片描述

如果需要使用消息头以外的值,那么可以使用消息属性///一种加强型的api
识别/去重/重点标注等操作非常有用的方法

四、JMS的可靠性

1、persistent:持久性
①、参数设置说明

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

②、持久的queue

在这里插入图片描述

③、持久的topic

注意:先启动订阅再启动生产

持久的发布主题生产者

package com.atguigu.activemq.queue;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

/**
 * @ClassName JmsProduce
 * @Description TODO
 * @Author DuanYueFeng
 * @Version 1.0
 **/
public class JmsProduce_Topic_p {
    public static final String URL = "tcp://10.112.70.211:61616";
    public static final String topic_name = "topic_p";

    public static void main(String[] args) throws JMSException {
        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(URL);
        Connection connection = factory.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();

        for (int i = 1; i <=3; i++) {
            TextMessage textMessage = session.createTextMessage("Topic mag..." + i);
            producer.send(textMessage);
        }
        producer.close();
        session.close();
        connection.close();
        System.out.println("完成....");
    }
}

在这里插入图片描述
持久的订阅主题消费者

package com.atguigu.activemq.queue;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.camel.component.test.TestComponent;

import javax.jms.*;
import java.io.IOException;

/**
 * @ClassName JmsConsumer
 * @Description TODO
 * @Author DuanYueFeng
 * @Version 1.0
 **/
public class JmsConsumer_Topic_p {
    public static final String URL = "tcp://10.112.70.211:61616";
    public static final String topic_name = "topic_p";

    public static void main(String[] args) throws JMSException, IOException, InterruptedException {
        System.out.println("我是3号消费者。。。");
        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(URL);
        Connection connection = factory.createConnection();
        connection.setClientID("z3");
        Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
        Topic topic = session.createTopic(topic_name);
        TopicSubscriber durableSubscriber = session.createDurableSubscriber(topic, "remark..");

       

        Message message = durableSubscriber.receive();

        while (null!=message){
            TextMessage textMessage = (TextMessage)message;
            System.out.println("收到的持久化:"+textMessage.getText());
            message = durableSubscriber.receive(1000L);
        }

        System.in.read();
//        Thread.sleep(1000);
        session.close();
        connection.close();
        System.out.println("完成....");
    }
}

在这里插入图片描述
在这里插入图片描述

类似微信公众号的订阅发布

测试先发送消息
消费者关机,消费者启动之后可以收到之前发的消息
 
测试先发送消息
消费者关机,服务器宕机,消费者启动之后可以收到之前发的消息
④、非持久的topic

没有意义,因为发布订阅模式是先启动订阅在启动生成,消息已经被消费了。如果先启动生产者后启动订阅者,消息会被当作废消息

2、transaction:事务
①、producer提交时的事务

在这里插入图片描述

②、事务偏生产者/签收偏消费者
3、Acknowledge:签收

在这里插入图片描述

五、JMS的点对点模式总结

在这里插入图片描述

六、JMS的发布订阅模式总结

在这里插入图片描述

1、非持久订阅

在这里插入图片描述

2、持久订阅

在这里插入图片描述
在发布端的持久化投递好像没有意义,注释之后,订阅者离线重上依然可以收到没有签收的消息。
在这里插入图片描述

3、用哪个

当所有消息必须被接受,则用持久订阅。当丢失消息能够被容忍,则用非持久订阅

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

exodus3

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

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

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

打赏作者

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

抵扣说明:

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

余额充值