2016-11-09 4 views
2

Мне нужно написать код, который включает асинхронный вызов веб-службы на бэкэнд и возврат бесплатного номера в циклическом роуминге из списка 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() неверна.

Может ли кто-нибудь указать на ошибку здесь?

+0

Я думаю, проблема с if (tfnList.size()> = index) {= 0;}. предположим, что каждый раз, когда индекс больше, чем размер списка, он возвращает 0. поэтому после того, как никакие из cusomters не равны возврату размера списка 0. Может ли узнать больше о tfnList –

+0

Да после того, как количество клиентов равно размеру списка, мы хотим отправить сначала tfn для клиента, следующего за размером списка. Вот почему я упомянул круглый робин. –

+0

да. то что должно быть логичным, если ни один из клиентов не превышает размер списка. система предполагает тайм-аут первого зарегистрированного пользователя. также можно предположить, что нет клиентов 11 и только TFN 3. вместо того, чтобы идти в TFN1, вы можете использовать TFN3 правильно? не используйте динамически растущий список. –

ответ

1

Ваши заявления противоречат друг другу.

С одной стороны, вы беспокоитесь, что ни один из двух клиентов не должен получать номер.

С другой стороны, вы намеренно устанавливаете систему на место, которая точно это сделает.

Вы видите, в зависимости от количества элементов вашего списка tfnList имеет ... ваш метод getNext() может «пролить» довольно быстро. И что, по-вашему, произойдет?

Для меня это похоже на то, что реальное решение сложнее: вам, возможно, придется перепроектировать вашу систему. Вместо того, чтобы просто поворачивать этот список чисел, вам может понадобиться система, которая может заблокировать/зарезервировать номер в течение некоторого времени. И пока номер зарезервирован, он не раздается снова.

Простая версия этого будет «только время»; что означает, что бронирование «исчезает» автоматически через несколько минут или часов. Если это не сработает; вам нужно пойти еще на один шаг: и найти что-то/кого-то в вашем рабочем процессе, чтобы до un зарезервировать номера, чтобы они снова были «доступны».

И, кроме того, кажется, что вы не полностью учли, что должно произойти, когда у вас есть номера N, но клиенты N + x входят в одно и то же время! Никакой круговой поворот/поворот ... все, что может вам помочь! Если такая ситуация возможна, тогда вам придется иметь дело с ней и определить, что должно произойти тогда!

+0

Ваше обновление не помогает. Он не разъясняет, почему вы удивлены тем, что метод, который может вернуть ** тот же номер ** двум людям ... делает именно это. Если ваши 10 номеров используются, и вы выдаете номер 1 11-му клиенту, что ожидать? Также посмотрите мои последние обновления! – GhostCat

+0

Я имел в виду, что два одновременных клиента получают тот же TFN. Об этом жалуется бэкэнд-система. Я просто хочу, чтобы код был проверен/проверен и убедитесь, что код работает должным образом. –

+0

написать тестовый пример с помощью исполнителя пула потоков и протестировать ваш класс TFNutils один раз – Shashank