java消息中间件之一:队列模式与主题模式

首先,需要理解什么是队列和主题模式以及二者的区别,然后根据需要来应用到特定场景。

MS规范:Java消息服务(Java Message Service),是一个Java平台中关于面向消息的中间件的API,用于两个应用程序之间或者分布式 系统中发布消息,进行异步通信。

JMS相关概念:

  • 提供者 : 实现JMS规范的消息中间件服务器
  • 客户端 : 发送或接受消息的应用程序
  • 生成者/发布者 : 创建并发送消息的客户端
  • 消费者/订阅者 : 接受并处理消息的客户端
  • 消息 : 应用程序之间传递的数据内容
  • 消息模式 : 在客户端之间传递消息的方式,JMS中定义了主题和队列两种模式

JMS消息模式:

  • 队列模式
    • 客户端包括生产者和消费者
    • 消费者可以随时消费队列中的消息(消息发布者发布消息之前之后都可以)
    • 多个消费者会平均分担消息消费的任务
  • 主题模式
    • 客户端包括发布者和订阅者
    • 订阅者只能够在发布者发布消息之后之后进行消息的消费
    • 每个订阅者都会消费到相同的消息

这里写图片描述

这里写图片描述

1、Linux安装activemq、启动、进入管理页面
(我的地址是:http://66.112.220.202:8161/admin/index.jsp
这里写图片描述

2、创建maven项目、引入依赖

    <dependency>
      <groupId>org.apache.activemq</groupId>
      <artifactId>activemq-all</artifactId>
      <version>5.9.0</version>
    </dependency>

3、队列模式:编写消息创建者、消息消费者(生产者消费者模式)

(1)、消息创建者 AppProducer.java:

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class AppProducer {

    // 指定ActiveMQ服务的地址
    private static final String URL = "tcp://66.112.220.202:61616";
    // 指定队列的名称
    private static final String QUEUE_NAME = "queue-demo";

    public static void main(String[] args) throws JMSException {
        // 1.创建ConnectionFactory
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(URL);
        // 2.创建Connection
        Connection connection = connectionFactory.createConnection();
        // 3.启动连接
        connection.start();
        // 4.创建会话(第一个参数:是否在事务中处理)
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        // 5. 创建一个目标
        Destination destination = session.createQueue(QUEUE_NAME);

        // 6.创建一个生产者
        MessageProducer producer = session.createProducer(destination);

        for (int i = 0; i < 20; i++) {
            // 7.创建消息
            TextMessage textMessage = session.createTextMessage("test" + i);
            // 8.发布消息
            producer.send(textMessage);
            System.out.println("消息发送:" + textMessage.getText());
        }

        // 9.关闭连接
        connection.close();
    }

(2)、消息消费者 AppConsumer.java:

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class AppConsumer {

    private static final String URL = "tcp://66.112.220.202:61616";
    private static final String QUEUE_NAME = "queue-demo";

    public static void main(String[] args) throws JMSException {
        // 1.创建ConnectionFactory
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(URL);
        // 2.创建Connection
        Connection connection = connectionFactory.createConnection();
        // 3.启动连接
        connection.start();
        // 4.创建会话(第一个参数:是否在事务中处理)
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        // 5.创建一个目标
        Destination destination = session.createQueue(QUEUE_NAME);

        // 6.创建一个消费者
        MessageConsumer consumer = session.createConsumer(destination);
        // 7.创建一个监听器
        consumer.setMessageListener(new MessageListener() {
            public void onMessage(Message message) {
                TextMessage textMessage = (TextMessage)message;
                try {
                    System.out.println("接收消息:" + textMessage.getText());
                } catch (JMSException e) {
                    System.out.println("接收消息异常:");
                    e.printStackTrace();
                }
            }
        });

        // 8.关闭连接
        //connection.close();
    }
}

声明一点,测试的时候这里的消费者的关闭连接处需要注释掉,因为消费过程是一异步的,所以在还没有消费的情况下就进行连接关闭,是不会进行消息消费的。
4、测试环节

启动AppProducer.java:

消息发送:test0
    消息发送:test1
    消息发送:test2
    消息发送:test3
    消息发送:test4
    消息发送:test5
    消息发送:test6
    消息发送:test7
    消息发送:test8
    消息发送:test9
    消息发送:test10
    消息发送:test11
    消息发送:test12
    消息发送:test13
    消息发送:test14
    消息发送:test15
    消息发送:test16
    消息发送:test17
    消息发送:test18
    消息发送:test19

进入activemq管理界面:
这里写图片描述

启动AppConsumer.java:

接收消息:test0
    接收消息:test1
    接收消息:test2
    接收消息:test3
    接收消息:test4
    接收消息:test5
    接收消息:test6
    接收消息:test7
    接收消息:test8
    接收消息:test9
    接收消息:test10
    接收消息:test11
    接收消息:test12
    接收消息:test13
    接收消息:test14
    接收消息:test15
    接收消息:test16
    接收消息:test17
    接收消息:test18
    接收消息:test19

然后可以进行另外一种测试:首先开启两个消费者,进行消息产生监听,然后开启消息创建者进行创建,会发现两个消费者共同消费者20个消息,分别是第1、3、5、7… 和 2、4、6、8…

5、主题模式
这里不再赘述代码,因为代码演示上与队列模式区别仅仅在于一处代码片段的不同:

        // 5. 创建一个目标
        Destination destination = session.createTopic(TOPIC_NAME);

测试结果请自行演练。
这时的管理界面查看:
这里写图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值