MQ学习(三)--- 订阅模式

来源:互联网 发布:telent 端口 编辑:程序博客网 时间:2024/05/16 10:23

消息发布者代码:

package com.java1234.activemq2;

 

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 ALWZ

 *

 */

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.createTopic("FirstTopic1");//创建消息会话

messageProducer=session.createProducer(destination);//创建消息生产者

sendMessage(session, messageProducer);//发送消息

session.commit();

 

} catch (JMSException e) {

e.printStackTrace();

}finally{

if (connection!=null) {

try {

connection.close();

} catch (JMSException e) {

e.printStackTrace();

}

}

}

 

}

/**

 *发送消息

 * @param session

 * @param messageProducer

 * @throws JMSException

 */

public static void sendMessage(Session session,MessageProducer messageProducer) throws JMSException{

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.Connection;

import javax.jms.ConnectionFactory;

import javax.jms.Destination;

import javax.jms.JMSException;

import javax.jms.MessageConsumer;

import javax.jms.Session;

 

import org.apache.activemq.ActiveMQConnection;

import org.apache.activemq.ActiveMQConnectionFactory;

/**

 *消息消费者

 * @author ALWZ

 *

 */

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);

destination=session.createTopic("FirstTopic1");//创建消息订阅者

messageConsumer=session.createConsumer(destination);//创建消息消费者

//注册消息监听如果两个订阅者,就会有两个监听者,

//这里括号里面的代码就会一个对应一个的写

messageConsumer.setMessageListener(new Listener());

 

} catch (JMSException e) {

e.printStackTrace();

}

}

}

 

package com.java1234.activemq2;

 

import javax.jms.JMSException;

import javax.jms.Message;

import javax.jms.MessageListener;

import javax.jms.TextMessage;

/**

 *消息监听--订阅者的监听

 * @author ALWZ

 *

 */

public class Listener implements MessageListener{

 

@Override

public void onMessage(Message message) {

try {

System.out.println("订阅者收到的消息:"+((TextMessage)message).getText());

} catch (JMSException e) {

e.printStackTrace();

}

}

 

 

}

 

这里启动的时候得注意:必须得先启动订阅者,再启动发布者。只有订阅之后才可以收到消息。

 

如果有两个订阅者的话:运行显示: