ActiveMQ消息的延时和定时投递

来源:互联网 发布:mac系统怎么改用户名 编辑:程序博客网 时间:2024/06/05 16:08

ActiveMQ对消息延时和定时投递做了很好的支持,其内部启动Scheduled来对该功能支持,也提供了一个封装的消息类型:org.apache.activemq.ScheduledMessage,只需要把几个描述消息定时调度方式的参数作为属性添加到消息,broker端的调度器就会按照我们想要的行为去处理消息。

Property nametypedescriptionAMQ_SCHEDULED_DELAYlong延迟投递的时间AMQ_SCHEDULED_PERIODlong重复投递的时间间隔AMQ_SCHEDULED_REPEATint重复投递次数AMQ_SCHEDULED_CRONStringCron表达式下面我们演示一下间隔性重复投递;

生产者:

[java] view plain copy
 print?
  1. package cn.slimsmart.study.activemq;  
  2.   
  3. import javax.jms.Connection;  
  4. import javax.jms.ConnectionFactory;  
  5. import javax.jms.DeliveryMode;  
  6. import javax.jms.Destination;  
  7. import javax.jms.MessageProducer;  
  8. import javax.jms.Session;  
  9. import javax.jms.TextMessage;  
  10.   
  11. import org.apache.activemq.ActiveMQConnection;  
  12. import org.apache.activemq.ActiveMQConnectionFactory;  
  13. import org.apache.activemq.ScheduledMessage;  
  14.   
  15. public class Producer {  
  16.   
  17.     public static final String broker_url = "failover:(tcp://10.1.199.169:61616)";  
  18.     private static String queue_name = "test.queue";  
  19.   
  20.     public static void main(String[] args) throws Exception {  
  21.         ConnectionFactory factory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, broker_url);  
  22.         // 通过工厂创建一个连接  
  23.         Connection connection = factory.createConnection();  
  24.         // 启动连接  
  25.         connection.start();  
  26.         // 创建一个session会话 事务 自动ack  
  27.         Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);  
  28.         // 创建一个消息队列  
  29.         Destination destination = session.createQueue(queue_name);  
  30.         // 创建生产者  
  31.         MessageProducer producer = session.createProducer(destination);  
  32.         // 消息持久化  
  33.         producer.setDeliveryMode(DeliveryMode.PERSISTENT);  
  34.         TextMessage message = session.createTextMessage("test delay message:" + System.currentTimeMillis());  
  35.         long time = 60 * 1000;// 延时1min  
  36.         long period = 10 * 1000;// 每个10s  
  37.         int repeat = 6;// 6次  
  38.         message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, time);  
  39.         message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_PERIOD, period);  
  40.         message.setIntProperty(ScheduledMessage.AMQ_SCHEDULED_REPEAT, repeat);  
  41.         // 发送消息  
  42.         producer.send(message);  
  43.         session.commit();  
  44.         producer.close();  
  45.         session.close();  
  46.         connection.close();  
  47.     }  
  48. }  
消费者代码:
[java] view plain copy
 print?
  1. package cn.slimsmart.study.activemq;  
  2.   
  3. import java.util.concurrent.CountDownLatch;  
  4.   
  5. import javax.jms.Connection;  
  6. import javax.jms.ConnectionFactory;  
  7. import javax.jms.Destination;  
  8. import javax.jms.JMSException;  
  9. import javax.jms.Message;  
  10. import javax.jms.MessageConsumer;  
  11. import javax.jms.MessageListener;  
  12. import javax.jms.Session;  
  13. import javax.jms.TextMessage;  
  14.   
  15. import org.apache.activemq.ActiveMQConnection;  
  16. import org.apache.activemq.ActiveMQConnectionFactory;  
  17.   
  18. public class Consumer {  
  19.   
  20.     public static final String broker_url = "failover:(tcp://10.1.199.169:61616)";  
  21.     private static String queue_name = "test.queue";  
  22.   
  23.     public static void main(String[] args) throws Exception {  
  24.         ConnectionFactory factory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, broker_url);  
  25.         // 通过工厂创建一个连接  
  26.         Connection connection = factory.createConnection();  
  27.         // 启动连接  
  28.         connection.start();  
  29.         // 创建一个session会话 事务 自动ack  
  30.         Session session = connection.createSession(Boolean.TRUE, Session.CLIENT_ACKNOWLEDGE);  
  31.         // 创建一个消息队列  
  32.         Destination destination = session.createQueue(queue_name);  
  33.         // 创建消费者  
  34.         MessageConsumer consumer = session.createConsumer(destination);  
  35.         consumer.setMessageListener(new MessageListener() {  
  36.             @Override  
  37.             public void onMessage(Message message) {  
  38.                 try {  
  39.                     System.out.println("receive message :" + ((TextMessage) message).getText());  
  40.                     message.acknowledge();  
  41.                 } catch (JMSException e) {  
  42.                     e.printStackTrace();  
  43.                 }  
  44.             }  
  45.         });  
  46.         new CountDownLatch(1).await();  
  47.     }  
  48. }  
阅读全文
0 0
原创粉丝点击