关闭

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

标签: activemq消息时长异常处理确认机制事务
3626人阅读 评论(0) 收藏 举报
分类:

直接上代码

发布主题

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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:211343次
    • 积分:3674
    • 等级:
    • 排名:第9360名
    • 原创:132篇
    • 转载:77篇
    • 译文:0篇
    • 评论:41条
    心境
    • n年后的事情会是什么样子
    • 谁知道呢
    • 做好现在吧
    • 每天能进步一点
    • 你就应该满足了
    博客专栏