使用LIFO排序的Apache Camel SEDA队列?

时间:2018-08-06 15:25:45

标签: apache-camel

我需要一个骆驼组件,其功能与SEDA组件差不多(即队列),但是我需要消息以后进先出的顺序进行。据我在文档中所看到的,没有SEDA组件的配置选项允许这样做。 有没有其他方法可以配置它,或者是否可以使用其他组件?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

克劳斯·易卜生(Claus Ibsen)的回答使我走上了正确的道路,但有点含糊,因此,我将详细介绍我提出的最终解决方案。在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
            }
}

使PriorityBlockingQueue感到惊讶的是,它以升序排列,而不是降序排列。换句话说,最小值是最先传递的,而不是我以前使用其他语言的优先级队列传递的最大值。

接下来,我制作了一个Bean来实例化队列:

@Configuration
class QueueConfig {
    @Bean("FiloBlockingQueue")
    fun createQueue(): PriorityBlockingQueue<Exchange> =
            PriorityBlockingQueue<Exchange>(10, NewestExchangeFirstComparator())
}

首先,我按照克劳斯·易卜生的建议尝试了BlockingQueueFactory,但是由于某种原因,骆驼似乎没有使用它。尽管我使用了queueFactory参数并且可以识别QueueFactory的类型,但从未调用过create方法。因此,我制作了一个实例化队列的bean,并将其传递给路由的queue参数,并且起作用了:

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)
        }

就是这样。