目录
1、QueueRequestor
同步阻塞,想发多少消息,就要开多少线程。
public QueueRequestor(QueueSession session, Queue queue)
throws JMSException
{
super();
if(queue == null) {
throw new InvalidDestinationException("Invalid queue");
}
setSession(session);
setTemporaryQueue(session.createTemporaryQueue());
setSender(session.createSender(queue));
setReceiver(session.createReceiver(getTemporaryQueue()));
}
public Message request(Message message) throws JMSException {
message.setJMSReplyTo(getTemporaryQueue());
getSender().send(message);
return getReceiver().receive();
}
sender:
package phs.activemq.QueueRequestor;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* 消息发送者
* @author phs
*
*/
public class SenderQueue {
public static void main(String[] args) throws Exception{
//1.获取连接工厂
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
"admin",
"admin",
"tcp://localhost:61616"
);
//2.获取一个向ActiveMQ的连接
Connection connection = connectionFactory.createConnection();
connection.start();
//3.获取session
QueueSession session = (QueueSession)connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//4.找目的地,获取destination,消费端也会从这个目的地取消息
Queue queue = session.createQueue("user");
//Topic topic = session.createTopic("ff");
//5.消息生产者
QueueRequestor queueRequestor=new QueueRequestor(session,queue);
Message textMessage = session.createTextMessage("hi");
TextMessage responseMessage = (TextMessage) queueRequestor.request(textMessage);
System.out.println(responseMessage.getText());
//7.关闭连接
//connection.close();
}
}
receiver:
package phs.activemq.QueueRequestor;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* 消息消费者
* @author phs
*
*/
public class ReceiverQueue {
public static void main(String[] args) throws Exception{
//1.获取连接工厂
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
"admin",
"admin",
"tcp://localhost:61616"
);
//2.获取一个向ActiveMQ的连接
Connection connection = connectionFactory.createConnection();
connection.start();
//3.获取session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//4.找目的地,获取destination,消费端也会从这个目的地取消息
Queue queue = session.createQueue("user");
//5.消息消费者
MessageConsumer consumer = session.createConsumer(queue);
//6.从目的地获取消息
consumer.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
// TODO Auto-generated method stub
System.out.println("接到一条消息。。。。");
System.out.println("开始发送确认消息。。。");
try {
Destination replyTo = message.getJMSReplyTo();
System.out.println("replyTo:" + replyTo);
MessageProducer producer = session.createProducer(replyTo);
producer.send(session.createTextMessage("xxxx..."));
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
}
2、TemporaryQueue
通过在发送端通过JmsReplyto方法指定接收端回复消息的目的地Destination,使得接收端接收处理完消息后,可以向接收到的目的地Destination回复一个消息作为响应。
然后发送端再去这个约定的Destination取到响应内容。与QueueRequestor的方式相比,区别在于将receive()的同步阻塞等待响应改为了listener异步监听响应。
JmsReplyto的参数是Destination,可以是Queue、topic、TemporaryQueue等.TemporaryQueue的特性在于,每次消息消费完该临时Queue也会自己消失。
但是频繁产生TemporaryQueue对象对性能有很大影响。
package phs.activemq.replytoTemporaryQueue;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* 消息发送者
* @author phs
*
*/
public class SenderQueue {
public static void main(String[] args) throws Exception{
//1.获取连接工厂
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
"admin",
"admin",
"tcp://localhost:61616"
);
//2.获取一个向ActiveMQ的连接
Connection connection = connectionFactory.createConnection();
connection.start();
//3.获取session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//4.找目的地,获取destination,消费端也会从这个目的地取消息
Queue queue = session.createQueue("user");
//Topic topic = session.createTopic("ff");
//5.消息生产者
MessageProducer producer = session.createProducer(queue);
//设置消息是否持久化 默认是持久化的
//producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
Message textMessage = session.createTextMessage("hi");
TemporaryQueue temporaryQueue = session.createTemporaryQueue();
textMessage.setJMSReplyTo(temporaryQueue);
producer.send(textMessage);
System.out.println("P 消息发送完毕");
//等待消息回复
MessageConsumer consumer = session.createConsumer(temporaryQueue);
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
System.out.println("P 收到消息确认");
try {
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
});
//7.关闭连接
//connection.close();
}
}
package phs.activemq.replytoTemporaryQueue;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* 消息消费者
* @author phs
*
*/
public class ReceiverQueue {
public static void main(String[] args) throws Exception{
//1.获取连接工厂
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
"admin",
"admin",
"tcp://localhost:61616"
);
//2.获取一个向ActiveMQ的连接
Connection connection = connectionFactory.createConnection();
connection.start();
//3.获取session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//4.找目的地,获取destination,消费端也会从这个目的地取消息
Queue queue = session.createQueue("user");
//5.消息消费者
MessageConsumer consumer = session.createConsumer(queue);
//6.从目的地获取消息
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
try {
System.out.println("接收到一条消息");
System.out.println("开始发送确认消息");
MessageProducer producer = session.createProducer(message.getJMSReplyTo());
producer.send(session.createTextMessage("xxxx..."));
} catch (JMSException e) {
e.printStackTrace();
}
}
});
}
}
3、JMSCorrelationID
JMSCorrelationID是消息发送方和接收方的一个关联id,通俗讲就是接头暗号。使双方都知道发起一个指定JMSCorrelationID的请求,只需要等待对应JMSCorrelationID的响应即可。
package phs.activemq.JMSCorrelationID;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
import java.util.UUID;
/**
* 消息发送者
* @author phs
*
*/
public class SenderQueue {
public static void main(String[] args) throws Exception{
//1.获取连接工厂
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
"admin",
"admin",
"tcp://localhost:61616"
);
//2.获取一个向ActiveMQ的连接
Connection connection = connectionFactory.createConnection();
connection.start();
//3.获取session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//4.找目的地,获取destination,消费端也会从这个目的地取消息
Queue queue = session.createQueue("user");
//Topic topic = session.createTopic("ff");
//5.消息生产者
MessageProducer producer = session.createProducer(queue);
//设置消息是否持久化 默认是持久化的
//producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
Message textMessage = session.createTextMessage("hi");
String cid=UUID.randomUUID().toString();
textMessage.setJMSCorrelationID(cid);
textMessage.setStringProperty("type","C");
producer.send(textMessage);
System.out.println("P 消息发送完毕");
//等待消息回复
MessageConsumer consumer = session.createConsumer(queue,"JMSCorrelationID='"+cid+"' and type='P'");
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
System.out.println("P 收到消息确认");
try {
//7.关闭连接
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
});
}
}
package phs.activemq.JMSCorrelationID;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* 消息消费者
* @author phs
*
*/
public class ReceiverQueue {
public static void main(String[] args) throws Exception{
//1.获取连接工厂
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
"admin",
"admin",
"tcp://localhost:61616"
);
//2.获取一个向ActiveMQ的连接
Connection connection = connectionFactory.createConnection();
connection.start();
//3.获取session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//4.找目的地,获取destination,消费端也会从这个目的地取消息
Queue queue = session.createQueue("user");
//5.消息消费者
MessageConsumer consumer = session.createConsumer(queue,"type='C'");
//6.从目的地获取消息
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
try {
System.out.println("接收到一条消息");
System.out.println("开始发送确认消息");
MessageProducer producer = session.createProducer(queue);
String cid=message.getJMSCorrelationID();
TextMessage textMessage =session.createTextMessage("xxxx...");
textMessage.setJMSCorrelationID(cid);
textMessage.setStringProperty("type","P");
producer.send(textMessage);
} catch (JMSException e) {
e.printStackTrace();
}finally {
try {
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
});
}
}