Java rabbitmq,具有基于属性的自定义排序

Java rabbitmq,具有基于属性的自定义排序,java,rabbitmq,Java,Rabbitmq,我们使用confirms为基本rabbit mq队列进行了研发。我们现在想更进一步,使用路由密钥之类的东西,通过用户名分割频道。() 然而,我们需要使用每个用户的自定义排序,我们从上游获得的json有一个名为sequence的参数。将数据推送到rabbitmq的服务可能会从上游获取序列号为2的第一个json,然后获取1。是否有一种方法可以将带有seuqencenumber2的json推送到队列中,但只有在队列收到带有1的json并将其传递后,才能将其传递 基本上,我们想知道的是,是否有一种方法可

我们使用confirms为基本rabbit mq队列进行了研发。我们现在想更进一步,使用路由密钥之类的东西,通过用户名分割频道。()

然而,我们需要使用每个用户的自定义排序,我们从上游获得的json有一个名为
sequence
的参数。将数据推送到rabbitmq的服务可能会从上游获取序列号为
2
的第一个json,然后获取
1
。是否有一种方法可以将带有
seuqence
number
2
的json推送到队列中,但只有在队列收到带有
1
的json并将其传递后,才能将其传递

基本上,我们想知道的是,是否有一种方法可以使用rabbitmq上的自定义排序来基于此
序列
参数进行消息传递,而无需使用单独的服务来维护此顺序

基本上,我们想知道的是,是否有一种方法可以基于此序列参数在rabbitmq上使用自定义排序进行消息传递,而无需使用单独的服务来维护此顺序

不,见:

从RabbitMQ 2.7.0版开始,消息始终按发布顺序保存在队列中,即使存在重新排队或通道关闭的情况

因此,您的用例似乎不容易得到支持

当然,如果您确实想要重新排队(并且您不想将消息保留在您的消费者处),您可以为您的消费者实现类似以下伪代码的东西:

expected_message_id = 0
while (true) {
    m = receive_message(queue)
    if (m.id == expected_message_id) {
        process(m)
        m.acknowledge()
        expected_message_id++
    } else {
        republish_to_queue(m, queue) // might use old exchange, or pick a new-one for this type of back-channel
    }
}

显然,这意味着您需要额外的网络/处理负载-消息可能会多次传递和丢弃。

有点离题,但您知道是否有其他队列产品支持此功能,另外,您是否建议在服务中使用username参数来中断队列,以减少队列交换的数量