使用node.js在特定延迟后从Azure ServiceBus主题发送消息

时间:2016-08-24 06:53:00

标签: node.js azure azureservicebus azure-servicebus-topics

基本上,在Azure Service Bus中,我有一个主题和一个订阅。

如果消息在上午11:00之前到达主题,我的订阅者不应该处理它。 但是,在下午14:00,我希望我的订阅者能够对待它。

有没有办法通过Topic过滤器本地实现这一目标?

我没有在有关过滤器的官方文档中找到任何关于此类用例的提及 实际上,所有呈现的样本都是关于:
订阅者处理此类邮件,或从不” 我正在寻找:
订阅者希望处理此类邮件,但稍后会在特定时间”。

2 个答案:

答案 0 :(得分:2)

听起来你想要推迟一条消息?

不太了解Azure SDK for Node.js,但是MSDN Documentation您可以在邮件上设置ScheduledEnqueueTimeUtc

  

UTC的预定入队时间。此值用于延迟消息发送。它用于延迟将来发送到特定时间的消息。

只有send a message to a Queue的样本是:

var message = {
    body: 'Test message',
    customProperties: {
        testproperty: 'TestValue'
}};
serviceBusService.sendQueueMessage('myqueue', message, function(error){
    if(!error){
        // message sent
    }
});

我从nodejs sdk找到了一个定义这些属性的constants.js文件:

/**
* The broker properties for service bus queue messages.
*
* @const
* @type {string}
*/
BROKER_PROPERTIES_HEADER: 'brokerproperties',
...
/**
* The scheduled enqueue time header.
*
* @const
* @type {string}
*/
SCHEDULED_ENQUEUE_TIME_HEADER: 'x-ms-scheduled-enqueue-time',

如果您查看servicebusservice.js,则会有一个setRequestHeaders函数,它会获取邮件的某些属性并将其设置为标头。

所以我想你可以在这样的消息上设置这个属性:

// Set your scheduled date
var scheduledDate = Date.now();
scheduledDate.setHours(scheduledDate.getHours()+3);

var message = {
    body: 'Test message',
    brokerproperties: {
        'x-ms-scheduled-enqueue-time': scheduledDate.toUTCString()
}};

让我知道它是否有效: - )

答案 1 :(得分:0)

我能够使用它来实现它:

        const scheduledDate = new Date();
        scheduledDate.setMinutes(scheduledDate.getMinutes()+1);

        const message = {
        body: 'Hey, this worked again!',
        customProperties: {
            testproperty: 'TestValue'
        },
        brokerProperties: {
            ScheduledEnqueueTimeUtc: scheduledDate.toUTCString()
        }
    };
    serviceBusService.sendQueueMessage('myqueue', message, function(error){
        if(!error){
            console.log('We sent a message. Huzzah!');
        }
    });