JMS编码步骤 和 ActiveMQ的入门案例(queue模式和topic模式及区别)

JMS编码步骤和总体架构

Activemq遵循了JMS规范,总体的流程分为以下几步:

  1. 创建ConnectionFactory
  2. 使用ConnectionFactory创建一个Connection
  3. 使用Connection创建一个Session
  4. 使用Session创建消息的生产者(Message Producer)和消息的消费者(MessageConsumer)
  5. 生产者往Destination发送消息
  6. 消费者从Destination消费消息
    在这里插入图片描述

ActiveMQ的入门案例

创建maven工程,导入pom 依赖

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

queue模式

  1. 该模式下,生产者生成一个消息,只能被一个消费者消费,别的消费者无法收到消息
  2. 如果有多个消费者,生产者生产的消息会被负载均衡给每一个消费者。
    即:假如有3个消费者,生产者生产3个消息,3个消费者只能每个消费者消费一个消息。

生产者:queues模式

public class ActivemqProducer {
    static String BROCKER_URL = "tcp://192.168.72.129:61616";
    static String QUEUE_NAME = "queue_name01";

    public static void main(String[] args) throws JMSException {
            // 1. 创建连接工厂
            ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(BROCKER_URL);
            // 2. 获取连接 并启动
            Connection connection = activeMQConnectionFactory.createConnection();
            connection.start();
            // 3. 创建session ,参数一:事务,参数二:签收
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            //4. 创建目的地,队列
            Queue queue = session.createQueue(QUEUE_NAME);
            // 5.创建消息生产者
            MessageProducer messageProducer = session.createProducer(queue);
            // 6.通过 messageProducer 发送3条消息
            for (int i = 1; i <= 3; i++) {
                TextMessage textMessage = session.createTextMessage("消息 ->" + i);
                messageProducer.send(textMessage);
            }
            System.out.println("发送消息完成......");

            // 7.关闭资源
            messageProducer.close();
            session.close();
            connection.close();
    }
}

消费者一:
使用receive() 方法取消息,没有消息会阻塞

public class ActivemqConsumer {
    static String BROKER_URL = "tcp://192.168.72.129:61616";
    static String QUEUE_NAME = "queue_name01";

    public static void main(String[] args) throws JMSException {
        // 1.创建连接工厂
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(BROKER_URL);
        // 2.创建连接并启动
        Connection connection = activeMQConnectionFactory.createConnection();
        connection.start();
        // 3.创建session
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        // 4.创建目的地
        Queue queue = session.createQueue(QUEUE_NAME);
        // 5.创建消费者
        MessageConsumer consumer = session.createConsumer(queue);

        // 6.从目的去取消息
        while (true) {
            // 如果没有消息,g该方法会阻塞
            TextMessage message = (TextMessage) consumer.receive();
            if (message != null) {
                System.out.println("消费者收到消息:" + message.getText());
            } else
                break;
        }
        // 7.关闭资源
        consumer.close();
        session.close();
        connection.close();
    }
}

运行结果:如果消费没有收到消息,会一直阻塞在receive() 方法上
在这里插入图片描述

消费者二:
消费者使用监听器是否有消息发送。代码不会阻塞,生产者发送消费,消费者立马消费,使用方法setMessageListener()

public class ActivemqConsumerWithListener {
    static String BROKER_URL = "tcp://192.168.72.129:61616";
    static String QUEUE_NAME = "queue_name01";

    public static void main(String[] args) throws JMSException, IOException {
        // 1.创建连接工厂
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(BROKER_URL);
        // 2.创建连接并启动
        Connection connection = activeMQConnectionFactory.createConnection();
        connection.start();
        // 3.创建session
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        // 4.创建目的地
        Queue queue = session.createQueue(QUEUE_NAME);
        // 5.创建消费者
        MessageConsumer consumer = session.createConsumer(queue);
        // 6. 给消费者添加监听器,监听生产者发送的消息
        consumer.setMessageListener(new MessageListener() {
            public void onMessage(Message message) {
                TextMessage textMessage = (TextMessage) message;
                try {
                    System.out.println("消费者收到消息:" + textMessage.getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });

        // 不让程序执行完成
        System.in.read();
        
        // 7.关闭资源
        consumer.close();
        session.close();
        connection.close();
    }
}

Topic 模式

  1. 该模式是订阅模式,消费者订阅一个topic,当生产者向该 topic 生产消息,那么订阅了该 topic 的消费者都会收到消息

生产者 :

public class ActivemqProducerWithTopic {
    static String BROCKER_URL = "tcp://192.168.72.129:61616";
    static String TOPIC_NAME = "topic_name01";

    public static void main(String[] args) throws JMSException {
        // 1. 创建连接工厂
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(BROCKER_URL);
        // 2. 获取连接 并启动
        Connection connection = activeMQConnectionFactory.createConnection();
        connection.start();
        // 3. 创建session ,参数一:事务,参数二:签收
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //4. 创建目的地,topic
        Topic topic = session.createTopic(TOPIC_NAME);
        // 5.创建消息生产者
        MessageProducer messageProducer = session.createProducer(topic);
        // 6.通过 messageProducer 发送3条消息
        for (int i = 1; i <= 3; i++) {
            TextMessage textMessage = session.createTextMessage("消息 ->" + i);
            messageProducer.send(textMessage);
        }
        System.out.println("发送消息完成......");

        // 7.关闭资源
        messageProducer.close();
        session.close();
        connection.close();
    }
}

消费者:

public class ActivemqConsumerWithTopic {
    static String BROKER_URL = "tcp://192.168.72.129:61616";
    static String TOPIC_NAME = "topic_name01";

    public static void main(String[] args) throws JMSException, IOException {
        System.out.println("==========消费者 3 =================");
        // 1.创建连接工厂
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(BROKER_URL);
        // 2.创建连接并启动
        Connection connection = activeMQConnectionFactory.createConnection();
        connection.start();
        // 3.创建session
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        // 4.创建目的地 topic
        Topic topic = session.createTopic(TOPIC_NAME);
        // 5.创建消费者
        MessageConsumer consumer = session.createConsumer(topic);
        // 6. 给消费者添加监听器,监听生产者发送的消息
        consumer.setMessageListener(new MessageListener() {
            public void onMessage(Message message) {
                TextMessage textMessage = (TextMessage) message;
                try {
                    System.out.println("消费者收到消息:" + textMessage.getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });

        // 不让程序执行完成
        System.in.read();

        // 7.关闭资源
        consumer.close();
        session.close();
        connection.close();
    }
}

先启动3个消费者,在启动生产者,运行结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

从结果可以看出每一个消费者都接收到了消息。

queue模式和topic模式对比

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 JMX API 获取 ActiveMQ 中所有的 TopicQueue,具体的 Java 代码如下: ```java import java.util.Set; import javax.management.MBeanServerConnection; import javax.management.ObjectName; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXServiceURL; import org.apache.activemq.ActiveMQConnectionFactory; public class ArtemisTopicQueueInfo { public static void main(String[] args) throws Exception { ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(); connectionFactory.setBrokerURL("tcp://localhost:61616"); connectionFactory.setUserName("admin"); connectionFactory.setPassword("admin"); JMXServiceURL jmxServiceUrl = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi"); JMXConnector jmxConnector = JMXConnectorFactory.connect(jmxServiceUrl, null); MBeanServerConnection mBeanServerConnection = jmxConnector.getMBeanServerConnection(); ObjectName brokerName = new ObjectName("org.apache.activemq.artemis:brokerName=\"localhost\",module=JMS,type=Broker"); Set<ObjectName> queueNames = mBeanServerConnection.queryNames(new ObjectName(brokerName + ",component=addresses,address=*"), null); System.out.println("Queues:"); for (ObjectName queueName : queueNames) { String queue = queueName.getKeyProperty("address").replace("_", "/"); System.out.println(queue); } Set<ObjectName> topicNames = mBeanServerConnection.queryNames(new ObjectName(brokerName + ",component=addresses,address/#"), null); System.out.println("Topics:"); for (ObjectName topicName : topicNames) { String topic = topicName.getKeyProperty("name").replace("_", "/"); System.out.println(topic); } jmxConnector.close(); } } ``` 请注意,该代码中的 ActiveMQConnectionFactory、brokerUrl 以及用户名和密码应该替换为你自己的配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值