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

直接上代码

发布主题

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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值