activemq 的使用

1:

  queue与topic两种魔术。queue是“该队列所有的监听者总共消费1次”;topic是“该所有的订阅者都会消费1次”

   //连接配置
private String userName = "admin"; private String password = "admin"; private String url = "tcp://192.168.8.65:61616"; private String queueName = "Qtest_queue"; private String topicName = "Ttest_topic";

   1.1 queue队列消息

    1.1.1 生产者

  /**
     * 队列模式:生产者
     */
    @Test
    public void queueProduce() throws JMSException {
        //  #1  创建连接工厂
        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(userName, password, url);
        //  #2  从工厂获得连接connectino
        Connection connection = factory.createConnection();
        //  #3  启动访问
        connection.start();
        //  #4  创建会话session
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //  #5  由会话session创建目的地distinct(Queue/Topic)
        Queue queue = session.createQueue(queueName);
        //  #6  会话session创建生产者Produce
        MessageProducer producer = session.createProducer(queue);
        //  #7  宕机保存消息
        producer.setDeliveryMode(DeliveryMode.PERSISTENT);

        //  #8  生产消息,发送到队列
        for (int i = 1; i <= 10; i++) {
            String msg = "第" + i + "个msg";
            TextMessage message = session.createTextMessage(msg);
            //  #9  发送消息到MQ
            producer.send(message);
        }

        //  #10 关闭资源
        producer.close();
        session.close();
        connection.close();
    }

    1.1.2消费者

      1.1.2.1 receive模式

  

/**
     * 队列模式:消费者
     * Receive方式:每次只消费一次(需要代码while循环查询)
     */
    @Test
    public void queueReceiveConsumer() throws JMSException {
        //  #1  创建连接工厂
        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(userName, password, url);
        //  #2  从工厂获得连接connectino
        Connection connection = factory.createConnection();
        //  #3  启动访问
        connection.start();
        //  #4  创建会话session
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //  #5  由会话session创建目的地distinct(Queue/Topic)
        Queue queue = session.createQueue(queueName);
        //  #6  会话session创建消费者Produce
        MessageConsumer consumer = session.createConsumer(queue);
        // receive同步阻塞方式:没有收到消息一直等
        while (true) {
            Message message = consumer.receive();   //没有参数会一直等
            if (message != null && message instanceof TextMessage) {
                TextMessage textMessage = (TextMessage) message;
                System.out.println("消费了:: " + textMessage);
            } else {
                break;
            }
        }

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

      1.1.2.2listen监听模式

    /**
     * 队列模式:消费者
     * Listen方式
     */
    @Test
    public void queueListenConsumer() throws JMSException {
        //  #1  创建连接工厂
        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(userName, password, url);
        //  #2  从工厂获得连接connectino
        Connection connection = factory.createConnection();
        //  #3  启动访问
        connection.start();
        //  #4  创建会话session
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //  #5  由会话session创建目的地distinct(Queue/Topic)
        Queue queue = session.createQueue(queueName);
        //  #6  会话session创建消费者Produce
        MessageConsumer consumer = session.createConsumer(queue);
        //  监听方式获得message
        consumer.setMessageListener(message -> {
            if (message != null && message instanceof TextMessage) {
                TextMessage textMessage = (TextMessage) message;
                System.out.println("消费了:: " + textMessage);
            }
        });
        try {

            System.in.read();//保证控制台不灭:避免没有监听到消息的时候关闭控制台
        } catch (IOException e) {
            e.printStackTrace();
        }

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

  1.2 topic模式

扫描二维码关注公众号,回复: 7911824 查看本文章

    1.2.1 生产者

  @Test
    public void topicProducer() throws JMSException {

        //  #1  创建连接工厂
        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(userName, password, url);
        //  #2  从工厂获得连接connectino
        Connection connection = factory.createConnection();
        //  #3  启动访问
        connection.start();
        //  #4  创建会话session
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //  #5  由会话session创建目的地distinct(Queue/Topic)
        Topic topic = session.createTopic(topicName);
        //  #6  会话session创建生产者Produce
        MessageProducer producer = session.createProducer(topic);
        //  #7  宕机保存消息
        producer.setDeliveryMode(DeliveryMode.PERSISTENT);

        //  #8  生产消息,发送到队列
        for (int i = 1; i <= 10; i++) {
            String msg = "第" + i + "个msg";
            TextMessage message = session.createTextMessage(msg);
            message.setStringProperty("top","vip"); //设置消息属性,加强消息的识别度(comsumer可以进行筛选某些消息,着重处理)
            //  #9  发送消息到MQ
            producer.send(message);
        }

        //  #10 关闭资源
        producer.close();
        session.close();
        connection.close();
    }

  1.2.2消费者

    1.2.2.1 receive模式

  // 多个消费者测试topic模式   
@Test
public void topicReceiveConsumer1() throws JMSException { // #1 创建连接工厂 ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(userName, password, url); // #2 从工厂获得连接connectino Connection connection = factory.createConnection(); // #3 启动访问 connection.start(); // #4 创建会话session Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // #5 由会话session创建目的地distinct(Queue/Topic) Topic topic = session.createTopic(topicName); // #6 会话session创建生产者Produce MessageConsumer consumer = session.createConsumer(topic); while (true) { Message receive = consumer.receive(); if (receive != null && receive instanceof TextMessage) { TextMessage message = (TextMessage) receive; System.out.println("topicConsumer1收到topic消息" + message.getText()); } } // #10 关闭资源 // consumer.close(); // session.close(); // connection.close(); }

    1.2.2.2 listen监听模式

@Test
    public void topicListenConsumer2() throws JMSException, IOException {

        //  #1  创建连接工厂
        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(userName, password, url);
        //  #2  从工厂获得连接connectino
        Connection connection = factory.createConnection();
        //  #3  启动访问
        connection.start();
        //  #4  创建会话session
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //  #5  由会话session创建目的地distinct(Queue/Topic)
        Topic topic = session.createTopic(topicName);
        //  #6  会话session创建生产者Produce
        MessageConsumer consumer = session.createConsumer(topic);

        consumer.setMessageListener(message -> {
            if (message != null && message instanceof TextMessage) {
                TextMessage msg = (TextMessage) message;
                try {
                    System.out.println("topicListenConsumer2收到topic消息" + msg.getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }

        });
        System.in.read();
        //  #10 关闭资源
//        consumer.close();
//        session.close();
//        connection.close();
    }

猜你喜欢

转载自www.cnblogs.com/draymond/p/11892762.html