ActiveMQ-request/response请求/响应模型的几种实现

本文介绍了ActiveMQ中实现request/response模型的三种方法:1) QueueRequestor,同步阻塞方式,多线程对应多个消息;2) TemporaryQueue,通过JmsReplyto设定回复目的地,异步监听响应;3) JMSCorrelationID,使用关联ID进行消息匹配,减少资源消耗。文中详细阐述了各自特点和适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

 

1、QueueRequestor

2、TemporaryQueue

3、JMSCorrelationID


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

	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值