2016-04-01 4 views
2

でスケジュールされた時間まで処理されないようにするまでこれまで多くのチュートリアルを試してみましたが、これまでこれを達成できませんでした。Service Bus QueueのメッセージがNodeJS

現在、私はサービスバスキューにメッセージを送信するnodejsアプリケーションと、引き続きポーリングする別のnodejを持っています。私の目標は、ポーリングシステムがメッセージを処理できる特定の日時を持つキューにメッセージを送信することです。

マイ結果、これまで私がメッセージを送信するとすぐに、それは目に見えるようになると、それはすぐに処理され、ここで私は私の受信機は非常に簡単です

//made some changes after the first suggestion, but still does not work 
//what I'm doing here is offsetting the time difference with UTC(im in GMT-7 tz) by adding it manually 
//(this is just a test so if this would have worked I would have made it more elegant) 
var scheduled_time = new Date().valueOf() + ((60000*60)*7.5); 
    var current_time = Date.now(); 
    console.log(scheduled_time, current_time); 

    var message = { 
    body: 'Time ' + current_time.toString(), 
    brokerProperties:{ 
     ScheduledEnqueueTimeUtc: scheduled_time, 
     TimeToLive: 8 
    }, 
    customProperties: { 
     testproperty: 'TestValue' 
    }}; 

    serviceBus.sendQueueMessage('myqueue', message, function(error){ 
    if(!error){ 
     // message sent 
     console.log('message sent'); 
    } 
    }); 

を持っているものであるということである

function receiveMessages() { 
    serviceBus.receiveQueueMessage(queue, 
     function (error, message) { 
     if (error) { 
      console.log(error); 
     } else { 
      console.log('Process after ' + message.brokerProperties.ScheduledEnqueueTimeUtc); 
     } 
     }); 
}; 

これまでのところ、GitHubページにはメッセージのプロパティの説明がありますが、それは正しいと思われますが、それでも動作しません。

答えて

3

Date.now()があなたのタイムゾーンではなく、UTCの日付を返します。ありがとうございます。それをUTCに変換する必要があります。 This questionはあなたを助けることができます。

+0

hmmmm Mozillaのこの規約[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now]に従っています。しかし、私はあなたのコメントリンクに提示されたソリューションに試してみることをお勧めします。うまくいけば – Marcianin

+0

あなたが提供したリンクで解決策を試しましたが、どちらもうまくいきません。私は時間差を手動で相殺することによってそれがうまくいくと思ったが、どちらもしなかった。私は手動でこれまでのところ、将来的にはUTCになると思っていましたが、メッセージは送信されるとすぐに処理されます。 – Marcianin

0

問題の1つは、ScheduledEnqueueTimeUtcの形式で表示されます。私は正常に日付を調整し、フォーマットするmoment.jsを使ってNode.jsのからのAzure Service Busでキューメッセージを遅らせることができた:

// Delay message by 1 hour 
var scheduled_time = moment().utc().add(1, 'hour').format('M/D/YYYY H:mm:ss A'); 
var message = { 
    body: 'Time ' + Date.now().toString(), 
    brokerProperties: { 
     ScheduledEnqueueTimeUtc: scheduled_time 
    }, 
    customProperties: { 
     testproperty: 'TestValue' 
    } 
}; 

Service BusのドキュメントとJavaScript SDKは、残念ながらどのような形式については何も言及して表示されません。 ScheduledEnqueueTimeUtcは、型がStringであること以外は同じである必要があります。しかし、.NET言語のコード例を見ると、その値はDateTime.toString()を使って渡されます。デフォルトは 'G'の一般的な日付と時刻の書式指定子です(例:5/1/2009 9:00:00 AM)。これらの例に続いて、 "M/D/YYYY H:mm:ss A"のような形式を使用してフォーマットを複製することができます。 TheDudeが言及したように、値は現地時間ではなく、UTCでなければなりません。

また、8のあなたのTimeToLive値は、処理を可能にするには短すぎること、およびScheduledEnqueueTimeUtcを使用してキューを遅らせるか、スケジュールすることが指定した日時に処理されること保証するものではないことに気づくかもしれません。それは、メッセージがあらかじめ処理されないことを保証するだけです。備考を参照してくださいhttps://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.brokeredmessage.scheduledenqueuetimeutc.aspx

+0

これは興味深い提案です。これをショットにして返信します。@Derek Seymourに感謝します(そして、はい、エンキューされた日付は、その正確な瞬間に処理されることを保証していません指定された日付の後に処理されている間はOKです) – Marcianin

関連する問題