一、ActiveMQ理解

版权声明:转载请注明出处 https://blog.csdn.net/chenmingxu438521/article/details/90733370

一、背景

1.在客户端与服务器进行通讯时.客户端调用后,必须等待服务对象完成处理返回结果才能继续执行。客户与服务器对象的生命周期紧密耦合,客户进程和服务对象进程都都必须正常运行;如果由于服务对象崩溃或者网络故障导致用户的请求不可达,客户会受到异常,点对点通信: 客户的一次调用只发送给某个单独的目标对象。下面的图不是同步方式,是异步方式,这样就产生了ActiveMQ。

二、什么是消息中间件

1.面向消息的中间件(MessageOrlented MiddlewareMOM)较好的解决了以上问题。发送者将消息发送给消息服务器,消息服务器将消感存放在若千队列中,在合适的时候再将消息转发给接收者。这种模式下,发送和接收是异步的,发送者无需等待; 二者的生命周期未必相同: 发送消息的时候接收者不一定运行,接收消息的时候发送者也不一定运行;一对多通信: 对于一个消息可以有多个接收者。

三、什么是JMS(其实就是消息中间件)

1.JMS是java的消息服务,JMS的客户端之间可以通过JMS服务进行异步的消息传输。

2.消息模型

2.1.点对点通讯方式,生产者、消息队列、消费者、一对一通讯,生产者产生消息,只允许有一个消费者进行消费。

2.1.1.特点:

  1. 每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中)
  2. 发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被发送到队列
  3. 接收者在成功接收消息之后需向队列应答成功

2.2.发布订阅通讯方式,生产者、主题、消费者,一个生产者,多个消费者。

四、消息中间件的应用场景

五、本地安装

1.直接解压

2.启动

3.浏览器访问:127.0.0.1:8161(账户/密码:admin)

六、编写生产者代码

1.项目结构图

2.pom.xml

<dependency>
   <groupId>org.apache.activemq</groupId>
   <artifactId>activemq-core</artifactId>
   <version>5.7.0</version>
</dependency>

3.Producer.java

public class Producer {
    public static void main(String[] args) throws JMSException {
        // 获取mq连接工程
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,
                ActiveMQConnection.DEFAULT_PASSWORD, "tcp://127.0.0.1:61616");
        // 创建连接
        Connection createConnection = connectionFactory.createConnection();
        // 启动连接
        createConnection.start();
        // 创建会话工厂
        Session session = createConnection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
        // 创建队列
        Destination destination = session.createQueue("cmx_queue");
        MessageProducer producer = session.createProducer(destination);
        // 不持久化
        producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
        for (int i = 1; i <= 5; i++) {
            System.out.println("我是生产者: " + i);
            //发送消息
            sendMsg(session, producer, "我是生产者: " + i);

        }
        System.out.println("生产者 发送消息完毕!!!");
    }
    public static void sendMsg(Session session, MessageProducer producer, String i) throws JMSException {
        TextMessage textMessage = session.createTextMessage("hello activemq " + i);
        producer.send(textMessage);
    }
}

4.启动项目

七、编写消费者代码

1.项目结构图

2.pom.xml

<dependency>
   <groupId>org.apache.activemq</groupId>
   <artifactId>activemq-core</artifactId>
   <version>5.7.0</version>
</dependency>

3.Consumer.java

public class Consumer {
    public static void main(String[] args) throws JMSException {
        // 获取mq连接工程
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,
                ActiveMQConnection.DEFAULT_PASSWORD, "tcp://127.0.0.1:61616");
        // 创建连接
        Connection createConnection = connectionFactory.createConnection();
        // 启动连接
        createConnection.start();
        // 创建会话工厂
        Session session = createConnection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
        // 创建队列
        Destination destination = session.createQueue("cmx_queue");
        MessageConsumer createConsumer = session.createConsumer(destination);
        while (true) {
            //监听消息
            TextMessage textMessage =(TextMessage) createConsumer.receive();
            if(textMessage!=null){
                String text= textMessage.getText();
                System.out.println("消费者 获取到消息:  text:"+text);
            }else{
                break;
            }
        }
        System.out.println("消费者消费消息完毕!!!");
    }
}

4.结果(消费成功了,后台已经打印日志了)

八、mq的主题与订阅的代码实现

1.项目图

2.pom.xml

<dependency>
   <groupId>org.apache.activemq</groupId>
   <artifactId>activemq-core</artifactId>
   <version>5.7.0</version>
</dependency>

3.Producer.java

/**
 * Created by ChenMingXu on 2019/6/2.
 */
public class Producer {
    public static void main(String[] args) throws JMSException {
        // 获取mq连接工程
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,
                ActiveMQConnection.DEFAULT_PASSWORD, "tcp://127.0.0.1:61616");
        // 创建连接
        Connection createConnection = connectionFactory.createConnection();
        // 启动连接
        createConnection.start();
        // 创建会话工厂
        Session session = createConnection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
        //Destination destination = session.createTopic("cmx-topic");
        MessageProducer producer = session.createProducer(null);
        // 不持久化
        producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
        for (int i = 1; i <= 5; i++) {
            System.out.println("我是生产者: " + i);
            sendMsg(session, producer, "我是生产者: " + i);
        }
        System.out.println("生产者 发送消息完毕!!!");
    }
    public static void sendMsg(Session session, MessageProducer producer, String i) throws JMSException {
        TextMessage textMessage = session.createTextMessage("hello activemq " + i);
        Destination destination = session.createTopic("cmx11-topic");
        producer.send(destination, textMessage);
    }
}

4.Consumer.java

public class Consumer {
    public static void main(String[] args) throws JMSException {
        System.out.println("Consumer");
        // 获取mq连接工程
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,
                ActiveMQConnection.DEFAULT_PASSWORD, "tcp://127.0.0.1:61616");
        // 创建连接
        Connection createConnection = connectionFactory.createConnection();
        // 启动连接
        createConnection.start();
        // 创建会话工厂
        Session session = createConnection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
        // 创建队列
        Destination destination = session.createTopic("cmx11-topic");
        MessageConsumer createConsumer = session.createConsumer(destination);
        while (true) {
            // 监听消息
            TextMessage textMessage = (TextMessage) createConsumer.receive();
            if (textMessage != null) {
                String text = textMessage.getText();
                System.out.println("消费者获取到消息:  text:" + text);
            } else {
                break;
            }
        }
        System.out.println("消费者消费消息完毕!!!");
    }
}

5.测试结果(先启动消费者、在启动生产者、并且支持多个消费者)

九、总结

Always keep the faith!!!   天太晚了,凌晨一点了,各位晚安

猜你喜欢

转载自blog.csdn.net/chenmingxu438521/article/details/90733370