【问题标题】:How to return values from a list in round robin in a multi threaded environment?如何在多线程环境中以循环方式从列表中返回值?
【发布时间】: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


【解决方案1】:

你的陈述自相矛盾。

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

另一方面,您特意安装了一个系统来完全做到这一点。

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

在我看来,真正的解决方案听起来更复杂:您可能需要重新设计您的系统。您可能需要一个能够在一段时间内阻止/保留号码的系统,而不仅仅是轮换该号码列表。虽然保留了一个号码,但不会再次分发。

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

除此之外,您似乎没有充分考虑当您有 N 个可用号码但同时有 N+x 个客户进来时会发生什么!没有循环/轮换......任何可以帮助你的东西!如果这种情况是可能的,那么你必须处理它并定义接下来应该发生的事情!

【讨论】:

  • 您的更新没有帮助。它没有说明为什么您会惊讶于一个可以将 same 数字返回给两个人的方法......正是这样做的。如果您的 10 个号码正在使用中,并且您将 1 号分发给第 11 位客户,会发生什么?!也看看我的最新更新!
  • 我的意思是同时有两个客户获得相同的 TFN。这就是后端系统所抱怨的。我只想检查/审查代码并确保代码按预期工作。
  • 使用线程池执行器编写测试用例并测试您的 TFNutils 类一次
  • @shashank 你能告诉我一些如何使用线程池执行器的例子吗?或者你能告诉我具体该怎么做吗?那会很有帮助。
  • 进行此类实验没有意义。代码是线程安全的,问题出在损坏的设计上。此外:定义一个有帮助的多线程测试用例真的很难。你知道:一个通过的测试用例......没有任何意义。因为可能还有其他线程场景会失败。但如前所述:问题不是关于具有多线程问题的代码! 整个系统有问题!
猜你喜欢
  • 2018-08-15
  • 2012-02-17
  • 2018-07-03
  • 1970-01-01
  • 2015-06-10
  • 2020-09-26
  • 2018-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多