activeMQ队列与主题订阅实例.docx
- 文档编号:23329999
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:18
- 大小:67.91KB
activeMQ队列与主题订阅实例.docx
《activeMQ队列与主题订阅实例.docx》由会员分享,可在线阅读,更多相关《activeMQ队列与主题订阅实例.docx(18页珍藏版)》请在冰豆网上搜索。
activeMQ队列与主题订阅实例
ActiveMQ队列与主题订阅实例
概述
JavaMessageService(JMS)是SUN提出的旨在统一各种MOM系统接口的规范,它包含点对点(PointtoPoint,PTP)和发布/订阅(Publish/Subscribe,pub/sub)两种消息模型,提供可靠消息传输、事务和消息过滤等机制。
JAVA消息服务(JMS)定义了Java中访问消息中间件的接口。
JMS只是接口,并没有给予实现,实现JMS接口的消息中间件称为JMSProvider,例如ActiveMQ。
术语
JMSProvider:
实现JMS接口的消息中间件;
PTP:
PointtoPoint,即点对点的消息模型;
Pub/Sub:
Publish/Subscribe,即发布/订阅的消息模型;
Queue:
队列目标;
Topic:
主题目标;
ConnectionFactory:
连接工厂,JMS用它创建连接;
Connection:
JMS客户端到JMSProvider的连接;
Destination:
消息的目的地;
Session:
会话,一个发送或接收消息的线程;
MessageProducer:
由Session对象创建的用来发送消息的对象;
MessageConsumer:
由Session对象创建的用来接收消息的对象;
Acknowledge:
签收;
Transaction:
事务。
JMS编程域
JMS支持两种截然不同的消息传送模型:
PTP(即点对点模型)和Pub/Sub(即发布/订阅模型),分别称作:
PTPDomain和Pub/SubDomain。
PTP(使用Queue即队列目标)消息从一个生产者传送至一个消费者。
在此传送模型中,目标是一个队列。
消息首先被传送至队列目标,然后根据队列传送策略,从该队列将消息传送至向此队列进行注册的某一个消费者,一次只传送一条消息。
可以向队列目标发送消息的生产者的数量没有限制,但每条消息只能发送至、并由一个消费者成功使用。
如果没有已经向队列目标注册的消费者,队列将保留它收到的消息,并在某个消费者向该队列进行注册时将消息传送给该消费者。
Pub/Sub(使用Topic即主题目标)消息从一个生产者传送至任意数量的消费者。
在此传送模型中,目标是一个主题。
消息首先被传送至主题目标,然后传送至所有已订阅此主题的活动消费者。
可以向主题目标发送消息的生产者的数量没有限制,并且每个消息可以发送至任意数量的订阅消费者。
主题目标也支持持久订阅的概念。
持久订阅表示消费者已向主题目标进行注册,但在消息传送时此消费者可以处于非活动状态。
当此消费者再次处于活动状态时,它将接收此信息。
如果没有已经向主题目标注册的消费者,主题不保留其接收到的消息,除非有非活动消费者注册了持久订阅。
实例1(queue方式)
先上工程图
Queue包中Producer.java
packagequeue;
importjava.util.Date;
importjavax.jms.Connection;
importjavax.jms.ConnectionFactory;
importjavax.jms.DeliveryMode;
importjavax.jms.Destination;
importjavax.jms.JMSException;
importjavax.jms.MapMessage;
importjavax.jms.Message;
importjavax.jms.MessageConsumer;
importjavax.jms.MessageProducer;
importjavax.jms.Session;
importjavax.jms.TextMessage;
importorg.apache.activemq.ActiveMQConnection;
importorg.apache.activemq.ActiveMQConnectionFactory;
publicclassProducer{
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
/*method1
Stringuser=ActiveMQConnection.DEFAULT_USER;
Stringpassword=ActiveMQConnection.DEFAULT_PASSWORD;
Stringurl=ActiveMQConnection.DEFAULT_BROKER_URL;
Stringsubject="TOOL.DEFAULT";
ConnectionFactorycontectionFactory=newActiveMQConnectionFactory(user,password,url);
try{
Connectionconnection=contectionFactory.createConnection();
connection.start();
Sessionsession=connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE);
Destinationdestination=session.createQueue(subject);
MessageProducerproducer=session.createProducer(destination);
for(inti=0;i<=20;i++){
MapMessagemessage=session.createMapMessage();
message.setLong("count",newDate().getTime());
Thread.sleep(1000);
producer.send(message);
System.out.println("--发送消息:
"+newDate());
}
mit();
session.close();
connection.close();
}catch(JMSExceptione){
e.printStackTrace();
}catch(InterruptedExceptione){
e.printStackTrace();
}*/
send();
}
/**
*send()
*/
publicstaticvoidsend(){
try{
//创建一个连接工厂
Stringurl="tcp:
//localhost:
61616";
ActiveMQConnectionFactoryconnectionFactory=newActiveMQConnectionFactory(url);
//设置用户名和密码,这个用户名和密码在conf目录下的credentials.properties文件中,也可以在activemq.xml中配置
connectionFactory.setUserName("system");
connectionFactory.setPassword("manager");
//创建连接
Connectionconnection=connectionFactory.createConnection();
connection.start();
//创建Session,参数解释:
//第一个参数是否使用事务:
当消息发送者向消息提供者(即消息代理)发送消息时,消息发送者等待消息代理的确认,没有回应则抛出异常,消息发送程序负责处理这个错误。
//第二个参数消息的确认模式:
//AUTO_ACKNOWLEDGE:
指定消息提供者在每次收到消息时自动发送确认。
消息只向目标发送一次,但传输过程中可能因为错误而丢失消息。
//CLIENT_ACKNOWLEDGE:
由消息接收者确认收到消息,通过调用消息的acknowledge()方法(会通知消息提供者收到了消息)
//DUPS_OK_ACKNOWLEDGE:
指定消息提供者在消息接收者没有确认发送时重新发送消息(这种确认模式不在乎接收者收到重复的消息)。
Sessionsession=connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
//创建目标,就创建主题也可以创建队列
Destinationdestination=session.createQueue("test");
//创建消息生产者
MessageProducerproducer=session.createProducer(destination);
//设置持久化,DeliveryMode.PERSISTENT和DeliveryMode.NON_PERSISTENT
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
//创建消息
Stringtext="HelloActiveMQ!
";
TextMessagemessage=session.createTextMessage(text);
//发送消息到ActiveMQ
producer.send(message);
System.out.println("Messageissent!
");
//关闭资源
session.close();
connection.close();
}
catch(Exceptione){
e.printStackTrace();
}
}
}
Consumer.java
packagequeue;
importjava.util.Date;
importjavax.jms.Connection;
importjavax.jms.ConnectionFactory;
importjavax.jms.Destination;
importjavax.jms.JMSException;
importjavax.jms.MapMessage;
importjavax.jms.Message;
importjavax.jms.MessageConsumer;
importjavax.jms.MessageListener;
importjavax.jms.Session;
importjavax.jms.TextMessage;
importorg.apache.activemq.ActiveMQConnection;
importorg.apache.activemq.ActiveMQConnectionFactory;
publicclassConsumer{
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
/*Stringuser=ActiveMQConnection.DEFAULT_USER;
Stringpassword=ActiveMQConnection.DEFAULT_PASSWORD;
Stringurl=ActiveMQConnection.DEFAULT_BROKER_URL;
Stringsubject="TOOL.DEFAULT";
ConnectionFactoryconnectionFactory=newActiveMQConnectionFactory(
user,password,url);
Connectionconnection;
try{
connection=connectionFactory.createConnection();
connection.start();
finalSessionsession=connection.createSession(Boolean.TRUE,
Session.AUTO_ACKNOWLEDGE);
Destinationdestination=session.createQueue(subject);
MessageConsumermessage=session.createConsumer(destination);
message.setMessageListener(newMessageListener(){
publicvoidonMessage(Messagemsg){
MapMessagemessage=(MapMessage)msg;
try{
System.out.println("--收到消息:
"
+newDate(message.getLong("count")));
mit();
}catch(JMSExceptione){
e.printStackTrace();
}
}
});
Thread.sleep(30000);
session.close();
connection.close();
}catch(JMSExceptione){
e.printStackTrace();
}catch(InterruptedExceptione){
e.printStackTrace();
}*/
//
get();
}
publicstaticvoidget(){
try{
Stringurl="tcp:
//localhost:
61616";
ActiveMQConnectionFactoryconnectionFactory=newActiveMQConnectionFactory(url);
//设置用户名和密码,这个用户名和密码在conf目录下的credentials.properties文件中,也可以在activemq.xml中配置
connectionFactory.setUserName("system");
connectionFactory.setPassword("manager");
//创建连接
Connectionconnection=connectionFactory.createConnection();
connection.start();
//创建Session
Sessionsession=connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
//创建目标,就创建主题也可以创建队列
Destinationdestination=session.createQueue("test");
//创建消息消费者
MessageConsumerconsumer=session.createConsumer(destination);
/*consumer.setMessageListener(newMessageListener(){
@Override
publicvoidonMessage(Messagemessage){
//TODOAuto-generatedmethodstub
}
});*/
//接收消息,参数:
接收消息的超时时间,为0的话则不超时,receive返回下一个消息,但是超时了或者消费者被关闭,返回null
Messagemessage=consumer.receive(1000);
if(messageinstanceofTextMessage){
TextMessagetextMessage=(TextMessage)message;
Stringtext=textMessage.getText();
System.out.println("Received:
"+text);
}else{
System.out.println("Received:
"+message);
}
consumer.close();
session.close();
connection.close();
}catch(Exceptione){
e.printStackTrace();
}
}
}
Topic实例
packagetopic.producer;
importorg.apache.activemq.ActiveMQConnectionFactory;
importjavax.jms.*;
publicclassTopicPublisher{
publicstaticvoidmain(String[]args)throwsJMSException{
ActiveMQConnectionFactoryfactory=newActiveMQConnectionFactory("tcp:
//localhost:
61616");
Connectionconnection=factory.createConnection();
connection.start();
Sessionsession=connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
Topictopic=session.createTopic("myTopic.messages");
//Topiccontrol=session.createTopic("myTopic.control");
MessageProducerproducer=session.createProducer(topic);
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
inti=0;
while(i<10){
TextMessagemessage=session.createTextMessage();
message.setText("message_"+i+":
"+System.currentTimeMillis());
producer.send(message);
System.out.println("Sentmessage:
"+message.getText());
try{
Thread.sleep(1000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
i++;
}
session.close();
connection.stop();
connection.close();
}
}
packagetopic.consumer;
importorg.apache.activemq.ActiveMQConnectionFactory;
importjavax.jms.*;
publicclassTopicSubscriber{
publicstaticvoidmain(String[]args)throwsJMSException{
ActiveMQConnectionFactoryfactory=newActiveMQConnectionFactory("tcp:
//localhost:
61616");
Connectionconnection=factory.createConnection();
connection.setClientID("1");
connection.start();
Sessionsession=connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
Topictopic=session.createTopic("myTopic.messages");
MessageConsumerconsumer=session.createConsumer(topic);
consumer.setMessageListener(newMessageListener(){
publicvoidonMessage(Messagemessage){
TextMessagetm=(TextMessage)message;
try{
System.out.println("Receivedmessage:
"+tm.getText());
}catch(JMSExceptione){
e.printStackTrace();
}
}
});
//session.close();
//connection.stop();
//connection.close();
}
}
实例三queue与spring结合
全部类文件
Springbean配置文件
Beans-core.xml配置内容
xmlversion="1.0"encoding="UTF-8"?
>
//www.springframework.org/schema/beans" xmlns: xsi="http: //www.w3.org/2001/XMLSchema-instance"xmlns: aop="http: //www.springframework.org/schema/aop" xmlns: tx="http: //www.springframework.org/schema/tx"xmlns: context="http: //www.springframewor
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- activeMQ 队列 主题 订阅 实例