2016-07-05 3 views
-1

javaでjavaユーティリティメソッドが必要です(何千ものリクエストが1秒間に届くアプリケーション用)。これには以下の機能があります。 リクエストには(DD-MM-YYYY-HH:MM:SS)とbucketNumber(1-100)の形式の到着時刻があります。リクエストの到着日数を1ms増加させる方法

同じbucketNumberの場合、同じ到着時間が要求から来る場合は、要求の到着時間の値を1ミリ秒増加させる必要があります。例えば

:00:00(実際には時間ミリ01-01-2016-10までの第1、第2、第3要求= 01-01-2016-10ためbucketNumber = 1つの到着時間

場合: 00:00:000)、01-01-2016-10:00:01の4番目のリクエストです。

だから、第二の要求のためのユーティリティメソッドが返されます01-01-2016-10:00:00(ただし、この実際01-01-2016-10:00:00:001)

と第三の要求のためにユーティリティメソッドは01-01-2016-10:00:00を返します(実際は01-01-2016-10:00:00:002)

そして、4番目のリクエストでは、ユーティリティメソッドは01-01を返します-2016-10:00:01のみ、操作を実行しないでください。

私はこのアクションを実行するために巨大なキャッシュを保持したくありません(もし私がセットを使用していれば、データも冗長なまま削除したいと思います)。

//signature should be like below 
Date getIncrementedArrivalTimeIfSame(Date arrivaltime, int bucketNumber) { 
//return incremented if equal else return original arrivaltime 
} 

私はbucketNumberをキーとし、到着時間を持つセットを持つグローバルマップを使用すべきですか?これを実装するのを手伝ってください。このメソッドはsynchronizedブロック内でthreadSafe方法で呼び出されます。

答えて

0

以下は私の解決策です。 最終的に地図を使用しました:

static Map<Integer, Date> arrivalTimeMap = new HashMap<>(); 
static Date getIncrementedArrivalTimeIfEqual(Date arrivaltime, 
      int bucketNumber) { 

     Date lastArrivalTime = arrivalTimeMap.put(bucketNumber, arrivaltime); 
     if(lastArrivalTime != null && !lastArrivalTime.before(arrivaltime)){ 
      Date incrementedArrivalTime = incrementDateByMilliSeconds(
        lastArrivalTime, 1); 
      arrivaltime = incrementedArrivalTime; 

     } 
     arrivalTimeMap.put(bucketNumber, arrivaltime);  
     return arrivaltime; 
    } 
関連する問題