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

来源:互联网 发布:单片机语言是什么语言 编辑:程序博客网 时间:2024/05/18 19:18

直接上代码

发布主题

package com.activemq;import org.apache.activemq.ActiveMQConnectionFactory;import javax.jms.*; public class TopicPub { public static void main(String[] args) throws JMSException {          ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");          Connection connection = factory.createConnection();          connection.start();                    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);          /**        Session javax.jms.Connection.createSession(boolean transacted, int acknowledgeMode) throws JMSException        1.transacted事务,事务成功commit,才会将消息发送到mom中        2.acknowledgeMode消息确认机制         1)、带事务的session        如果session带有事务,并且事务成功提交,则消息被自动签收。如果事务回滚,则消息会被再次传送。     2)、不带事务的session        不带事务的session的签收方式,取决于session的配置。        Activemq支持一下三種模式:        Session.AUTO_ACKNOWLEDGE  消息自动签收        Session.CLIENT_ACKNOWLEDGE  客戶端调用acknowledge方法手动签收        Session.DUPS_OK_ACKNOWLEDGE 不是必须签收,消息可能会重复发送。在第二次重新传送消息的时候,消息        头的JmsDelivered会被置为true标示当前消息已经传送过一次,客户端需要进行消息的重复处理控制。     代码示例如下:     session = connection.createSession(true, Session.CLIENT_ACKNOWLEDGE);     textMsg.acknowledge();*/        Topic topic = session.createTopic("wm5920.topic");            MessageProducer producer = session.createProducer(topic);          producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);//设置非持久化  //        producer.setTimeToLive(5000);//5秒后过期,这个对点对点模式有效            TextMessage message = session.createTextMessage();              message.setText("message_" + System.currentTimeMillis());              producer.send(message);              System.out.println("Sent message: " + message.getText());      session.close();      connection.stop();      connection.close();      }  }

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

package com.activemq;import org.apache.activemq.ActiveMQConnectionFactory;  import javax.jms.*;  public class TopicSubs{public static void main(String[] args) throws JMSException {          ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");          Connection connection = factory.createConnection();          connection.setClientID("wm5920");        connection.start();                    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);          Topic topic = session.createTopic("wm5920.topic");                  //持久订阅方式,不会漏掉信息        TopicSubscriber subs=session.createDurableSubscriber(topic, "wm5920");        subs.setMessageListener(new MessageListener() {              public void onMessage(Message message) {                  TextMessage tm = (TextMessage) message;                  try {                      System.out.println("Received message: " + tm.getText());                  } catch (JMSException e) {                      e.printStackTrace();                  }              }          });                //非持久订阅方式//        MessageConsumer consumer = session.createConsumer(topic);  //        consumer.setMessageListener(new MessageListener() {  //            public void onMessage(Message message) {  //                TextMessage tm = (TextMessage) message;  //                try {  //                    System.out.println("Received message: " + tm.getText());  //                } catch (JMSException e) {  //                    e.printStackTrace();  //                }  //            }  //        }); //        session.commit();//      session.close();  //      connection.stop();  //      connection.close();      }  }


0 0
原创粉丝点击