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