JMS&ActiveMQ实战- DeliveryMode例子

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

在下面的例子中,分别发送一个Persistent和nonpersistent的消息,然后关闭退出JMS。

  1. import javax.jms.Connection;  

  2. import javax.jms.DeliveryMode;  

  3. import javax.jms.MessageProducer;  

  4. import javax.jms.Queue;  

  5. import javax.jms.Session;  

  6. import org.apache.activemq.ActiveMQConnectionFactory;  

  7. import org.apache.activemq.command.ActiveMQQueue;  

  8. public class DeliveryModeSendTest {  

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

  10.        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("vm://localhost");  

  11.    

  12.        Connection connection = factory.createConnection();  

  13.        connection.start();  

  14.        

  15.        Queue queue = new ActiveMQQueue("testQueue");  

  16.        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);  

  17.                

  18.        MessageProducer producer = session.createProducer(queue);  

  19.        producer.setDeliveryMode(DeliveryMode.PERSISTENT);  

  20.        producer.send(session.createTextMessage("A persistent Message"));  

  21.        

  22.        producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);  

  23.        producer.send(session.createTextMessage("A non persistent Message"));  

  24.        

  25.        System.out.println("Send messages sucessfully!");  

  26.    }  

  27. }  

运行上面的程序,当输出“Send messages sucessfully!”时,说明两个消息都已经发送成功,然后我们结束它,来停止JMS Provider。

接下来我们重新启动JMS Provicer,然后添加一个消费者:

  1. import javax.jms.Connection;  

  2. import javax.jms.JMSException;  

  3. import javax.jms.Message;  

  4. import javax.jms.MessageConsumer;  

  5. import javax.jms.MessageListener;  

  6. import javax.jms.Queue;  

  7. import javax.jms.Session;  

  8. import javax.jms.TextMessage;  

  9. import org.apache.activemq.ActiveMQConnectionFactory;  

  10. import org.apache.activemq.command.ActiveMQQueue;  

  11. public class DeliveryModeReceiveTest {  

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

  13.        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("vm://localhost");  

  14.    

  15.        Connection connection = factory.createConnection();  

  16.        connection.start();  

  17.        

  18.        Queue queue = new ActiveMQQueue("testQueue");  

  19.        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);  

  20.        

  21.        MessageConsumer comsumer = session.createConsumer(queue);  

  22.        comsumer.setMessageListener(new MessageListener(){  

  23.            public void onMessage(Message m) {  

  24.                try {  

  25.                    System.out.println("Consumer get " + ((TextMessage)m).getText());  

  26.                } catch (JMSException e) {  

  27.                    e.printStackTrace();  

  28.                }  

  29.            }  

  30.        });  

  31.    }  

  32. }  

运行上面的程序,可以得到下面的输出结果:

Consumer get A persistent Message

可以看出消息消费者只接收到一个消息,它是一个Persistent的消息。而刚才发送的non persistent消息已经丢失了。

另外, 如果发送一个non persistent消息, 而刚好这个时候没有消费者在监听, 这个消息也会丢失.



本文链接:JMS&ActiveMQ实战- DeliveryMode例子,领悟书生学习笔记,转自:http://www.360doc.com/content/09/0712/20/18042_4241426.shtml

相关问答

更多

activemq和jms是种什么关系

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

activemq问题

import javax.jms.Connection; import javax.jms.DeliveryMode; import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.MessageProducer; import javax.jms.Session; import javax.jms.TextMessage; jms.jar ================================ ...

使用ActiveMQ创建持久的主题和用户弹簧引导jms(Create durable topic and subscriber spring boot jms with ActiveMQ)

DefaultJmsListenerContainerFactory应该有唯一的clientId和持久子。 如下面的代码设置为true: @Bean public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() { DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); ...

我有一个JMS - ActiveMQ使用http和https协议 - 任何帮助赞赏(I have a with JMS - ActiveMQ using http and https protocols)

你的代码还可以和代理配置一样,它似乎是一个库版本问题,你可以验证客户端和代理端使用的jar版本是否相同,特别是这些:httpclient-4.2.5.jar httpcore-4.2 .4.jar xstream-1.4.4.jar xpp3-1.1.4c.jar your code is ok and broker config too, it seems to be a library version problem, can you verify that the jars version ...

带有Spring JMS的ActiveMQ - 如何发送NONPERSISTENT消息?(ActiveMQ with Spring JMS - how to sent NONPERSISTENT message?)

请参阅文档 - 您必须通过将explicitQosEnabled设置为true来启用QOS设置(例如持久性)。 在setDeliveryPersistent的javadoc中也提到了这setDeliveryPersistent 。 See the documentation - you have to enable QOS settings (such as persistence) by setting explicitQosEnabled to true. This is also menti ...

如何将ActiveMQ生成器连接到OpenMQ JMS代理(How to connect an ActiveMQ producer to an OpenMQ JMS broker)

JMS API定义了一个java接口和一个用于消息传递的体系结构,它没有定义任何特定的有线协议,它可以是载体,内存或任何常见格式(STOMP,OpenWire,AMQP,MQTT)。 为什么不能在客户端中使用Open MQ库? 这就是JMS的设计方式。 您只需要从.jar文件切换并更改ConnectionFactory 。 我没有看到任何理由仅仅为了使用ActiveMQ JMS客户端而切换到ActiveMQ,因为它应该与Open MQ客户端几乎相同。 还有其他原因可以切换,例如不同的服务器端功能和 ...

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

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

JMS Transaction简单的例子(JMS Transaction simple example)

您已将代理配置为不使用重新传递,例如 <property name="maximumRedeliveries" value="0" /> 因此,当事务失败时,不重新传递消息,然后代理将消息移动到其死信队列(DLQ)。 所以信息就在那里。 您可以在此处阅读有关ActiveMQ中DLQ的更多信息: http : //activemq.apache.org/message-redelivery-and-dlq-handling.html You have configured the broker t ...

WSO2 ESB不会使用本地传输序列化JMS(ActiveMQ)(WSO2 ESB not serialize JMS (ActiveMQ) with local transport)

我升级到ESB 4.9.0版本,我解决了我的问题。 I did the upgrade to the ESB 4.9.0 version and I solved my problem.