我必须编写一个代码,其中涉及异步地对后端进行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个客户进来!无需轮转/轮转……在这里有什么可以帮助您的!如果这种情况是可能的,那么您必须处理它,然后定义应该发生的事情!