activemq订阅模式以及消息时长和确认机制

代码如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.activemq;  
  2. import org.apache.activemq.ActiveMQConnectionFactory;  
  3. import javax.jms.*;   
  4.   
  5. public class TopicPub {  
  6.      public static void main(String[] args) throws JMSException {    
  7.             ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");    
  8.             Connection connection = factory.createConnection();    
  9.             connection.start();    
  10.                 
  11.             Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);    
  12.             /** 
  13.             Session javax.jms.Connection.createSession(boolean transacted, int acknowledgeMode) throws JMSException 
  14.             1.transacted事务,事务成功commit,才会将消息发送到mom中 
  15.             2.acknowledgeMode消息确认机制 
  16.                  1)、带事务的session 
  17.                     如果session带有事务,并且事务成功提交,则消息被自动签收。如果事务回滚,则消息会被再次传送。 
  18.                  2)、不带事务的session 
  19.                     不带事务的session的签收方式,取决于session的配置。 
  20.                     Activemq支持一下三種模式: 
  21.                     Session.AUTO_ACKNOWLEDGE  消息自动签收 
  22.                     Session.CLIENT_ACKNOWLEDGE  客戶端调用acknowledge方法手动签收 
  23.                     Session.DUPS_OK_ACKNOWLEDGE 不是必须签收,消息可能会重复发送。在第二次重新传送消息的时候,消息 
  24.                     头的JmsDelivered会被置为true标示当前消息已经传送过一次,客户端需要进行消息的重复处理控制。 
  25.                  代码示例如下: 
  26.                  session = connection.createSession(true, Session.CLIENT_ACKNOWLEDGE); 
  27.                  textMsg.acknowledge(); 
  28.             */  
  29.             Topic topic = session.createTopic("wm5920.topic");    
  30.         
  31.             MessageProducer producer = session.createProducer(topic);    
  32.             producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);//设置非持久化    
  33. //          producer.setTimeToLive(5000);//5秒后过期,这个对点对点模式有效  
  34.             TextMessage message = session.createTextMessage();    
  35.             message.setText("message_" + System.currentTimeMillis());    
  36.             producer.send(message);    
  37.             System.out.println("Sent message: " + message.getText());    
  38.             session.close();    
  39.             connection.stop();    
  40.             connection.close();    
  41.         }    
  42. }  

订阅主题,注:如果在发布主题前,没有订阅,是收不到消息的,这跟点对点的队列模式不同

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.activemq;  
  2. import org.apache.activemq.ActiveMQConnectionFactory;    
  3.   
  4.   
  5. import javax.jms.*;    
  6.   
  7.   
  8. public class TopicSubs{  
  9. public static void main(String[] args) throws JMSException {    
  10.         ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");    
  11.         Connection connection = factory.createConnection();    
  12.         connection.setClientID("wm5920");  
  13.         connection.start();    
  14.             
  15.         Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);    
  16.         Topic topic = session.createTopic("wm5920.topic");    
  17.           
  18.         //持久订阅方式,不会漏掉信息  
  19.         TopicSubscriber subs=session.createDurableSubscriber(topic, "wm5920");  
  20.         subs.setMessageListener(new MessageListener() {    
  21.             public void onMessage(Message message) {    
  22.                 TextMessage tm = (TextMessage) message;    
  23.                 try {    
  24.                     System.out.println("Received message: " + tm.getText());    
  25.                 } catch (JMSException e) {    
  26.                     e.printStackTrace();    
  27.                 }    
  28.             }    
  29.         });  
  30.           
  31.         //非持久订阅方式  
  32. //        MessageConsumer consumer = session.createConsumer(topic);    
  33. //        consumer.setMessageListener(new MessageListener() {    
  34. //            public void onMessage(Message message) {    
  35. //                TextMessage tm = (TextMessage) message;    
  36. //                try {    
  37. //                    System.out.println("Received message: " + tm.getText());    
  38. //                } catch (JMSException e) {    
  39. //                    e.printStackTrace();    
  40. //                }    
  41. //            }    
  42. //        });   
  43. //        session.commit();  
  44. //      session.close();    
  45. //      connection.stop();    
  46. //      connection.close();    
  47.     }    
  48. }  

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值