我必须编写一个代码,该代码涉及异步地对后端进行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()逻辑不正确。
有人可以指出这里的错误吗?
答案 0 :(得分:1)
你的言论自相矛盾。
一方面,您担心没有两个客户会收到相同的号码。
另一方面,你故意将一个系统放到适当的位置。
您会看到,根据您的列表tfnList
有多少元素...您的方法getNext()
可能会很快“溢出”。那你认为会发生什么?
对我来说,听起来真正的解决方案更复杂:您可能需要重新设计系统。您可能需要一个能够在一段时间内阻止/保留数字的系统,而不仅仅是旋转该数字列表。虽然保留了一个数字,但它不再发布。
一个简单的版本只是基于“时间”;意味着预约在X分钟/小时后自动“消失”。如果这不起作用;你必须更进一步:在你的工作流程中找到某个/某人取消保留数字以使其再次“可用”。
除此之外,似乎你没有充分考虑当有N个号码可用时会发生什么,但N + x客户同时进入!没有循环/旋转...无论什么可以帮助你!如果可能出现这种情况,那么你必须处理它并定义应该发生的事情!