• 【原创】JMS生产者和消费者【PTP异步接收消息】


    PTP模式下,异步接收消息需要定义一个MessageListener来监听,当生产者有消息要发送时会主动通知Listener去处理该消息,会调用监听的onMessage方法去处理。

    首先看生产者(和同步接收时没有任何区别):

    package com.thunisoft.jms.mine;
    
    import java.util.HashMap;
    
    import javax.jms.Connection;
    import javax.jms.ConnectionFactory;
    import javax.jms.DeliveryMode;
    import javax.jms.Destination;
    import javax.jms.MessageProducer;
    import javax.jms.ObjectMessage;
    import javax.jms.Session;
    
    import org.apache.activemq.ActiveMQConnection;
    import org.apache.activemq.ActiveMQConnectionFactory;
    
    /**
     * JMS生产者
     * 
     * @author zhangxsh
     * 
     */
    public class Producer {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            ConnectionFactory connectionFactory;
            Connection connection = null;
            Session session;
            Destination destination;
            MessageProducer producer;
            connectionFactory = new ActiveMQConnectionFactory(
                    ActiveMQConnection.DEFAULT_USER,
                    ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616");
            try {
                // 通过连接工厂创建连接
                connection = connectionFactory.createConnection();
                // 启动连接
                connection.start();
                // 通过连接打开一个会话
                session = connection.createSession(Boolean.TRUE,
                        Session.AUTO_ACKNOWLEDGE);
                // 根据特定的队列名称创建一个目标地
                destination = session.createQueue("TestQueue");
                // 根据目标地创建一个生产者
                producer = session.createProducer(destination);
                // 不需要持久化的投递模式
                producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
                for (int i = 1; i <= 10; i++) {
                    ObjectMessage message = session.createObjectMessage();
                    HashMap m = new HashMap();
                    m.put("key" + i, i);
                    message.setObject(m);
                    // 发送消息到目的地方
                    System.out.println("发送消息:" + "ActiveMq 发送的消息" + i);
                    producer.send(message);
                }
                session.commit();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if (null != connection)
                        connection.close();
                } catch (Throwable ignore) {
                }
            }
        }
    }

    下面是消费者异步接收代码:

    package com.thunisoft.jms.mine;
    
    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.ObjectMessage;
    import javax.jms.Session;
    import javax.jms.Topic;
    
    import org.apache.activemq.ActiveMQConnection;
    import org.apache.activemq.ActiveMQConnectionFactory;
    
    public class ConsumeListener {
    
        /**
         * @param args
         * @throws Exception
         */
        public static void main(String[] args) throws Exception {
            ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
                    ActiveMQConnection.DEFAULT_USER,
                    ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616");
            Connection connection = connectionFactory.createConnection();
            Session session = connection.createSession(Boolean.FALSE,
                    Session.AUTO_ACKNOWLEDGE);
            connection.start();
            Destination destination = session.createQueue("TestQueue");
            MessageConsumer consumer = session.createConsumer(destination);
            
            //定义一个MessageListener用于通知有消息到来
            consumer.setMessageListener(new MessageListener() {
                @Override
                public void onMessage(Message message) {
    //                System.out.println("message");
                    if (message instanceof ObjectMessage)
                        try {
                            System.out.println("收到消息"
                                    + ((ObjectMessage) message).getObject());
                            // session.commit();
                        } catch (JMSException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
    
                }
            });
            // consumer.receive();
    
        }
    
    }
  • 相关阅读:
    LNMP源码编译安装(centos7+nginx1.9+mysql5.6+php7)
    linux 最大文件查找
    Nginx 日志分享
    ZendGuardLoader安装
    移动端播放直播流(video.js 播放 m3u8 流)
    Linux下 PostgrelSQL 基本操作
    CenterOS7 安装Mysql8 及安装会遇到的问题
    Linux下 导出postgrelSql 数据库
    《编译程序设计原理与技术》笔记之自动机与正规表达式
    Linux定时检测内存,若使用率超过指标,重启Tomcat并清空内存
  • 原文地址:https://www.cnblogs.com/zhangxsh/p/3502131.html
Copyright © 2020-2023  润新知