JMS(java消息服务) 与ActiveMQ(消息队列)实战

1、基础知识:

1、JMS全称Java Message Service(java消息服务),其实就是两个java服务之间发消息
2、本文只介绍p2p消息模型(Point-to-Point),百度借个模式图
在这里插入图片描述
3、每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到他们被消费或超时
4、每个消息只有一个消费者
5、发送者和接收者之间没有依赖关系,无论接收者是什么状态,发送者都可以向队列发送消息(JMS的客户端之间可以通过JMS服务进行异步的消息传输
6、接收者成功接收后,会向队列报告自己接收成功


2、环境准备:安装ActiveMQ

1、上图中的消息队列就是这边的ActiveMQ,他是老牌的消息队列,使用Java语言编写。对JMS支持最好,采用多线程并发,资源消耗比较大
2、从官网下载安装包在配置启动实在是麻烦,我前几篇文章都讲过docker相关的部署,这边我就之直接通过docker部署了,一行命令即可

docker run -d --name activemq -p 61617:61616 -p 8162:8161 webcenter/activemq

3、这边浏览器访问IP+端口8162就能访问的ActiveMQ的web界面,默认用户名密码都是admin,登录成功后可以看到此时队列是空的

在这里插入图片描述


3、下面开始写代码

1、准备一个springboot的空项目,添加activemq依赖,pom.xml如下,version会跟着你的springboot版本

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>

2、创建一个消息发送者,注意这边是TCP协议,小伙伴记得把IP换成自己的

package com.example.demo.jms;


import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class Sender {
    
    

    private static final int SEND_NUMBER = 5;

    public static void main(String[] args) {
    
    
        // ConnectionFactory
        ConnectionFactory connectionFactory;
        // Connection
        Connection connection = null;
        // Session
        Session session;
        // Destination
        Destination destination;
        // MessageProducer
        MessageProducer producer;
        // TextMessage message;

        connectionFactory = new ActiveMQConnectionFactory(
                ActiveMQConnection.DEFAULT_USER,
                ActiveMQConnection.DEFAULT_PASSWORD,
                "tcp://192.168.1.234:61617");
        try {
    
    
            connection = connectionFactory.createConnection();
            connection.start();
            session = connection.createSession(Boolean.TRUE,
                    Session.AUTO_ACKNOWLEDGE);
            destination = session.createQueue("FirstQueue");
            producer = session.createProducer(destination);
            producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
            sendMessage(session, producer);
            session.commit();
        } catch (Exception e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            try {
    
    
                if (null != connection)
                    connection.close();
            } catch (Throwable ignore) {
    
    
            }
        }
    }

    public static void sendMessage(Session session, MessageProducer producer)
            throws Exception {
    
    
        for (int i = 1; i <= SEND_NUMBER; i++) {
    
    
            TextMessage message = session
                    .createTextMessage("ActiveMq 发送方发送: " + i);
            System.out.println("发送方发送了" + i);
            producer.send(message);
        }
    }

}


3、我们把代码跑起来,查看结果,首先控制台输出成功发送5条消息,我们再从ActiveMQ的web管理界面查看
在这里插入图片描述


4、现在我们创建接收者

package com.example.demo.jms;


import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class Receiver {
    
    

    public static void main(String[] args) {
    
    
        // ConnectionFactory
        ConnectionFactory connectionFactory;
        // Connection
        Connection connection = null;
        // Session
        Session session;
        // Destination
        Destination destination;

        MessageConsumer consumer;
        connectionFactory = new ActiveMQConnectionFactory(
                ActiveMQConnection.DEFAULT_USER,
                ActiveMQConnection.DEFAULT_PASSWORD,
                "tcp://192.168.1.234:61617");
        try {
    
    

            connection = connectionFactory.createConnection();
            connection.start();
            session = connection.createSession(Boolean.FALSE,
                    Session.AUTO_ACKNOWLEDGE);
            destination = session.createQueue("FirstQueue");
            consumer = session.createConsumer(destination);
            while (true) {
    
    
                TextMessage message = (TextMessage) consumer.receive(500000);
                if (null != message) {
    
    
                    System.out.println("收到的消息有" + message.getText());
                } else {
    
    
                    break;
                }
            }
        } catch (Exception e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            try {
    
    
                if (null != connection)
                    connection.close();
            } catch (Throwable ignore) {
    
    
            }
        }
    }

}



5、同样我们把main()方法跑起来查看结果,控制台和web端都能查看到接收者接收到5条消息
在这里插入图片描述


参考文献:https://blog.csdn.net/u014001866/article/details/50918876?utm_medium=distribute.pc_relevant.none-task-blog-searchFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-searchFromBaidu-1.control

猜你喜欢

转载自blog.csdn.net/weixin_45452416/article/details/111238944
今日推荐