zoukankan      html  css  js  c++  java
  • activeMq延迟消息队列

    Long delay = 30 * 1000L;
    jmsTemplate.send(type.getValue(),new MessageCreator() {
    @Override
    public Message createMessage(Session session) throws JMSException {
    TextMessage message = session.createTextMessage();
    message.setText(JSON.toJSONString(data));
    message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, delay);
    return message;
    }
    });
    延时三秒发送消息

    版本5.4的 ActiveMQ 具有内置于ActiveMQ消息代理中的可选持久调度程序。通过Xml配置中将broker schedulerSupport属性设置为true 来启用它ActiveMQ客户端可以通过使用以下消息属性来利用延迟传递:

    检查邮件属性

    message属性scheduledJobId 保留供Job Scheduler使用。如果在发送之前设置了此属性,则将立即发送消息而不安排该消息。此外,在收到预定的消息后,scheduledJobId 将在接收的消息上设置属性,因此如果使用类似Camel Route的内容可能会记住这一点,这可能会在重新发送消息时自动复制属性。

    Property nametypedescription
    AMQ_SCHEDULED_DELAY long 消息在计划由代理传递之前等待的时间(以毫秒为单位)
    AMQ_SCHEDULED_PERIOD long 在再次计划消息之前等待的开始时间之后等待的时间(以毫秒为单位)
    AMQ_SCHEDULED_REPEAT int 重复安排邮件以进行传递的次数
    AMQ_SCHEDULED_CRON String 使用Cron条目设置计划

    为了实现Java JMS客户端的连接 - 有一个接口,其中包含用于在org.apache.activemq.ScheduledMessage中进行调度的属性名称

    例如,要在60秒内安排发送消息 - 您需要设置AMQ_SCHEDULED_DELAY属性:

    MessageProducer producer = session.createProducer(destination);
    TextMessage message = session.createTextMessage("test msg");
    long time = 60 * 1000;
    message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, time);
    producer.send(message);
    

    您可以将消息设置为等待初始延迟,重复传递10次,每次重新传递之间等待10秒:

    MessageProducer producer = session.createProducer(destination);
    TextMessage message = session.createTextMessage("test msg");
    long delay = 30 * 1000;
    long period = 10 * 1000;
    int repeat = 9;
    message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, delay);
    message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_PERIOD, period);
    message.setIntProperty(ScheduledMessage.AMQ_SCHEDULED_REPEAT, repeat);
    producer.send(message);
    

    您还可以使用CRON来安排消息,例如,如果您希望每小时安排一条消息,则需要将CRON条目设置为 - 0 * * * *- 例如

    MessageProducer producer = session.createProducer(destination);
    TextMessage message = session.createTextMessage("test msg");
    message.setStringProperty(ScheduledMessage.AMQ_SCHEDULED_CRON, "0 * * * *");
    producer.send(message);
    

    CRON调度优先于使用消息延迟 - 但是,如果使用CRON条目设置repeat和period,则ActiveMQ调度程序将在每次CRON条目触发时安排消息的传递。用例子更容易解释。假设您希望将消息传递10次,每条消息之间有一秒钟的延迟 - 并且您希望每小时发生一次 - 您可以这样做:

    MessageProducer producer = session.createProducer(destination);
    TextMessage message = session.createTextMessage("test msg");
    message.setStringProperty(ScheduledMessage.AMQ_SCHEDULED_CRON, "0 * * * *");
    message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, 1000);
    message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_PERIOD, 1000);
    message.setIntProperty(ScheduledMessage.AMQ_SCHEDULED_REPEAT, 9);
    producer.send(message);

    官方文档:http://activemq.apache.org/delay-and-schedule-message-delivery.html

  • 相关阅读:
    Android设计中的.9.png图片
    Socket原理
    word2vec中文类似词计算和聚类的使用说明及c语言源代码
    Scala之集合Collection
    使用C语言调用mysql数据库编程实战以及技巧
    Web学习篇之---html基础知识(一)
    μCOS-II系统之事件(event)的使用规则及Semaphore实例
    activiti自己定义流程之Spring整合activiti-modeler实例(一):环境搭建
    将ASP.NET用户控件转化为自定义控件
    【C#】Excel导出合并行和列并动态加载行与列
  • 原文地址:https://www.cnblogs.com/2661314cn/p/10794831.html
Copyright © 2011-2022 走看看