ActiveMQ入门demo

           ActiveMQ是消息队列的一种,消息队列主要作用是:应用之间的解耦,进行异步通信等。下面的例子主要ActiveMQ(版本是:5.15.11)的入门demo,最好Linux中已经安装了ActiveMQ,没有安装也没有关系。ActiveMQ可以看做是生产者-消费者模型,包括队列和主题两者类型。

1.依赖:maven的pom.xm文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.qxf</groupId>
    <artifactId>activemq</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-all</artifactId>
            <version>5.15.11</version>
        </dependency>

    </dependencies>

</project>

2. 队列:生产者,详细的信息,写到了代码中

package com.qxf.activemq.queue;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

/**
 * @Auther: qiuxinfa
 * @Date: 2019/1/2
 * @Description: com.qxf.activemq.queue
 */
public class JmsProduce {
//    public static final String AVTIVEMQ_URL = "tcp://192.168.231.128:61616"; //linux
    public static final String AVTIVEMQ_URL = "tcp://localhost:61616";   //windows本机
    public static final String QUEUE_NAME = "queue01";
    
    public static void main(String[] args) throws JMSException {
        //1.创建连接工厂
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(AVTIVEMQ_URL);
        //2.创建连接
        Connection connection  = activeMQConnectionFactory.createConnection();
        //启动连接
        connection.start();
        //3. 创建session会话:事务,签收
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //4. 创建目的地(队列或者主题topic)
        Queue queue = session.createQueue(QUEUE_NAME);
        //5. 创建消息生产者
        MessageProducer producer = session.createProducer(queue);
        //产生消息
        for (int i=1;i<=3;i++){
            //6. 产生消息
            TextMessage textMessage = session.createTextMessage("msg-->" + i);
            //7. 发送消息给mq
            producer.send(textMessage);
        }
        //8. 关闭资源
        producer.close();
        session.close();
        connection.close();
        System.out.println("发送消息完成。。");
    }
}

3.队列:消费者

package com.qxf.activemq.queue;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

/**
 * @Auther: qiuxinfa
 * @Date: 2019/1/2
 * @Description: com.qxf.activemq.queue
 */
public class JmsConsumer {
    //默认用户名和密码admin/admin
//    public static final String AVTIVEMQ_URL = "tcp://192.168.231.128:61616"; //Linux
    public static final String AVTIVEMQ_URL = "tcp://localhost:61616";   //windows本机
    public static final String QUEUE_NAME = "queue01";

    public static void main(String[] args) throws Exception{
        //1.创建连接工厂
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(AVTIVEMQ_URL);
        //2.创建连接
        Connection connection  = activeMQConnectionFactory.createConnection();
        //启动连接
        connection.start();
        //3. 创建session会话:事务,签收
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //4. 创建目的地(队列或者主题topic)
        Queue queue = session.createQueue(QUEUE_NAME);
        //5. 创建消费者
        MessageConsumer consumer = session.createConsumer(queue);
//        //同步阻塞方式
//        while (true){
//            //6. 接收消息
//            //生产的消息类型和接收类型要相同
//            TextMessage message = (TextMessage) consumer.receive(5000L);  //5秒后停止接收
//            if (null != message){
//                System.out.println("接收消息-->"+message.getText());
//            }else {
//                break;
//            }
//        }
//        //7.关闭资源
//        consumer.close();
//        session.close();
//        connection.close();

        //使用监听器方式
        consumer.setMessageListener(new MessageListener() {
            @Override
            public void onMessage(Message message) {
                if(null != message && message instanceof TextMessage){
                    TextMessage textMessage = (TextMessage) message;
                    try {
                        System.out.println("监听消息--->"+textMessage.getText());
                    } catch (JMSException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        //7.关闭资源
        System.in.read();
        consumer.close();
        session.close();
        connection.close();
    }
}

这里说一下,其中消费者之后,消费者会一直监听对应的队列的消息,一有消息就会消费。

4. 主题:发布者,和队列生产者比较像

package com.qxf.activemq.topic;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

/**
 * @Auther: qiuxinfa
 * @Date: 2019/1/2
 * @Description: com.qxf.activemq.queue
 */
public class JmsTopicProduce {
    //默认用户名和密码admin/admin
//    public static final String AVTIVEMQ_URL = "tcp://192.168.231.128:61616"; //Linux
    public static final String AVTIVEMQ_URL = "tcp://localhost:61616";   //windows本机
    public static final String TOPIC_NAME = "topic01";
    
    public static void main(String[] args) throws JMSException {
        //1.创建连接工厂
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(AVTIVEMQ_URL);
        //2.创建连接
        Connection connection  = activeMQConnectionFactory.createConnection();
        //3. 创建session会话:事务,签收
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //4. 创建目的地(队列或者主题topic)
        Topic topic = session.createTopic(TOPIC_NAME);
        //5. 创建消息生产者
        MessageProducer producer = session.createProducer(topic);
        producer.setDeliveryMode(DeliveryMode.PERSISTENT);
        //启动连接
        connection.start();
        //产生消息
        for (int i=1;i<=3;i++){
            //6. 产生消息
            TextMessage textMessage = session.createTextMessage("msg-->" + i);
            //7. 发送消息给mq
            producer.send(textMessage);
        }
        //8. 关闭资源
        producer.close();
        session.close();
        connection.close();
        System.out.println("发送消息完成。。");
    }
}

5.主题:订阅者

package com.qxf.activemq.topic;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

/**
 * @Auther: qiuxinfa
 * @Date: 2019/12/29
 * @Description: com.qxf.activemq.queue
 */
public class JmsTopicConsumer {
    //默认用户名和密码admin/admin
//    public static final String AVTIVEMQ_URL = "tcp://192.168.231.128:61616"; //Linux
    public static final String AVTIVEMQ_URL = "tcp://localhost:61616";   //windows本机
    public static final String TOPIC_NAME = "topic01";

    public static void main(String[] args) throws Exception{
        //1.创建连接工厂
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(AVTIVEMQ_URL);
        //2.创建连接
        Connection connection  = activeMQConnectionFactory.createConnection();
        connection.setClientID("z3");
        //3. 创建session会话:事务,签收
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //4. 创建目的地(队列或者主题topic)
        Topic topic = session.createTopic(TOPIC_NAME);
        TopicSubscriber subscriber = session.createDurableSubscriber(topic, "备注信息");
        //启动连接
        connection.start();
        Message message = subscriber.receive();
        while (null != message){
            TextMessage textMessage = (TextMessage)message;
            System.out.println("持久化消息-->"+textMessage.getText());
            message = subscriber.receive(5000L);
        }
        //7.关闭资源
        session.close();
        connection.close();
    }
}

主题订阅者要先启动,不然发布者在订阅之前发的消息将无法消费。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值