首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

12.6 使用ActiveMQ消息调度推迟发送消息

2014-01-05 
12.6 使用ActiveMQ消息调度延迟发送消息12.6 Scheduling messages to be delivered by ActiveMQ in the fu

12.6 使用ActiveMQ消息调度延迟发送消息

12.6 Scheduling messages to be delivered by ActiveMQ in the future

12.6 使用ActiveMQ消息调度延迟发送消息

?

The ability to schedule a message to be delivered after a delay, or at regular intervals,

is an extremely useful feature provided by ActiveMQ. One unique benefit is that messages

that are scheduled to be delivered in the future are stored persistently, so that

they can survive a hard failure of an ActiveMQ broker and be delivered on restart.

You specify that you want a message to be delivered at a later time by setting welldefined

properties on the message. For convenience, the well-known property names

are defined in the org.apache.activemq.ScheduledMessage interface. These properties

are shown in table 12.2.

?

ActiveMQ消息调度实现的消息延迟发送或者在按照固定时间的间隔实现间隔发送的功能十分有用.

其中一个独一无二的好处是消息调度设置为延迟发送的消息将会被持久化存储,因而在ActiveMQ代理

严重失效是消息不会丢失并且在代理重启后会继续发送消息.你可以通过严格定义消息的属性来设置如何

延迟发送消息.为方便起见,常用的延迟发送消息相关的属性都在org.apache.activemq.ScheduledMessage

接口中有定义,如表12.2所示.

?

Table 12.2 TransportConnector properties for updating clients of cluster changes

?

Property ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?type ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Description

AMQ_SCHEDULED_DELAY ? ? ? ? false ? ? ? ? ? ? ? ? ? The time in milliseconds that a message will wait before

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? being scheduled to be delivered by the broker

AMQ_SCHEDULED_DELAY ? ? ? ? false ? ? ? ? ? ? ? ? ? 消息延迟发送的延迟时间(单位毫秒) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

AMQ_SCHEDULED_PERIOD ? ? ?false ? ? ? ? ? ? ? ? ? ? The time in milliseconds after the start time to wait before

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? scheduling the message again

AMQ_SCHEDULED_PERIOD ? ? ?false ? ? ? ? ? ? ? ? ? ? 代理启动后,发送消息之前的等待时间(单位毫秒). ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

?

AMQ_SCHEDULED_REPEAT ? ? ?false ? ? ? ? ? ? ? ? ? ? The number of times to repeat scheduling a message for delivery

AMQ_SCHEDULED_REPEAT ? ? ?false ? ? ? ? ? ? ? ? ? ? 调度消息发送的重复次数

?

AMQ_SCHEDULED_CRON ? ? ? ?String ? ? ? ? ? ? ? ? ? ?Use a cron entry to set the schedule

AMQ_SCHEDULED_CRON ? ? ? ?String ? ? ? ? ? ? ? ? ? ?使用一个cron实体设置消息发送调度

?

To have a message wait for a period of time before its delivered, you only need to set

the AMQ_SCHEDULED_DELAY property. Suppose you want to publish a message from

your client, but have it actually delivered in 5 minutes time. You’d need to do something

like the following in your client code:

?

只需设置AMQ_SCHEDULED_DELAY这一个属性即可让消息等待一段时间后再发送.假设你打算从你的

客户端发送消息,但需要设置消息延迟5分钟后发送,你可以使用下面的客户端代码来实现:

?

? MessageProducer producer = session.createProducer(destination);

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

? long delayTime = 5 * 60 * 1000;

? message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, delayTime);

? producer.send(message);

?

ActiveMQ will store the message persistently in the broker, and when it’s scheduled, it

will deliver it to its destination. This is important, because although you’ve specified

that you want the message to be delivered in 5 minutes time, if the destination is a

queue, it will be posted to the end of the queue. So the actual delivery time will be

dependent on how many messages already exist on the queue awaiting delivery.

?

设置延迟发送之后,ActiveMQ将消息存储在代理中,等待设置的延时时间过了之后,消息会被发送到

设定的目的地.尽管你已经指定了消息在5分钟之后发送,但是如果消息目的地是一个消息队列,则消息

会被发送到队列的末端,这一点很重要.因而,消息发送的实际延迟时间将取决于当前消息的目的地队列中

有多少个正等待的消息.

?

You can also use a the AMQ_SCHEDULED_PERIOD and AMQ_SCHEDULED_REPEAT properties

to have messages delivered at a fixed rate. The following example will send a message

100 times, every 30 seconds:

你也可以使用AMQ_SCHEDULED_PERIOD和AMQ_SCHEDULED_REPEAT属性设置消息按照固定间隔时间

发送固定的次数.下面的示例代码将发送消息100,每次发送间隔时间为30秒:

?

? MessageProducer producer = session.createProducer(destination);

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

? long delay = 30 * 1000;

? long period = 30 * 1000;

? int repeat = 99;

? message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, delay);

? message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_PERIOD, period);

? message.setIntProperty(ScheduledMessage.AMQ_SCHEDULED_REPEAT,COUNT repeat);

? producer.send(message);

?

Note that we specified the repeat as being 99, as the first message + 99 = 100. If you

schedule a message to be sent once, the message ID will be the same as the one you

published. If you schedule a repeat, or use the AMQ_SCHEDULED_CRON property to

schedule your message, then ActiveMQ will create a unique message ID for the delivered

message.

?

注意,我们将消息重复发送的次数设置为99,因为第一次发送消息 + 99此重复=100.如果你设置消息只被

发送一次,那么消息的ID即使你设置的消息ID.如果你设置了重复发送,或者使用AMQ_SCHEDULED_CRON

属性来调度消息发送,那么ActiveMQ会生产一个新的唯一的消息ID作为重复发送的消息ID.

?

Cron is a well-known job scheduler on Unix systems, and it uses an expression

string to denote when a job should be scheduled. ActiveMQ uses the same syntax, as

described next:

?

Cron是Unix系统中任务调度器,它使用一个字符串来表示一个任务何时需要被执行.

ActiveMQ使用同样的预防,如下文本描述:

?

.---------------- ? ? minute (0 - 59)

| ?.-------------- ? ? hour (0 - 23)

| ?| ?.------------ ? ? day of month (1 - 31)

| ?| ?| ?.---------- ? ? month (1 - 12) - 1 = January

| ?| ?| ?| ?.-------- ? ? day of week (0 - 7) (Sunday=0 or 7

| ?| ?| ?| ?|

* ?* ?* ?* ?*

?

For example, if you want to schedule a message to be delivered at 2 a.m. on the twelfth

day of every month, you’d need to do the following:

?

例如,如果你打算在每月的12号早上2点发送消息,你需要按照如下代码所示进行设置:

?

? MessageProducer producer = session.createProducer(destination);

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

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

? producer.send(message);

?

You can combine scheduling with cron and a simple delay and repeat, but the cron

entry will always take precedence. For example, instead of sending one message at 2

a.m. on the twelfth day of every month, you may want to schedule 10 messages to be

delivered every 30 seconds:

?

你可以同时使用cron和普通的延迟与重复来调度消息发送,但是cron方式的调度具有优先权.例如,

不同于每月的12号早上2点只发送一条消息,你可能打算在每月的12号早上2点开始发送消息,

并且每隔30秒再重复发送9个消息:

?

? long delay = 30 * 1000;

? long period = 30 * 1000;

? int repeat = 9;

? MessageProducer producer = session.createProducer(destination);

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

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

? message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, delay);

? message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_PERIOD, period);

? message.setIntProperty(ScheduledMessage.AMQ_SCHEDULED_REPEAT,COUNT repeat);

? producer.send(message);

?

In this section we’ve looked at how to schedule messages for sometime in the future

using ActiveMQ. You should now be able to send messages after a delay, send multiple

instances of the same message at regular intervals, and use a cron entry to schedule

message delivery.

?

本节中我们看到了如何使用ActiveMQ调度消息发送使得消息能在未来的某个时间发送.现在,你应当能够

延迟发送消息,也能够以固定间隔时间重复发送消息,并且能够使用cron实体来调度消息发送.

?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

热点排行