我必须编写一个代码,其中涉及异步地对后端进行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个客户应获得第一个TFN。第12个客户应收到第2个TFN,依此类推。

后端系统提示两个不同的同时客户正在同一TFN上着陆。所以我认为我的TFNUtil.getNext()逻辑不正确。

任何人都可以在这里指出错误吗?

最佳答案

您的陈述自相矛盾。

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

另一方面,您故意将一个系统正确地放置到位。

您会看到,取决于列表tfnList具有多少元素……您的方法getNext()可能很快就会“溢出”。那么您认为会发生什么呢?

对我来说,听起来像是真正的解决方案更复杂:您可能必须重新设计系统。您可能需要一个能够在一段时间内阻止/保留号码的系统,而不只是旋转号码列表。并且尽管保留了号码,但不会再次分发。

一个简单的版本将仅基于“时间”。这意味着预订会在X分钟/小时后自动“消失”。如果那不起作用;您将必须进一步:在您的工作流程中找到可以保留号码以使其再次“可用”的某物/某人。

除此之外,您似乎并没有完全考虑当您有N个电话号码时应该怎么办,但是同时有N + x个客户进来!无需轮转/轮转……在这里有什么可以帮助您的!如果这种情况是可能的,那么您必须处理它,然后定义应该发生的事情!

10-08 13:50