如何创建LIFO队列通道

时间:2019-03-28 13:23:14

标签: java spring kotlin spring-integration

当前,我在集成流程中使用队列通道,但是它使用FIFO提取方式。有没有办法将其更改为LIFO?

还有,有没有一种方法可以基于属性从队列中删除消息?

我怀疑我将需要使用PriorityChannel从FIFO切换到LIFO,但是我不知道如何实现。

@Bean
    fun notificationChannel(): MessageChannel {
        return MessageChannels.queue().get()
    }

例如,我的QueueChannel将充满包含userId的消息。由于我只对userId消息的最新状态感兴趣,因此我想使用LIFO并删除所有具有与最新消息相同的userId的消息。

2 个答案:

答案 0 :(得分:1)

听起来好像您并不是真的想要LIFO,而是只想要最新的给定条件。

但是,无论如何,Queue是一个非常简单的界面。它只有几种方法,QueueChannel仅使用poll()offer()size()

因此创建自定义队列应该很简单,例如基于线程安全的ConcurrentHashMap<String, Message<?>>,密钥是您的条件。

答案 1 :(得分:1)

Queue通道将Queue作为构造函数参数public QueueChannel(Queue<Message<?>> queue),而spring-integration DSL提供了public static QueueChannelSpec queue(Queue<Message<?>> queue)。因此,您可以将Collections.asLifoQueue(..)用作上述工厂方法的参数,以获取所需的行为。