我正在尝试为票证实现动态多队列系统

时间:2018-12-30 08:27:33

标签: java multithreading spring-boot dynamic queue

我正在尝试为票证实施多队列系统。 我使用Spring Boot异步接收票证请求。
要求是我要收到许多带有特定类型密钥的票证。 对于我收到的每张票,我需要根据它们的类型密钥将它们放入队列中。 例如,我收到了类型为A的票证,如果已经有一个队列A,我应该将票证放入该队列中,否则我应该为类型A创建一个新队列,如果我收到另一个请求A,则需要等待直到第一个A请求完成处理。 我上传了一张图片,以准确显示我要做什么。

我想知道解决这个问题的好方法。我知道如何为请求创建FIFO队列,但是对我来说,创建动态多队列很困难。

dynamic multi queue picture

1 个答案:

答案 0 :(得分:0)

创建一个Queue<TicketType>队列。将此称为主队列。

创建一个凭单类型作为键的Map<TicketType, Queue>,其值是该类型的凭单队列。

创建一个使用者池,以监视主队列并在作业进入时对其进行处理。

何时有新票证

if map contains entry for that ticket type
    add new ticket to queue for that ticket type
else
    create new map entry and add queue
    add new ticket to the queue for that ticket type
    add ticket type to master queue

当消费者从主队列中获取条目时

look up ticket type in map
pull next ticket from the corresponding queue
process ticket
// After ticket is processed:
if queue for that ticket type in map is empty
    remove from map
else
    add ticket type to master queue

这里的想法是,地图针对每种票证类型包含一个队列。该映射中的队列每个都包含该类型的所有传入票证。

主队列针对地图中当前存在的每种故障单类型包含一个条目。凭单类型A在任何时候都不能在主队列中有多个条目。

在使用地图队列时,您在这里必须小心同步。例如,您不想无意中删除包含票证的队列。最好在添加票证或检查完票证后查看队列中是否还有票证时锁定地图。但是,这两个操作都很快速,因此您不应该遇到每秒50张票突发的性能问题。如果您每秒要讲1000张罚单,那么您可能必须提出一种替代锁的方法。