Java 消息队列 - ActiveMQ

1、消息队列介绍

消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题

实现高性能,高可用,可伸缩和最终一致性架构

使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ
消息队列的应用场景大致分为:


2、 消息队列使用

下载地址为:http://activemq.apache.org/download.html
解压后,可以看到MQ目录下有以下文件和目录

  • activemq-all-5.5.0.jar:所有MQ JAR包的集合,用于用户系统调用
  • bin:其中包含MQ的启动脚本
  • conf:包含MQ的所有配置文件
  • data:日志文件及持久性消息数据
  • example:MQ的示例
  • lib:MQ运行所需的所有Lib
  • webapps:MQ的Web控制台及一些相关的DEMO

启动MQ:
双击bin目录下的activemq.bat文件即可启动MQ
后台管理界面地址:http://localhost:8161/admin/

引用ActiveMQ 依赖jar

<!-- activeMq 消息队列 -->
<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-all</artifactId>
    <version>5.2.0</version>
</dependency>

3、 创建点对点的消息队列模式

创建生产者

/**
 * 消息生产者
 * @author PL
 *
 */
public class JMSProducer {
    private static final String username = ActiveMQConnection.DEFAULT_USER;
    private static final String password = ActiveMQConnection.DEFAULT_PASSWORD;
    private static final String url = ActiveMQConnection.DEFAULT_BROKER_URL;
    private static final int sendNum = 10;

    public static void product() {
        ConnectionFactory connectionFacotry;
        Connection connection = null ;
        Session session; //会话 接受或者发送消息的线程
        Destination destination; //消息目的地
        MessageProducer messProducer;   // 消息生产者
        // 实例化工厂连接
        connectionFacotry  = new ActiveMQConnectionFactory(JMSProducer.username,JMSProducer.password,JMSProducer.url);

        try {
            connection = connectionFacotry.createConnection();
            connection.start();  // 启动连接
            session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
            destination = session.createQueue("MSGQuence");
            messProducer = session.createProducer(destination);
            sendMess(session,messProducer);
            session.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if(null != connection) {
                try {
                    connection.close();
                } catch (JMSException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
    /**
     * 发送消息
     * @param session
     * @param messProducer
     * @throws JMSException 
     */
    public static void sendMess(Session session, MessageProducer messProducer) throws JMSException {
        for (int i = 0; i < 10; i++) {
            TextMessage txtMsg = session.createTextMessage("PL发送的消息"+i);
            System.out.println("发送消息:"+i);
            messProducer.send(txtMsg);
        }
    }
    public static void main(String[] args) {
        product();
    }
}

创建消费者

/**
 * 消息生产者(点对点)
 * @author PL
 *
 */
public class JMSConsumer {

    private static final String username = ActiveMQConnection.DEFAULT_USER;
    private static final String password = ActiveMQConnection.DEFAULT_PASSWORD;
    private static final String url = ActiveMQConnection.DEFAULT_BROKER_URL;
    private static final int sendNum = 10;

    @Test
    public static void consumer() {
        ConnectionFactory connectionFacotry;
        Connection connection = null ;
        Session session; //会话 接受或者发送消息的线程
        Destination destination; //消息目的地
        MessageConsumer messConsumer;   // 消息生产者

        // 实例化工厂连接
        connectionFacotry  = new ActiveMQConnectionFactory(JMSConsumer.username,JMSConsumer.password,JMSConsumer.url);

        try {
            connection = connectionFacotry.createConnection();
            connection.start();  // 启动连接
            session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
            destination = session.createQueue("MSGQuence");
            messConsumer = session.createConsumer(destination);
            //messConsumer.receive(200000);
            // 注册监听
            messConsumer.setMessageListener(new MyJMSListener());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        consumer();
    }
}

添加消费者监听

public class MyJMSListener implements MessageListener{
    @Override
    public void onMessage(Message message) {
        try {
            System.out.println(((TextMessage)message).getText());
        } catch (JMSException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

4、创建订阅topic模式消息队列

生产者

/**
 * 消息消费者(消息发布)
 * @author PL
 *
 */
public class JMSProducer_Subscribe {

    private static final String username = ActiveMQConnection.DEFAULT_USER;
    private static final String password = ActiveMQConnection.DEFAULT_PASSWORD;
    private static final String url = ActiveMQConnection.DEFAULT_BROKER_URL;
    private static final int sendNum = 10;

    @Test
    public static void product() {
        ConnectionFactory connectionFacotry;
        Connection connection = null ;
        Session session; //会话 接受或者发送消息的线程
        Destination destination; //消息目的地
        MessageProducer messProducer;   // 消息生产者

        // 实例化工厂连接
        connectionFacotry  = new ActiveMQConnectionFactory(JMSProducer_Subscribe.username,JMSProducer_Subscribe.password,JMSProducer_Subscribe.url);
        try {
            connection = connectionFacotry.createConnection();
            connection.start();  // 启动连接
            session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
            destination = session.createTopic("JMSTopic");
            messProducer = session.createProducer(destination);

            sendMess(session,messProducer);
            session.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if(null != connection) {
                try {
                    connection.close();
                } catch (JMSException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 发送消息
     * @param session
     * @param messProducer
     * @throws JMSException 
     */
    public static void sendMess(Session session, MessageProducer messProducer) throws JMSException {

        for (int i = 0; i < 10; i++) {
            TextMessage txtMsg = session.createTextMessage("PL发布的消息"+i);
            System.out.println("消息发布:"+i);
            messProducer.send(txtMsg);
        }
    }

    public static void main(String[] args) {
        product();
    }
}

消费者

/**
 * 消息生产者(消息订阅)
 * @author PL
 *
 */
public class JMSConsumer_Subscribe1 {

    private static final String username = ActiveMQConnection.DEFAULT_USER;
    private static final String password = ActiveMQConnection.DEFAULT_PASSWORD;
    private static final String url = ActiveMQConnection.DEFAULT_BROKER_URL;
    private static final int sendNum = 10;

    @Test
    public static void consumer() {
        ConnectionFactory connectionFacotry;
        Connection connection = null ;
        Session session; //会话 接受或者发送消息的线程
        Destination destination; //消息目的地
        MessageConsumer messConsumer;   // 消息生产者

        // 实例化工厂连接
        connectionFacotry  = new ActiveMQConnectionFactory(JMSConsumer_Subscribe1.username,JMSConsumer_Subscribe1.password,JMSConsumer_Subscribe1.url);

        try {
            connection = connectionFacotry.createConnection();
            connection.start();  // 启动连接
            session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
            destination = session.createTopic("JMSTopic");
            messConsumer = session.createConsumer(destination);
            //messConsumer.receive(200000);
            // 注册监听
            messConsumer.setMessageListener(new MyJMSListener_Subscribe());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        consumer();
    }
}

消息订阅监听

public class MyJMSListener_Subscribe implements MessageListener{

    @Override
    public void onMessage(Message message) {
        try {
            System.out.println("消息订阅1:"+((TextMessage)message).getText());
        } catch (JMSException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

猜你喜欢

转载自blog.csdn.net/panleiaiying/article/details/80935913