2016-03-31 21 views
1

Aşağıdaki sistemi var. consumer için bool değerini döndüren proxy A, 10'dan daha fazla üretirseproxy döndürürse, üreticinin kaç tane oluşturduğuna bağlıdır.Sıklıkla oluşturulan iletiler nasıl ele alınır? <code>10 msg/second</code> -</p> <pre><code>producer ---> proxy ---> consumer <good> 10 msg/s </code></pre> <p>iletileri oluşturur A <code>producer</code>:

Bu timestamp: 0.1 gelir

0,1 0,2 0,25 0,26 0,27 0,28 0,29 0,30 0,31 0,32 0,33 0,34 2,0 2,1 2,2

Mesajlar , 0.2, 0.25 ... 0.32 onlar good ve biz true döndürür, 0.32 çünkü 1 saniyede 11. mesaj, false döndürür.

bool shouldProxyAcceptMessage(float timestamp) 

Nasıl bu algoritmayı uygulayabilirsiniz: Burada

bir protoype nedir?

+1

tekrar 'TRUE dönen başlayacaktı? – blazs

cevap

-1

Tamam, çözümü OP'nin yorumlarına göre uyarladım. Algoritma, nrMessages ve startTime olmak üzere iki global değişken kullanır ve nrMessage==0 (yani ilk mesajı aldığında) geçerli zamana startTime başlatır; 1 saniye içinde gelen ilk 10 zaman damgası için doğru döner. 1 saniyeden daha eski bir zaman damgası aldığında, nrMessages=0 sıfırlanır (böylece bir sonraki zaman damgası geldiğinde startTime yeniden başlatılır).

bir örtük varsayım bizler

long nrMessages = 0; // global variable 
long startTime = 0; 
boolean shouldProxyAcceptMessage(long timestamp) { 
    if (nrMessages++ == 0) { 
     startTime = System.currentTimeMillis()(); 
    } 
    timeDiff = timestamp-startTime; 
    if (timeDiff > 1000) { 
     nrMessages = 0; 
     return false; 
    } else { 
     return nrMessages <= 10; 
    } 
} 
+1

Nasıl kontrol edersiniz 'timestamp' veya kötü? –

+0

@Anatoly, ilk iletinin oluşturulduğu zamanı hatırlamak yeterli olur mu? – blazs

+0

@Anatoly Şimdi sadece bir saniye içinde sadece ilk 10 zaman damgası için doğru döndürüyorum. İstediğin şey bu mu? – blazs

İlgili konular