【发布时间】:2016-11-09 09:14:05
【问题描述】:
我必须编写一个代码,其中涉及对后端进行异步 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 位客户应收到第二个 TFN,依此类推。
后端系统抱怨两个不同的同时客户登陆同一个 TFN。所以我觉得我的 TFNUtil.getNext() 逻辑不对。
谁能指出这里的错误?
【问题讨论】:
-
我认为 if(tfnList.size() >= index) { = 0;} 子句有问题。假设每次索引高于列表大小时它返回 0。所以在没有客户等于列表大小后返回 0。你能解释更多关于 tfnList
-
是的,在客户数量等于列表大小之后,我们希望将第一个 tfn 发送给列表大小之后的客户。这就是我提到循环赛的原因。
-
是的。那么当没有客户大于列表大小时应该是什么逻辑。系统假设第一个登录用户超时。也有可能假设没有客户 11 并且只有 TFN 3 可用。而不是去 TFN1 你可以使用 TFN3 对吗?你不能使用动态增长的列表。
-
当用户数大于 TFN 时,我们将循环提供 TFN
-
两个客户总是可以得到相同的 TFN 问题,即使在没有负载的情况下发生了 2 个客户呼叫,后端也得到了这个问题
标签: java multithreading stateless-session-bean