消息中间件之JMS实践(ActiveMQ)

1、消息中间件作用

     作为一个消息传递中间层,方便信息发送者和接受者通信。

2、消息中间件好处

    1、信息解耦:信息发送方和接收方通过中间件通信,不需要直接通信。

    2、异步:消息被中间件处理,发送方和接收方都不用直接通信。

    3、安全可靠:中间件做的还是很可靠地。。

    4、横向扩展:支持多信息发送方和接收方

    5、顺序保证:中间件功能。

3、常见消息中间件

    JMS(Java Message Service):java平台中面向消息通信的API

    1、ActiveMQ:Apache开源总线

    2、RabbitMQ:同样是开源的,是一种AMQP协议实现,服务器是erlang编写

    3、kafka:支持高吞吐量的分布式订阅系统,是一种分布式、可靠地、分区的日志订阅系统


4、JMS

     1、队列模型:客户端包括生产者和消费者、队列中的(一个)消息只能被一个消费者消费;消费者可以随时消费队列中的消息

     2、主题模型:客户端包括发布者和订阅者;主题中的消息能被所有订阅者订阅;消费者不能消费到订阅前发布的消息

5、队列模式代码

1、生产者

package com;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;

public class AppProductor {
    private  static final String url="tcp://127.0.0.1:61616";
    private static final String queryName = "queue-test";
    public static void main(String[] args) throws Exception{


        //获得连接工厂
        ConnectionFactory cf = new ActiveMQConnectionFactory(url);
        //得到连接
        Connection connection = cf.createConnection();
        //启动连接
        connection.start();
        //启动会话
        Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
        //创建目标
        Destination destination = session.createQueue(queryName);
        //创建生产者
        MessageProducer producer = session.createProducer(destination);

        for (int i=0;i<100;i++){
            TextMessage message = session.createTextMessage("test"+i);
            producer.send(message);
        }
        connection.close();

    }

}

2、消费者

package com;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;

public class AppConsumer {
    private  static final String url="tcp://127.0.0.1:61616";
    private static final String queryName = "queue-test";
    public static void main(String[] args) throws JMSException {


        //获得连接工厂
        ConnectionFactory cf = new ActiveMQConnectionFactory(url);
        //得到连接
        Connection connection = cf.createConnection();
        //启动连接
        connection.start();
        //启动会话
        Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
        //创建目标
        Destination destination = session.createQueue(queryName);
        //创建消费者
        MessageConsumer consumer = session.createConsumer(destination);

        consumer.setMessageListener(new MessageListener() {
            public void onMessage(Message message){
                TextMessage textMessage = (TextMessage) message;
                try {
                    System.out.println("接收到的消息是:" + textMessage.getText());
                }catch (JMSException e){
                    e.printStackTrace();
                }
            }
        });
        //connection.close();

    }
}

需要注意的是jdk版本需要是1.8以上

6、主题模式实践

1、生产者代码

package com.topic;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;

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 Exception{


        //获得连接工厂
        ConnectionFactory cf = new ActiveMQConnectionFactory(url);
        //得到连接
        Connection connection = cf.createConnection();
        //启动连接
        connection.start();
        //启动会话
        Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
        //创建目标
        Destination destination = session.createTopic(topicName);
        //创建生产者
        MessageProducer producer = session.createProducer(destination);

        for (int i=0;i<100;i++){
            TextMessage message = session.createTextMessage("test"+i);
            producer.send(message);
        }
        connection.close();

    }
}

2、消费者代码

package com.topic;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;

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 {


        //获得连接工厂
        ConnectionFactory cf = new ActiveMQConnectionFactory(url);
        //得到连接
        Connection connection = cf.createConnection();
        //启动连接
        connection.start();
        //启动会话
        Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
        //创建目标
        Destination destination = session.createTopic(topicName);
        //创建消费者
        MessageConsumer consumer = session.createConsumer(destination);

        consumer.setMessageListener(new MessageListener() {
            public void onMessage(Message message){
                TextMessage textMessage = (TextMessage) message;
                try {
                    System.out.println("接收到的消息是:" + textMessage.getText());
                }catch (JMSException e){
                    e.printStackTrace();
                }
            }
        });
        //connection.close();

    }
}

7、综述

ActiveMQ的主题模式和队列模式代码大同小异,只需要关注主题模式是发布订阅模型、队列模式是生产者消费者模型。发布订阅是一种广播形式,可以用来做消息同步,而生产者消费者模型可以用来做负载均衡

猜你喜欢

转载自blog.csdn.net/u012322855/article/details/80716701