2016-11-09 12 views
2

バックエンドへの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()ロジックが正しくないと思う。

誰でもこのバグを指摘できますか?

+0

if(tfnList.size()> = index){= 0;}節で問題があると思います。たびたびインデックスがリストサイズよりも大きいと仮定して、それは0を返します。したがって、cusomtersがリストサイズと等しい場合、0を返すことができます。tfnListについてもっと詳しく説明できます。 –

+0

はい、顧客数がリストサイズに等しいリストサイズの後に来る顧客への最初のtfn。だから私はラウンドロビンについて述べました。 –

+0

はい。リストのサイズよりも大きい顧客がいないときは、どのようなロジックにすべきか。システムは最初にログに記録されたユーザーをタイムアウトさせると仮定します。顧客11およびTFN3のみが利用可能であると仮定することも可能である。 TFN1に行くのではなく、TFN3を正しく使うことができますか?あなたは動的に成長するリストを使うことはできません。 –

答えて

1

お客様の声明は矛盾しています。

一方で、と同じが2人のお客様に届かないと心配しています。

一方、正確にそれを行うシステムを意図的に配置します。

あなたのリストtfnListの要素数に応じて、あなたのメソッドgetNext()は非常に「スピルオーバー」する可能性があります。それではどうなると思いますか?

私にとっては、実際のソリューションがより複雑なように聞こえます。システムを再設計する必要があるかもしれません。その数字のリストを回転させるだけではなく、しばらくの間に番号をブロック/予約できるシステムが必要になるかもしれません。番号は予約されていますが、再度渡されることはありません。

単純なバージョンのものは、「時間」ベースのみです。あるX分/時間後に自動的に予約が "消滅"することを意味します。それが動作しない場合。あなたはさらに一歩進んでいく必要があります:あなたのワークフローで何かを見つけてにunを予約して、それらを再び "利用可能"にする予約番号。

それ以上に、N個の番号を利用できるときに何が起こるべきかを完全には考えていないようですが、同時にN + xのお客様が来ているようです。ラウンドロビン/回転...あなたを助けることができるものはありません!そのような状況が可能であれば、それに対処して何が起こるべきかを定義しなければなりません!

+0

あなたのアップデートは役に立たない。 2人に**同じ**番号を返すことができる方法がちょうどそれをすることに驚いた理由を明確にしていません。あなたの10の数字が使用中で、11番の顧客に1番の番号をあげたら、何が起こると思いますか?また、私の最新のアップデートを見て! – GhostCat

+0

私は、同時に2人の顧客が同じTFNを取得していることを意味していました。これがバックエンドシステムが不平を言っていることです。私は、コードをチェック/レビューして、コードが期待どおりに機能していることを確認したいだけです。 –

+0

スレッドプールエグゼキュータを使用してテストケースを作成し、一度TFNutilsクラスをテストしてください – Shashank

関連する問題