Мне нужно написать код, который включает асинхронный вызов веб-службы на бэкэнд и возврат бесплатного номера в циклическом роуминге из списка TFN для вызывающего. Ниже мой кодКак вернуть значения из списка в round robin в многопоточной среде?
@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 каждый, пока TFNs в кэше будет завершен. После завершения следующего клиента новый TFN снова получит. Например, если 10 TFN и 11 клиентов, 11-й клиент должен получить 1-й TFN. 12-й клиент должен получить 2-й TFN и так далее.
Бэкэнд-система жалуется, что два разных одновременных клиента высаживаются на тот же TFN. Поэтому я думаю, что моя логика TFNUtil.getNext() неверна.
Может ли кто-нибудь указать на ошибку здесь?
Я думаю, проблема с if (tfnList.size()> = index) {= 0;}. предположим, что каждый раз, когда индекс больше, чем размер списка, он возвращает 0. поэтому после того, как никакие из cusomters не равны возврату размера списка 0. Может ли узнать больше о tfnList –
Да после того, как количество клиентов равно размеру списка, мы хотим отправить сначала tfn для клиента, следующего за размером списка. Вот почему я упомянул круглый робин. –
да. то что должно быть логичным, если ни один из клиентов не превышает размер списка. система предполагает тайм-аут первого зарегистрированного пользователя. также можно предположить, что нет клиентов 11 и только TFN 3. вместо того, чтобы идти в TFN1, вы можете использовать TFN3 правильно? не используйте динамически растущий список. –