【问题标题】:Processing methods/threads in correct order以正确的顺序处理方法/线程
【发布时间】:2017-06-21 17:27:31
【问题描述】:

我有一个非常复杂的应用程序(它是一个指挥和控制中心弹簧 + 基于角度的应用程序,旨在供警察和其他紧急中心控制器使用)。

应用程序的主要组件(我们称之为骨干网 [spring web app])是与不同应用程序/硬件的通信。大多数通信是通过使用 RabbitMQ 消息完成的(我们称它们为电报或简称 TM)。

当主干接收到其中一个 TM 时,会创建新线程并在其中执行一些方法/方法。

问题在于,主干可能几乎同时接收两个或多个 TM,并且由于它们在不同的线程中执行,因此可能会发生它们在到达时没有按照相同的顺序进行处理,因此错误的信息是呈现给用户。

通常,我使用 Redis 处理此类问题。我有一个基本上看起来像这样的redis锁

distributedRedisLocker.lock(() -> {
    executeSomeMethod();
}, howLongIsLockKept, howLongDoWeWaitForItToFinnish);

但在这种情况下,我想避免使用 redis,还有其他基于 java/spring 的解决方案吗?

我不需要它与我拥有的 redis 锁相同,只是我想要的是 TM 按到达顺序进行处理,如果其中一个在方法执行的某个地方失败,它不会阻止下一个永远。

【问题讨论】:

  • 在像Executors.newSingleThreadExecutor() 这样的单线程执行器中处理这些 TM 怎么样?
  • 这听起来不错,会尝试并更新进度。

标签: java spring multithreading parallel-processing


【解决方案1】:

转发作为答案。

解决问题的一种方法是避免并发。你可以使用Executors.newSingleThreadExecutor(),它只使用一个线程:

ExecutorService executor = Executors.newSingleThreadExecutor();

然后

executor.execute(...);

executor.submit(...);

这将帮助您避免竞争:如果一些 TM A 在一些 TM B 之前添加到此执行程序定义的执行队列中,那么 A 将在整个 B 之前执行。

此外,不涉及显式锁(除了可以包含在执行器实现中的隐式锁,但它们被封装并且不会在发生错误时永远保持处理)。

有一个微妙的时刻:如果两个 TM 同时到达,则无法预测哪个会更早添加,哪个会更晚。

【讨论】:

  • 我想知道的是,如果我有不同类型的 TM,如果我同时获得两个不同类型的 TM,我希望它们立即执行而不是等待第一个给芬尼斯。这行得通吗?
  • 不同类型的TM是否相互独立?如果可以同时执行它们,您可以为每个 TM 类型创建一个单线程执行器,并在 TM 类型选择的执行器上执行您的 TM。
  • 是的,它们是独立的。会尝试去做。我在想,我认为这可以使用java同步块来完成。
  • 如果您只将作业提交给不同的执行者,则不需要同步。如果你也更新了一些共享状态,那么你可能需要一些同步。
猜你喜欢
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2013-12-08
  • 1970-01-01
相关资源
最近更新 更多