JMS&ActiveMQ实战- TemporaryQueue和TemporaryTopic

2019-03-28 00:30|来源: 网络

TemporaryQueue和TemporaryTopic,从字面上就可以看出它们是“临时”的目的地。可以通过Session来创建,例如:

TemporaryQueue replyQueue = session.createTemporaryQueue();

   

虽然它们是由Session来创建的,但是它们的生命周期确实整个Connection。如果在一个Connection上创建了两个Session,则 一个Session创建的TemporaryQueue或TemporaryTopic也可以被另一个Session访问。那如果这两个Session是由不同的Connection创建,则一个Session创建的TemporaryQueue不可以被另一个Session访问。

另外,它们的主要作用就是用来指定回复目的地, 即作为JMSReplyTo。


在下面的例子中,先创建一个Connection,然后创建两个Session,其中一个Session创建了一个TemporaryQueue,另一个Session在这个TemporaryQueue上读取消息。


import javax.jms.*;

import org.apache.activemq.ActiveMQConnectionFactory;

import org.apache.activemq.command.ActiveMQQueue;


public class TemporaryQueueTest {


   public static void main(String[] args) throws Exception {

       ActiveMQConnectionFactory factory =

               new ActiveMQConnectionFactory("vm://localhost");

       Connection connection = factory.createConnection();

       connection.start();


       Queue queue = new ActiveMQQueue("testQueue2");

       final Session session = connection.createSession(false,

               Session.AUTO_ACKNOWLEDGE);

       //使用session创建一个TemporaryQueue。

       TemporaryQueue replyQueue = session.createTemporaryQueue();

     

       //接收消息,并回复到指定的Queue中(即replyQueue)

       MessageConsumer comsumer = session.createConsumer(queue);

       comsumer.setMessageListener(new MessageListener(){

           public void onMessage(Message m) {

               try {

                   System.out.println("Get Message: " + ((TextMessage)m).getText());

                   MessageProducer producer = session.createProducer(m.getJMSReplyTo());

                   producer.send(session.createTextMessage("ReplyMessage"));

               } catch (JMSException e) { }

           }

       });

     

       //使用同一个Connection创建另一个Session,来读取replyQueue上的消息。

       Session session2 = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);

       MessageConsumer replyComsumer = session2.createConsumer(replyQueue);

       replyComsumer.setMessageListener(new MessageListener(){

           public void onMessage(Message m) {

               try {

                   System.out.println("Get reply: " + ((TextMessage)m).getText());

               } catch (JMSException e) { }

           }

       });

     

       MessageProducer producer = session.createProducer(queue);

       TextMessage message = session.createTextMessage("SimpleMessage");

       message.setJMSReplyTo(replyQueue);

       producer.send(message);

   }

}


运行结果为:

Get Message: SimpleMessage

Get reply: ReplyMessage


如果将:

Session session2 = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);

更改为:

Connection connection2 = factory.createConnection();

Session session2 = connection2.createSession(true, Session.AUTO_ACKNOWLEDGE);


就会得到类似于下面的异常:

Exception in thread "main" javax.jms.InvalidDestinationException: Cannot use a Temporary destination from another Connection。


本文链接:JMS&ActiveMQ实战- TemporaryQueue和TemporaryTopic,领悟书生学习笔记,转自:http://www.360doc.com/content/09/0712/21/18042_4241975.shtml

相关问答

更多

ActiveMQ与Spring实现JMS的问题?

Thread.sleep(5000); 延时加载

Spring JMS ActiveMQ 两个项目之间如何通讯?

可以在配置文件中做相应的配置 ,如jms连接工厂、连接池等

ActiveMQ与Spring实现JMS的问题?

Thread.sleep(5000);延时加载

activemq和jms是种什么关系

JMS是一个用于提供消息服务的技术规范,它制定了在整个消息服务提供过程中的所有数据结构和交互流程。而activemq则是消息队列服务,是面向消息中间件(MOM)的最终实现,是真正的服务提供者。 jms 的一个标准或者说是一个协议. 通常用于企业级应用的消息传递. 主要有topic 消息(1 对多), queue 消息(1对1)。activemq 是一个jms 的实现, apache 出的. 另外还其它的实现 jboss 。 MQ简介: MQ全称为Message Queue, 消息队列(MQ)是一种 ...

在客户端使用TemporaryQueue与JBoss服务器bean同步请求/回复JMS(Use a TemporaryQueue on client-side for synchronous Request/Reply JMS with a JBoss server bean)

你在这里问错了问题。你应该看看如何在任何Bean内创建一个Connection。 您需要获取ConnectionFactory,并相应地创建连接。 有关更多信息,请查看HornetQ下载中的javaee示例。 具体看一下javaee / mdb -tx-send /当你下载hornetq时。 @MessageDriven(name = "MDBMessageSendTxExample", activationConfig = ...

针对Android的ActiveMQ和其他FOSS JMS实现(ActiveMQ and other FOSS JMS Implementation for Android)

使用ActiveMQ,您可以使用STOMP作为协议。 它比xmpp简单得多。 似乎没有一个本地stomp执行android(有几个java)。 但规范只有一个页面,所以这不应该成为一个问题。 另一种选择可能是RabbitMQ。 我记得有关Android系统的rabbitMQ库的消息。 With ActiveMQ you could use STOMP as a protocol. its much simpler than xmpp. there doesn't seem to be a nati ...

使用Grizzly和JMS / ActiveMQ(Using Grizzly with JMS/ActiveMQ)

您可以使用TCP适配器/网关(可以选择使用NIO)以及自定义(反)序列化程序。 如果必须使用Grizzly,则可以编写服务器连接工厂实现。 对于出站适配器(或入站网关),端点注册为“TcpListener”(使用connectionId),SI消息包含用于确定哪个连接获得回复的IpHeaders.CONNECTION_ID标头。 连接关闭时,它将取消注册(从地图中删除)。 You could use the TCP adapters/gateways (which have an option t ...

使用ActiveMQ进行JMS配置(JMS Configuration with ActiveMQ)

使用正确的后端uri创建一个地址端点,如下所示。 <endpoint xmlns="http://ws.apache.org/ns/synapse" name="Service1EP"> <address uri="http://localhost:8080/services/service1""> <suspendOnFailure> <progressionFactor>1.0</progressionFactor> </suspendOnFai ...

通过activemq JMS运行pentaho作业(Running pentaho jobs through activemq JMS)

我将PDI集成到JAX-RS Web应用程序中没有问题。 从JMS调用作业应该很容易。 在这里您可以找到如何将PDI与java集成: http : //wiki.pentaho.com/display/EAI/Pentaho+Data+Integration+-+Java+API+Examples 对于webapps,你可以在网上找到大量的材料。 There is a JMS consumer comes handy and the corresponding settings (Similar ...

Web Socket与JMS或Activemq [已关闭](Web Socket vs JMS or Activemq [closed])

Web套接字是一种在Web浏览器和Web服务器之间提供双向套接字样式接口的方式,服务器能够推送信息,而不是仅响应浏览器HTTP“拉”请求。 这听起来来自你的问题和澄清,这不是你所需要的。 然而,简单套接字是在应用程序之间提供同步通信的好方法。 如果接收到消息的应用程序可以同步处理它们 - 只要它们被发送 - 常规套接字可能是一个很好的解决方案。 消息队列用于异步通信 - 消息在发送后可能需要存储一段时间,然后接收者才能收到消息并对消息进行操作。 由于需要存储,消息队列需要单独的服务器来存储消息,或 ...