ActiveMQ·基础篇(一)

        JMS 叫做 Java 消息服务(Java Message Service),是 Java 平台上有关面向 MOM 的技术规范,旨在通过提供标准的产生、发送、接收和处理消息的 API 简化企业应用的开发,类似于 JDBC 和关系型数据库通信方式的抽象。

        ActiveMQ 是一个 MOM,具体来说是一个实现了 JMS 规范的系统间远程通信的消息代理。

        MOM 就是面向消息中间件(Message-oriented middleware),是用于以分布式应用或系统中的异步、松耦合、可靠、可扩展和安全通信的一类软件。MOM 的总体思想是它作为消息发送器和消息接收器之间的消息中介,这种中介提供了一个全新水平的松耦合。

        即相当于人与人通信之间的邮局,人们信件通讯的时候不需要以两人直接进行通讯 ,而是通过一个第三方中介寄存信件,一个取,一个存。

        以上图片显示的是整个JMS的组件

  • Provider:纯 Java 语言编写的 JMS 接口实现(比如 ActiveMQ 就是)
  • Domains:消息传递方式,包括点对点(P2P)、发布/订阅(Pub/Sub)两种
  • Connection factory:客户端使用连接工厂来创建与 JMS provider 的连接
  • Destination:消息被寻址、发送以及接收的对象

ActiveMq的两种主要通讯方式

    1.P2P(点对点的方式)

        点对点:消息域使用 queue 作为 Destination,消息可以被同步或异步的发送和接收,每个消息只会给一个 Consumer 传送一次。

         Consumer 可以使用 MessageConsumer.receive() 同步地接收消息,也可以通过注册一个 MessageListener 实现异步接收。多个 Consumer 可以注册到同一个 queue 上,但一个消息只能被一个 Consumer 所接收,然后由该 Consumer 来确认消息。并且在这种情况下,Provider 对所有注册的 Consumer 以轮询的方式发送消息。

以下即为点对点的方式流程图

    1.sub/pub(发布/订阅,Publish/Subscribe)

    消息域使用 topic 作为 Destination,发布者向 topic 发送消息,订阅者注册接收来自 topic 的消息。发送到 topic 的任何消息都将自动传递给所有订阅者。接收方式(同步和异步)与 P2P 域相同。除非显式指定,否则 topic 不会为订阅者保留消息。当然,这可以通过持久化(Durable)订阅来实现消息的保存。这种情况下,当订阅者与 Provider 断开时,Provider 会为它存储消息。当持久化订阅者重新连接时,将会受到所有的断连期间未消费的消息。如图,每个发布者发布的信息,每个订阅者都会收到,而不是和点对点一样一条信息只能由一个接收者接受。

ActiveMq创建应用程序的流程

  • 获取连接工厂
  • 使用连接工厂创建连接
  • 启动连接
  • 从连接创建会话
  • 获取 Destination
  • 创建 Producer,或
    • 创建 Producer
    • 创建 message
  • 创建 Consumer,或发送或接收message发送或接收 message
    • 创建 Consumer
    • 注册消息监听器(可选)
  • 发送或接收 message
  • 关闭资源(connection, session, producer, consumer 等

以下是一个简单的activeMq发送P2P的简单流程样式。


import org.apache.activemq.ActiveMQConnectionFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.jms.*;

/**
 * @author pontus
 * @date create in 11:25 2018/11/2
 * @description
 */
@RestController
@Configuration
public class JmsTemplateConfiguration {

    @Value("${spring.activemq.user}")
    private String usrName;

    @Value("${spring.activemq.password}")
    private  String password;

    @Value("${spring.activemq.broker-url}")
    private  String brokerUrl;

    ConnectionFactory connectionFactory;
    Connection connection;
    Session session;
    Destination destination;
    MessageProducer producer;
    MessageConsumer consumer;
    Message message;
    boolean useTransaction = false;

    @RequestMapping("ds")
    public void ss(){
        try {
            //使用ActiveMQ时:
            connectionFactory = new ActiveMQConnectionFactory(usrName, password, brokerUrl);
            connection = connectionFactory.createConnection();
            connection.start();
            session = connection.createSession(useTransaction, Session.AUTO_ACKNOWLEDGE);
            destination = session.createQueue("TEST.QUEUE");
            //生产者发送消息
            producer = session.createProducer(destination);


            message = session.createTextMessage("this is a test");
            producer.send(message);

            //消费者同步接收
            consumer = session.createConsumer(destination);
            message = (TextMessage) consumer.receive(1000);
            System.out.println("Received message: " + message);
            //消费者异步接收
            consumer.setMessageListener(new MessageListener() {
                @Override
                public void onMessage(Message message) {
                    if (message != null) {
                        System.out.println(message);
                    }
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                producer.close();
                session.close();
                connection.close();
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/pontuss/article/details/83656381
今日推荐