如何在多线程环境中循环返回列表中的值?

时间:2016-11-09 09:14:06

标签: java multithreading stateless-session-bean

我必须编写一个代码,该代码涉及异步地对后端进行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位客户应该获得第二个TFN,等等。

后端系统抱怨两个不同的同时客户登陆同一个TFN。所以我认为我的TFNUtil.getNext()逻辑不正确。

有人可以指出这里的错误吗?

1 个答案:

答案 0 :(得分:1)

你的言论自相矛盾。

一方面,您担心没有两个客户会收到相同的号码。

另一方面,你故意将一个系统放到适当的位置。

您会看到,根据您的列表tfnList有多少元素...您的方法getNext()可能会很快“溢出”。那你认为会发生什么?

对我来说,听起来真正的解决方案更复杂:您可能需要重新设计系统。您可能需要一个能够在一段时间内阻止/保留数字的系统,而不仅仅是旋转该数字列表。虽然保留了一个数字,但它不再发布。

一个简单的版本只是基于“时间”;意味着预约在X分钟/小时后自动“消失”。如果这不起作用;你必须更进一步:在你的工作流程中找到某个/某人取消保留数字以使其再次“可用”。

除此之外,似乎你没有充分考虑当有N个号码可用时会发生什么,但N + x客户同时进入!没有循环/旋转...无论什么可以帮助你!如果可能出现这种情况,那么你必须处理它并定义应该发生的事情!