zoukankan      html  css  js  c++  java
  • 【一头扎进JMS】(3)----ActiviteMQ点对点消息实现+消息监听

    上篇博客介绍了点对点消息的实现,这次将在此基础上,添加消息监听.监听的好处:自动监听消息,在监听到消息生产者消息后立即回传接到命令,并开始进行处理,进行异步处理,避免消费者等待.

    消息生产者:

    package com.java1234.activemq;
    
    import javax.jms.Connection;
    import javax.jms.ConnectionFactory;
    import javax.jms.Destination;
    import javax.jms.JMSException;
    import javax.jms.MessageProducer;
    import javax.jms.Session;
    import javax.jms.TextMessage;
    
    import org.apache.activemq.ActiveMQConnection;
    import org.apache.activemq.ActiveMQConnectionFactory;
    
    /**
     * 消息生产者
     * @author Administrator
     *
     */
    public class JMSProducer {
    
    	private static final String USERNAME=ActiveMQConnection.DEFAULT_USER; // 默认的连接用户名
    	private static final String PASSWORD=ActiveMQConnection.DEFAULT_PASSWORD; // 默认的连接密码
    	private static final String BROKEURL=ActiveMQConnection.DEFAULT_BROKER_URL; // 默认的连接地址
    	private static final int SENDNUM=10; // 发送的消息数量
    	
    	public static void main(String[] args) {
    		
    		ConnectionFactory connectionFactory; // 连接工厂
    		Connection connection = null; // 连接
    		Session session; // 会话 接受或者发送消息的线程
    		Destination destination; // 消息的目的地
    		MessageProducer messageProducer; // 消息生产者
    		
    		// 实例化连接工厂
    		connectionFactory=new ActiveMQConnectionFactory(JMSProducer.USERNAME, JMSProducer.PASSWORD, JMSProducer.BROKEURL);
    		
    		try {
    			connection=connectionFactory.createConnection(); // 通过连接工厂获取连接
    			connection.start(); // 启动连接
    			session=connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE); // 创建Session
    			destination=session.createQueue("FirstQueue1"); // 创建消息队列
    			messageProducer=session.createProducer(destination); // 创建消息生产者
    			sendMessage(session, messageProducer); // 发送消息
    			session.commit();
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} finally{
    			if(connection!=null){
    				try {
    					connection.close();
    				} catch (JMSException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    			}
    		}
    	}
    	
    	/**
    	 * 发送消息
    	 * @param session
    	 * @param messageProducer
    	 * @throws Exception
    	 */
    	public static void sendMessage(Session session,MessageProducer messageProducer)throws Exception{
    		for(int i=0;i<JMSProducer.SENDNUM;i++){
    			TextMessage message=session.createTextMessage("ActiveMQ 发送的消息"+i);
    			System.out.println("发送消息:"+"ActiveMQ 发送的消息"+i);
    			messageProducer.send(message);
    		}
    	}
    }
    


    监听器:

    package com.java1234.activemq;
    
    import javax.jms.JMSException;
    import javax.jms.Message;
    import javax.jms.MessageListener;
    import javax.jms.TextMessage;
    
    /**
     * 消息监听
     * @author Administrator
     *
     */
    public class Listener implements MessageListener{
    
    	@Override
    	public void onMessage(Message message) {
    		// TODO Auto-generated method stub
    		try {
    			System.out.println("收到的消息:"+((TextMessage)message).getText());
    		} catch (JMSException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    
    }
    


    消息消费者:

    package com.java1234.activemq;
    
    import javax.jms.Connection;
    import javax.jms.ConnectionFactory;
    import javax.jms.Destination;
    import javax.jms.JMSException;
    import javax.jms.MessageConsumer;
    import javax.jms.Session;
    import javax.jms.TextMessage;
    
    import org.apache.activemq.ActiveMQConnection;
    import org.apache.activemq.ActiveMQConnectionFactory;
    
    /**
     * 消息消费者
     * @author Administrator
     *
     */
    public class JMSConsumer2 {
    
    	private static final String USERNAME=ActiveMQConnection.DEFAULT_USER; // 默认的连接用户名
    	private static final String PASSWORD=ActiveMQConnection.DEFAULT_PASSWORD; // 默认的连接密码
    	private static final String BROKEURL=ActiveMQConnection.DEFAULT_BROKER_URL; // 默认的连接地址
    	
    	public static void main(String[] args) {
    		ConnectionFactory connectionFactory; // 连接工厂
    		Connection connection = null; // 连接
    		Session session; // 会话 接受或者发送消息的线程
    		Destination destination; // 消息的目的地
    		MessageConsumer messageConsumer; // 消息的消费者
    		
    		// 实例化连接工厂
    		connectionFactory=new ActiveMQConnectionFactory(JMSConsumer2.USERNAME, JMSConsumer2.PASSWORD, JMSConsumer2.BROKEURL);
    				
    		try {
    			connection=connectionFactory.createConnection();  // 通过连接工厂获取连接
    			connection.start(); // 启动连接
    			session=connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE); // 创建Session
    			destination=session.createQueue("FirstQueue1");  // 创建连接的消息队列
    			//发布者和消费者模式的就是这个不同-start
    			//destination=session.createTopic("FirstQueue1");  // 创建订阅者连接的消息队列
    			//发布者和消费者模式的就是这个不同-end
    			messageConsumer=session.createConsumer(destination); // 创建消息消费者
    			//添加监听-start
    			messageConsumer.setMessageListener(new Listener()); // 注册消息监听
    			//监听的好处:自动监听消息
    			//生产者生产出来以后,主动通知它,消费者激发事件,直接去接受就可以了.
    			//添加监听-end
    		} catch (JMSException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} 
    	}
    }
    

    在消息消费者中,添加监听后,只是在代码中多配置了消息监听.

    执行结果:

    添加了监听器后,先执行消息消费者,然后再执行消息生产者,这样,如果消息生产者有消息产生的时候,消息监听就会监听到.




  • 相关阅读:
    php抽象类,接口,特性的比较
    服务器和客户端缓存控制
    git平时用到的仓库
    PHP版DES算法加密数据
    Linux连接Windows服务器以及文件传输方法
    php连接MySQL数据库的三种方式(mysql/mysqli/pdo)
    PHP实现网站访客来访显示访客IP&浏览器&操作系统
    ESXI的使用
    vue
    Laravel学习笔记
  • 原文地址:https://www.cnblogs.com/chenxiaochan/p/7253389.html
Copyright © 2011-2022 走看看