バックエンドへのWebサービスコールを非同期的に行い、TFNのリストから呼び出し側にラウンドロビンでフリーダイヤル番号を返すコードを記述する必要があります。以下は私のコードですマルチスレッド環境でラウンドロビンでリストから値を返す方法は?
@Stateless
public class TollFreeServiceBean {
@EJB
private AsyncBackendService asyncBean;
public long getTollFreeNumber(Request request) {
//Validate request
asyncBean.callBackend(request);
return TFNUtil.getNext();
}
}
@Stateless
public class AsyncBackendService {
@Asynchronous
public void callBackend(Request request) {
// Call web service and inform a caller with `Request` is going to call
}
}
public class TFNUtil {
private static int index = 0;
private TFNUtil(){}
public static synchronized long getNext() {
// Get TFN list from cache
if(tfnList.size() >= index) {
index = 0;
}
long tfn = tfnList.get(index);
index++;
return tfn;
}
}
キャッシュ内のTFNが完了するまで、お客様は別々のTFNを取得します。完了したら、次の顧客は再び最初のTFNを取得する必要があります。たとえば、10のTFNと11の顧客がある場合、11番目の顧客は1番目のTFNを受け取る必要があります。第12の顧客は第2のTFNなどを受け取るべきである。
バックエンドシステムは、2人の異なる同時顧客が同じTFNに着陸していると訴えています。だから私のTFNUtil.getNext()ロジックが正しくないと思う。
誰でもこのバグを指摘できますか?
if(tfnList.size()> = index){= 0;}節で問題があると思います。たびたびインデックスがリストサイズよりも大きいと仮定して、それは0を返します。したがって、cusomtersがリストサイズと等しい場合、0を返すことができます。tfnListについてもっと詳しく説明できます。 –
はい、顧客数がリストサイズに等しいリストサイズの後に来る顧客への最初のtfn。だから私はラウンドロビンについて述べました。 –
はい。リストのサイズよりも大きい顧客がいないときは、どのようなロジックにすべきか。システムは最初にログに記録されたユーザーをタイムアウトさせると仮定します。顧客11およびTFN3のみが利用可能であると仮定することも可能である。 TFN1に行くのではなく、TFN3を正しく使うことができますか?あなたは動的に成長するリストを使うことはできません。 –