Java消息中间件简单应用

本篇博客主要来自慕课网的课程:Java消息中间件

中间件介绍

一、什么是中间件

非底层操作系统软件,非业务应用软件,不是直接给最终用户使用的,不能直接给客户带来价值的软件统称为中间件。

二、什么是消息中间件

关注于数据的发送和接受,利用高效可靠的异步消息传递机制集成分布式系统
upwaJH.md.png

三、什么是JMS

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

四、什么是AMQP

AMQP(advanced message queuing protocol)是一个提供统一消息服务的应用层标准协议,基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同开发语言等条件的限制。

 

JMS规范AMQP协议
定义Java apiWire-protocol
跨语言
消息类型提供两种消息模型:
p2p,pub/sub
提供了五种消息模型:
direct,fanout,topic,headers,system
消息类型TextMessage,MapMessage,BytesMessage,StreamMessage,ObjectMessage,Messagebyte[]
综合评价JMS 定义了 Java API 层面的标准;在 Java 体系中,多个 client 均可以通过JMS进行交互,不需要应用修改代码,但是其对跨平台的支持较差AMQP 的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全

五、常见消息中间件对比

ActiveMQRabbitMQKafka
跨语言支持(Java优先)语言无关支持(Java优先)
支持协议OpenWire,Stomp,XMPP,AMQPAMQP
优点遵循JMS规范
安装部署方便
继承Erlang天生的并发性
最初用于金融行业,稳定性安全性有保障
依赖zk,可动态扩展节点
高性能、高吞吐量、无限扩容、消息可指定追溯
缺点根据其他用户反馈,会莫名丢失消息。目前重心在下代产品apolle上,目前社区不活跃,对5.X维护较少(这是17年的了,现在不知道怎样Erlang语言难度较大,不支持动态扩展严格的顺序机制,不支持消息优先级,不支持标准的消息协议,不利于平台迁移
综合评价适合中小企业级消息应用场景,不适合上千个队列的应用场景适合对稳定性要求搞的企业级应用一般应用在大数据日志处理或对实时性(少量延迟),可靠性(少量丢数据)要求稍低的场景使用。

JMS规范

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

一、消息模式

1. 队列模式

  • 客户端包括生产者和消费者
  • 队列中的消息只能被一个消费者消费
  • 消费者可以随时消费队列中的消息
    upy701.md.png

2. 主题模式

  • 客户端包括发布者和订阅者
  • 主题中的消息被所有订阅者消费
  • 消费者不能消费订阅之前就发送到主题中的消息
    up6iAP.md.png

二、JMS编码接口

  • ConnectionFactory 用于创建连接到消息中间件的连接工厂
  • Connectin 代表了应用程序和消息服务器之间的通信链路
  • Destination 指消息发布和接收的地点,包括队列或主题
  • Session 标一个单线程的上下文,用于发送和接收消息
  • MessageConsumer 由会话创建, 用于接收发送到目标的消息
  • MessageProducer 由会话创建,于发送消感到目标
  • Message 是在消费和生产者之间传送的对象,消息头,一组消息属性,一个消息体

upcDZn.md.png

代码DEMO

启动ActiveMQ

代码DEMO

  • 新建一个空白的 maven 项目
  • 添加 ActiveMQ 的依赖
	<dependencies>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-all</artifactId>
            <version>5.14.0</version>
        </dependency>
    </dependencies>
  • ActiveMQ中 8161 是管理端口,61616 是消息的接收/发送端口

1. 队列模式

生产者
package com.imooc.jms.queue;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class AppProducer {

    private static final String url = "tcp://127.0.0.1:61616";
    private static final String queueName = "queue-test";

    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(queueName);

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

        for (int i = 0; i < 100; i++) {
            //7. 创建消息
            TextMessage textMessage = session.createTextMessage("test" + i);
            //8. 发布消息
            producer.send(textMessage);

            System.out.println("发送消息" + textMessage.getText());
        }

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

消费者
package com.imooc.jms.queue;


import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class AppConsumer {

    private static final String url = "tcp://127.0.0.1:61616";
    private static final String queueName="queue-test";

    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(queueName);

        //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) {
                    e.printStackTrace();
                }
            }
        });
        //8. 关闭连接
//        connection.close();
        //异步过程 ,没有接受到就关闭了

        //两个消费者, 一人一个, 平均消费
    }

}

2. 主题模式

发布者
package com.imooc.jms.topic;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class AppProducer {

    private static final String url = "tcp://127.0.0.1:61616";
    private static final String topicName="topic-test";

    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.createTopic(topicName);

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

        for (int i = 0; i < 100; i++) {
            //7. 创建消息
            TextMessage textMessage = session.createTextMessage("test"+i);
            //8. 发布消息
            producer.send(textMessage);

            System.out.println("发送消息"+textMessage.getText());
        }
        
        //9. 关闭连接
        connection.close();
    }
    
}

订阅者
package com.imooc.jms.topic;


import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class AppConsumer {

    private static final String url = "tcp://127.0.0.1:61616";
    private static final String topicName="topic-test";

    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.createTopic(topicName);

        //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) {
                    e.printStackTrace();
                }
            }
        });
        //主题模式    消费者只接受启动后生产者发送的消息    每个消费者都会受到一条消息
        //8. 关闭连接
//        connection.close();
        //异步过程 ,没有接受到就关闭了

    }

}


消息查看

  • 打开浏览器输入地址:127.0.0.1:8161进入 ActiveMQ 页面

  • 选择第一个进入管理页面,用户名和密码都为 admin
    upfgKS.png

  • queues 为队列模式消息,topic 为主题模式消息
    uphso9.md.png

  • 运行程序中的生产者或发布者后,就会有消息出现,并查看消息是否已经被接收

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值