activemq学习笔记

并行方式:把一部分业务异步处理

 

如果用的是腾讯云的服务器:无法启动,可能是hostname 带有下划线造成的,修改下划线即可:

hostnamectl set-hostname 主机名 # 新的主机名不能有下划线

发布订阅模式:一定是消费者先去订阅,然后才可以收到消息

jms协议的消息头:

我们点开消息查看:

消息体:

消息体中的属性 :

消息的属性我们可以用来:消息的过滤,消息的去重,标记等功能

消息的持久化:

防止消息丢失:我们就用第二种或第三种方式

基于数据库:比较麻烦,但是方便我们数据的查询

activemq持久化流程图:

基于内存的配置:

springboot默认用的是日志类型去存储消息:如果需要基于内存配置则需要修改配置(不推荐使用)

当我们发送了消息,然后重启mq,发现消息丢失

基于日志的方式配置:

日志存储在data/kahadb中

基于jdbc的配置:

然后需要在activemq的配置文件activemq.xml:

 

使用我们自己定义的数据源

然后我们需要druid和mysql的jar包:放到activemq的lib下面

然后创建数据库:db_activemq

然后重新启动activemq就会看到数据库自动建了三个表:

只要消息没有被消息掉,消息仍然存在于ACTIVEMQ_MSGS表中

消息事务

消息确认机制:

消息的投递方式:

1.异步投递

如果是原生API我们可以直接去修改参数

如果是用的spring或者springboot时,利用异步的方式去投递信息

异步发送怎么知道消息发送成功了:

 

/**
     * 该方法演示我们异步投递消息,
     * @return
     */
    public String sendQueue() {
        Connection connection = null;
        Session session = null;
        ActiveMQMessageProducer producer = null;
        //获取连接工厂
        ConnectionFactory connectionFactory =
                jmsQueueTemplate.getConnectionFactory();
        try {
            connection = connectionFactory.createConnection();
            session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
            Queue queue = session.createQueue("spring_queue_async");
            int count = 10;

            producer = (ActiveMQMessageProducer) session.createProducer(queue);
            producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

            long start = System.currentTimeMillis();
            for (int i = 0; i < count; i++) {
                //创建需要发送的消息
                TextMessage textMessage = session.createTextMessage("hello");
                // 设置消息唯一Id
                String msgid = UUID.randomUUID().toString();
                textMessage.setJMSMessageID(msgid);   // 这里设置id虽然mq中不起作用,主要用来记录我们那条数据发送失败,利于后期我们重新发送
                producer.send(textMessage, new AsyncCallback() {
                    @Override
                    public void onSuccess() {
                        // 使用msgid标记来进行消息发送成功的处理
                        System.out.println(msgid + "消息接收成功");
                    }

                    @Override
                    public void onException(JMSException e) {
                        //使用msgid标记消息发送失败的
                        System.out.println(msgid + "消息发送失败");
                        e.printStackTrace();
                    }
                });
            }
            session.commit();
        }catch(Exception e) {
            e.printStackTrace();
        }
        return "1";
    }

2. 延迟投递:

/**
     * 演示延迟投递
     * @return
     */
    public String sendQueue2() {
        Connection connection = null;
        Session session = null;
        ActiveMQMessageProducer producer = null;
        //获取连接工厂
        ConnectionFactory connectionFactory =
                jmsQueueTemplate.getConnectionFactory();
        try {
            connection = connectionFactory.createConnection();
            session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
            Queue queue = session.createQueue("spring_queue_async");
            int count = 10;

            producer = (ActiveMQMessageProducer) session.createProducer(queue);
            producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
            long start = System.currentTimeMillis();

            //创建要发送的消息
            TextMessage textMessage = session.createTextMessage("hello");
            // 设置延时时长(延时10秒)
            textMessage.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, 10000);
            producer.send(textMessage);
            session.commit();
        }catch(Exception e) {
            e.printStackTrace();
        }
        return "1";
    }

3.定时投递:

死信队列:

我们修改配置文件:给每一个队列建一个死信队列

消息重发的策略:默认是每隔一秒发送一次,发送6次

企业面试题:

1.Activemq宕机了怎么办:

zookeeper的搭建:参考我的博客zookeeper的学习笔记:

https://blog.csdn.net/qq_27922171/article/details/106644982

下面是搭建activemq的集群:

我们需要吸怪activemq的配置文件

然后还要修改activemq的端口:在配置文件conf/jetty.xml

修改好后,启动服务器

启动完后,因为选举的原因,只有一台服务器可以访问管理界面,我们可以自己试是那台服务器

我们也可以可以利用zookeeper的客户端界面工具ZooInspector, 查看哪个服务器了被选举作位主服务器:

如何防止消费方重复消息消息(也可以理解为消息的幂等性问题):

如何防止消息的丢失:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值