2016-04-01 16 views
2

ile zamanlanmış bir zamana kadar işlenmesini engellemek için bir ileti geciktirin. Bunu yapmak için birçok farklı öğretici denedim ancak şu ana kadar bunu başaramadım.Hizmet Veri Yolu Kuyruğunda, NodeJS

Şu anda Hizmet Veri Yolu Kuyruğuna ve sürekli olarak yoklayan başka bir düğüme ileti gönderen bir nodejs uygulamasına sahibim. Amacım, sorgulama sisteminin iletiyi işleyebildiği belirli bir saat ve tarih ile sıraya bir ileti göndermektir.

Benim sonuçları şimdiye kadar ben mesajı göndermek en kısa sürede, görünür hale gelir ve hemen işlenir, burada Alıcım çok basittir

//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'); 
    } 
    }); 

ne olduğudur

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

Şimdiye kadar GitHub sayfasını iletinin özelliklerinin açıklamasını okudum ve sahip olduğum kadar doğru görünüyor ama hala çalışmıyor.

Eğer

cevap

3

Date.now() değil UTC, sizin saat diliminde bir tarih döndürür ederiz. Bunu UTC'ye dönüştürmeniz gerekiyor. This question bu konuda size yardımcı olabilir.

+0

hmmmm, bu sözleşmeyi [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now] Mozilla tarafından takip ettim. Ama ben yorumladı bağlantınızda sunulan çözüme bir deneyin vereceğini umarım, – Marcianin

+0

yardım ettim, ancak sağladığınız bağlantıdaki çözümleri denedim ama işe yaramıyor. Zaman farkını manuel olarak dengeleyerek çalışacaklarını düşündüm ama bu da değildi. Ben şimdiye kadar UTC içinde olacağı şekilde, şimdiye kadar zaman içinde bir nokta yaratıyorum ama yine de mesaj gönderilir gönderilmez işleniyor ... – Marcianin

0

Sorunlardan biri ScheduledEnqueueTimeUtc biçimindedir. Ben başarıyla tarihini ayarlayabilir ve biçimlendirmek için moment.js kullanarak node.js dan Azure Service Bus sıra iletileri geciktirmek başardı:

// 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' 
    } 
}; 

Servis Otobüs dokümanlar ve JavaScript SDK maalesef neyi biçimi hakkında bir şey söz görünmüyor ScheduledEnqueueTimeUtc, türün bir Dize olduğundan farklı olmalıdır. Ancak, .NET dillerinde kod örneklerine bakarsanız, değer, 'G' genel tarih ve saat biçimi belirtecinin varsayılanı olan DateTime.toString() kullanılarak iletilir (örnek: 5/1/2009 9:00:00 AM). Bu örneklerin ardından, formatı moment.js gibi bir şey kullanarak çoğaltabiliriz: "M/D/YYYY H: aa: ss A". TheDude'nin belirttiği gibi, 'un yerel saatle UTC olması gerektiğini unutmayın.

Ayrıca 8 sizin TimeToLive değeri işleme izin vermeyecek kadar kısa olabilir ve dikkat olabileceğini geciktirmek veya ScheduledEnqueueTimeUtcbelirtilen tarih ve saatte işlenecek garanti etmez kullanarak bir kuyruk zamanlama. Sadece mesajın daha önce işlenmeyeceğini garanti eder. Bkz. https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.brokeredmessage.scheduledenqueuetimeutc.aspx

+0

Bu ilginç bir öneridir, bunu bir atış ve rapor vereceğim, teşekkür ederim @Derek Seymour (ve evet, şimdiye değin tarihin o anda tam olarak işleneceğini garanti etmediğinin farkındaydım. belirtilen tarihten sonra işlendiği sürece tamam – Marcianin