Apache camel 具有后进先出订单的Apache Camel SEDA队列?

Apache camel 具有后进先出订单的Apache Camel SEDA队列?,apache-camel,Apache Camel,我需要一个camel组件,它与SEDA组件的功能(即队列)非常相似,但我需要以后进先出的顺序显示消息。据我在文档中看到的,SEDA组件没有配置选项允许这样做。 是否有其他方法来配置该组件或其他合适的组件?您可以使用SedaComponent上的defaultQueueFactory选项配置自定义BlockingQueueFactory。在该队列工厂中,您可以创建使用不同排序的队列。您可以使用组件上的defaultQueueFactory选项配置自定义BlockingQueueFactory。在该

我需要一个camel组件,它与SEDA组件的功能(即队列)非常相似,但我需要以后进先出的顺序显示消息。据我在文档中看到的,SEDA组件没有配置选项允许这样做。
是否有其他方法来配置该组件或其他合适的组件?

您可以使用
SedaComponent
上的
defaultQueueFactory
选项配置自定义
BlockingQueueFactory
。在该队列工厂中,您可以创建使用不同排序的队列。

您可以使用
组件上的
defaultQueueFactory
选项配置自定义
BlockingQueueFactory
。在该队列工厂中,您可以创建一个使用不同排序的队列。

克劳斯·易卜生的回答让我走上了正确的道路,但有点模糊,因此我将更详细地介绍我提出的最终解决方案。它在kotlin和Spring Boot中:

首先,PriorityBlockingQueue似乎是唯一可以控制交付订单的实现,所有其他标准实现似乎都是FIFO

PriorityBlockingQueue将比较器作为构造函数参数,因此我编写了一个简短的比较器,以按创建时间对交换进行排序:

/**
 * Comparator to sort Exchanges in ascending order by time, newest first.
 * Is inconsistent with equals()!
 */
class NewestExchangeFirstComparator : Comparator<Exchange> {

    override fun compare(o1: Exchange, o2: Exchange): Int =
            when {
                o1.created.after(o2.created) -> -1
                o1.created.before(o2.created) -> 1
                else -> 0
            }
}

就是这样。

克劳斯·易卜生的答案让我走上了正确的道路,但有点模糊,所以我将更详细地介绍我提出的最终解决方案。它在kotlin和Spring Boot中:

首先,PriorityBlockingQueue似乎是唯一可以控制交付订单的实现,所有其他标准实现似乎都是FIFO

PriorityBlockingQueue将比较器作为构造函数参数,因此我编写了一个简短的比较器,以按创建时间对交换进行排序:

/**
 * Comparator to sort Exchanges in ascending order by time, newest first.
 * Is inconsistent with equals()!
 */
class NewestExchangeFirstComparator : Comparator<Exchange> {

    override fun compare(o1: Exchange, o2: Exchange): Int =
            when {
                o1.created.after(o2.created) -> -1
                o1.created.before(o2.created) -> 1
                else -> 0
            }
}
就这样

from("$SEDA_IMAGE_QUEUE?queue=#FiloBlockingQueue")
        .routeId("upload to gateway")
        .log("Found new image \${header.filename}")
        .process().message {
            gatewayFacade.uploadImage(it.body as ByteArray, it.getHeader("filename") as String)
        }