gpt4 book ai didi

java - 按正确顺序处理方法/线程

转载 作者:行者123 更新时间:2023-12-02 12:48:18 25 4
gpt4 key购买 nike

我有一个非常复杂的应用程序(它是一个命令和控制中心 Spring +基于角度的应用程序,供警察和其他应急中心 Controller 使用)。

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

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

问题在于, Backbone 络可能会几乎同时接收两个或多个 TM,并且由于它们在不同的线程中执行,因此可能会出现它们未按到达时的顺序进行处理的情况,因此会出现错误的信息呈现给用户。

通常,这样的问题我都是用 Redis 来处理的。我有一个redis锁,基本上是这样的

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

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

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

最佳答案

重新发布作为答案。

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

ExecutorService executor = Executors.newSingleThreadExecutor();

然后

executor.execute(...);

executor.submit(...);

这将帮助您避免竞争:如果在某些 TM B 之前将某些 TM A 添加到此执行器定义的执行队列中,则 A > 将在整个 B 之前执行。

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

有一个微妙的时刻:如果两个 TM 同时到达,则无法预测哪个会先添加、哪个稍后添加。

关于java - 按正确顺序处理方法/线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44682584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com