问题更多是关于架构而不是编程。我需要编写一个通知服务,通过REST-api 接收消息并从中制作作业,这会将它们放入作业队列中。每一项这样的工作都必须完成。如果成功,则从队列中删除作业,并向客户端返回成功消息。如果作业失败,则将其放入第二个重试队列。尝试次数不超过 3 次。必须记录这两个操作。有必要提供几种执行工作的方法。
实现这一点的最简单方法是什么?像 RabbitMQ 和 ActiveMQ 这样的消息代理是多余的。是否有创建轻量级内存代理的库?
服务的负载不会很高。
服务必须是异步的。
问题更多是关于架构而不是编程。我需要编写一个通知服务,通过REST-api 接收消息并从中制作作业,这会将它们放入作业队列中。每一项这样的工作都必须完成。如果成功,则从队列中删除作业,并向客户端返回成功消息。如果作业失败,则将其放入第二个重试队列。尝试次数不超过 3 次。必须记录这两个操作。有必要提供几种执行工作的方法。
实现这一点的最简单方法是什么?像 RabbitMQ 和 ActiveMQ 这样的消息代理是多余的。是否有创建轻量级内存代理的库?
服务的负载不会很高。
服务必须是异步的。
在我看来,这完全取决于是否应该在应用程序重新启动之间保存作业。在任何情况下,您都可以通过 Executors 类创建一个简单的线程池。在应用程序级别创建一个这样的池并将所有任务发送到那里。它将是异步的并且没有框架。
1) 如果必须保存作业。
您可以在数据库中创建一个表,在其中开始作业之前,写入有关它的信息(ID、TYPE、STATUS、INFORMATION REQUIRED FOR LAUNCH)。然后,启动应用程序后,就可以读取所有状态为 not FINISHED 的作业,并将它们扔到池中执行。执行完成后,设置 FINISHED 状态并向用户发送通知。
2) 如果作业不应该被保存。
我们只需将所有作业都放入池中,并在完成后发送通知。
重试尝试可以使用第二个池来解决,或者如果前一个失败,则创建一个新作业并将其扔到同一个池中。尝试的计数器可以存储在同一个数据库中,也可以存储在内存中的作业对象中。
帮助:ExecutorServices和CompletableFuture 本身,关于重复@Retryable机制的方法。我认为这就足够了。