ActiveMQ(18):Message之延迟和定时消息投递

一、简介

延迟和定时消息投递(Delay and Schedule Message Delivery)

有时候我们不希望消息马上被broker投递出去,而是想要消息60秒以后发给消费者,或者我们想让消息没隔

一定时间投递一次,一共投递指定的次数。。。类似这种需求,ActiveMQ提供了一种broker端消息定时调度

机制。

注意:

我们只需要把几个描述消息定时调度方式的参数作为属性添加到消息,broker端的调度器就会按照我们想要的行为去处理消息。

当然需要在xml中配置schedulerSupport属性为true

二、说明

一共有4个属性

1:AMQ_SCHEDULED_DELAY :延迟投递的时间

2:AMQ_SCHEDULED_PERIOD :重复投递的时间间隔

3:AMQ_SCHEDULED_REPEAT:重复投递次数

4:AMQ_SCHEDULED_CRON:Cron表达式

ActiveMQ也提供了一个封装的消息类型:org.apache.activemq.ScheduledMessage,可以使用这个类来辅助设置,

如:延迟60秒

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);

如:延迟30秒,投递10次,间隔10秒:

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);

如:使用 CRON 表达式,每个小时发送一次

TextMessage message = session.createTextMessage("test msg");

message.setStringProperty(ScheduledMessage.AMQ_SCHEDULED_CRON, "0 * * * *");

CRON表达式的优先级高于另外三个参数,如果在设置了CRON的同时,也有repeat和period参数,则会在每次CRON执行的时

候,重复投递repeat次,每次间隔为period。就是说设置是叠加的效果。

例如每小时都会发生消息被投递10次,延迟1秒开始,每次间隔1秒:

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);
时间: 2024-10-28 23:53:39

ActiveMQ(18):Message之延迟和定时消息投递的相关文章

JMS学习(八)-ActiveMQ Consumer 使用 push 还是 pull 获取消息

ActiveMQ是一个消息中间件,对于消费者而言有两种方式从消息中间件获取消息: ①Push方式:由消息中间件主动地将消息推送给消费者:②Pull方式:由消费者主动向消息中间件拉取消息.看一段官网对Push方式的解释: To be able to achieve high performance it is important to stream messages to consumers as fast as possible so that the consumer always has a

WCF技术剖析之十八:消息契约(Message Contract)和基于消息契约的序列化

在本篇文章中,我们将讨论WCF四大契约(服务契约.数据契约.消息契约和错误契约)之一的消息契约(Message Contract).服务契约关注于对服务操作的描述,数据契约关注于对于数据结构和格式的描述,而消息契约关注的是类型成员与消息元素的匹配关系. 我们知道只有可序列化的对象才能通过服务调用在客户端和服务端之间进行传递.到目前为止,我们知道的可序列化类型有两种:一种是应用了System.SerializableAttribute特性或者实现了System.Runtime.Serializat

ActiveMQ学习笔记(一)--认识消息JMS

1.面向消息的中间件 1.1 什么是MOM 面向消息的中间件,Message Oriented Middleware,简称MOM,利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成.一个MOM系统,通常会包括客户端(Client).消息(Message)和MOM,客户端是发送或者接收消息的应用程序,消息封装了要传递的内容,MOM可以存储和转发消息. 1.2 MOM的好处 降低系统间的通信复杂度.有了MOM,系统间通信可以跨编程语言.不用考虑复杂的网络编程,只需

Apache ActiveMQ实战(1)-基本安装配置与消息类型

ActiveMQ简介 ActiveMQ是一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用程序提供高效的.可扩展的.稳定的和安全的企业级消息通信.ActiveMQ使用Apache提供的授权,任何人都可以对其实现代码进行修改. ActiveMQ的设计目标是提供标准的,面向消息的,能够跨越多语言和多系统的应用集成消息通信中间件.ActiveMQ实现了JMS标准并提供了很多附加的特性.这些附加的特性包括,JMX管理(java Management Extensions,即java

linux笔记 2-3 系统延迟以及定时机制

**************3.系统延迟及定时机制************** ## 1.at延迟 ##at timeat> 动作at> ctrl+dat> <EOT>at -l                          查看等待任务atrm 任务号                    删除任务 例:设置延迟任务,在2:03时在/mnt新建文件test 当执行动作有输出时输出结果会以邮件形式发送给任务发起人mail                          

【转】Windows消息投递流程:WM_COMMAND消息流程

原文网址:http://blog.csdn.net/hyhnoproblem/article/details/6182585 该示例通过研究基本的单文档程序的“文件”--“打开”命令,分析WM_COMMAND消息投递流程.基于VS 2005 代码 AfxWndProc最终调用的是OnWndMsg,这个函数负责消息的分发处理.当消息是WM_COMMAND时,将消息投递给OnCommand函数. [cpp] view plaincopy // wincore.cpp 1746 BOOL CWnd::

消息服务百科全书——消息投递语义

消息投递语义(Message delivery semantics) 有如下几种可能的消息传递保障: 1.At most once:消息可能丢失,但是不会重复. 2.At least once:消息不会丢失,但是可能重复.系统保证每条消息至少会发送一次,但在有故障的情况下可能会导致重复发送. 3.Exactly once:仅仅一次-这种是人们实际想要的,每条消息只会而且仅会发送一次. 这里需要拆开为两个问题:发布消息保证和消费消息保证. 大多数系统号称支持Exactly once,但是仔细去看那

如何保障消息中间件 100% 消息投递成功?如何保证消息幂等性?

一.前言 二.分析问题 三.持久化 四.confirm机制 五.消息提前持久化 + 定时任务 六.幂等含义 6.1.为什么要有幂等这种场景? 6.2.乐观锁方案 6.3.唯一ID + 指纹码 6.4.Redis原子操作 <Java 2019 超神之路> <Dubbo 实现原理与源码解析 —— 精品合集> <Spring 实现原理与源码解析 —— 精品合集> <MyBatis 实现原理与源码解析 —— 精品合集> <Spring MVC 实现原理与源码解

springmvc(18)使用WebSocket 和 STOMP 实现消息功能

[0]README 1)本文旨在 介绍如何 利用 WebSocket 和 STOMP 实现消息功能: 2)要知道, WebSocket 是发送和接收消息的 底层API,而SockJS 是在 WebSocket 之上的 API:最后 STOMP(面向消息的简单文本协议)是基于 SockJS 的高级API (干货--简而言之,WebSocket 是底层协议,SockJS 是WebSocket 的备选方案,也是 底层协议,而 STOMP 是基于 WebSocket(SockJS) 的上层协议) 3)b