2016-11-09 45 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等等。

後臺系統抱怨說,兩個不同的同時用戶登陸同一個TFN。所以我認爲我的TFNUtil.getNext()邏輯不正確。

任何人都可以請指出這裏的錯誤?

+0

我認爲問題與if(tfnList.size()> = index){= 0;}子句。假設每次索引高於列表大小,它將返回0.因此,當客戶端的數目不等於列表大小返回0.您可以解釋更多關於tfnList –

+0

是的客戶數量等於我們要發送的列表大小後首先到達名單大小後面的客戶。這就是爲什麼我提到循環賽。 –

+0

是的。那麼當沒有客戶超過列表大小時,應該是什麼邏輯。系統假設超時第一個登錄用戶。也有可能假設沒有客戶11和只有TFN 3可用。而不是去TFN1你可以使用TFN3嗎?不能使用動態增長列表。 –

回答

1

你的言論自相矛盾。

一方面,您擔心沒有兩個客戶應該收到相同的號碼。

另一方面,你有意將一個系統準確地做到這一點。

您會看到,取決於您的清單tfnList有多少元素......您的方法getNext()可能會「很快」溢出。那麼你認爲會發生什麼?

對我來說,聽起來真正的解決方案更復雜:您可能需要重新設計您的系統。您可能需要一個能夠在一段時間內阻止/保留號碼的系統,而不是僅僅旋轉該號碼列表。而一個號碼是保留的,它不會再發放。

一個簡單的版本將只是「時間」的基礎;這意味着保留一段時間後會自動消失。如果這不起作用;你必須更進一步:找到你的工作流程中的某個/某人un備用號碼以使它們再次「可用」。

除此之外,您似乎沒有完全考慮當您有N個號碼可用時會發生什麼,但N + x個客戶同時進來!沒有循環賽/旋轉......任何可以幫助你!如果這種情況是可能的,那麼你必須處理它,並定義將發生什麼呢!

+0

您的更新不幫助。它並沒有說明爲什麼你會驚訝地發現一種方法可以將**相同的數字返回給兩個人......就是這樣做的。如果您的10個號碼正在使用,並且您向第11位客戶提供了號碼1,那麼預計會發生什麼?也看看我的最新更新! – GhostCat

+0

我的意思是兩個同步的客戶獲得相同的TFN。這是後端系統所抱怨的。我只想要檢查/檢查代碼,並確保代碼按預期工作。 –

+0

使用線程池執行器編寫測試用例並測試一次你的TFNutils類 – Shashank