我必須編寫一個代碼,該代碼涉及異步地向後端發起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()邏輯不正確。
任何人都可以請指出這裏的錯誤?
我認爲問題與if(tfnList.size()> = index){= 0;}子句。假設每次索引高於列表大小,它將返回0.因此,當客戶端的數目不等於列表大小返回0.您可以解釋更多關於tfnList –
是的客戶數量等於我們要發送的列表大小後首先到達名單大小後面的客戶。這就是爲什麼我提到循環賽。 –
是的。那麼當沒有客戶超過列表大小時,應該是什麼邏輯。系統假設超時第一個登錄用戶。也有可能假設沒有客戶11和只有TFN 3可用。而不是去TFN1你可以使用TFN3嗎?不能使用動態增長列表。 –