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

时间:2017-10-14 06:32:43

标签: java rabbitmq

我们为基本的兔子mq队列做了R& D确认。我们现在想要更进一步,使用类似路由键的东西按用户名分割频道。 (https://www.cloudamqp.com/blog/2015-09-03-part4-rabbitmq-for-beginners-exchanges-routing-keys-bindings.html)。

但是我们要求每个用户使用自定义排序,我们从上游获得的json有一个名为while true; do read pid < process_done_fifo if [ $pid = $pid_you_are_waiting_for ]; then break fi done 的参数。将数据推送到rabbitmq的服务可能会从上游获取序列号为protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); try { SetContentView(Resource.Layout.Main); architectView = FindViewById<ArchitectView>(Resource.Id.architectView); var config = new ArchitectStartupConfiguration(); config.setLicenseKey(WIKITUDE_SDK_KEY); architectView.OnCreate(config); } catch (Exception ex) { Toast.MakeText(this, ex.ToString(), ToastLength.Long); } } protected override void OnPostCreate(Bundle savedInstanceState) { base.OnPostCreate(savedInstanceState); if (architectView != null) architectView.OnPostCreate(); try { try { string url = string.Format(@"file:///android_asset/01_ImageRecognition_1_ImageOnTarget/index.html"); architectView.Load(url); Plugin01 cardPlugin = new Plugin01("com.plugin.dpiar"); architectView.RegisterPlugin(cardPlugin); } catch (Exception ex) { } } catch (Exception ex) { Toast.MakeText(this, ex.ToString(), ToastLength.Long); } } 的第一个json,然后获取sequence。是否有一种方法可以将带有2数字1的json推送到队列中,但只有在队列收到带有seuqence的json并交付后才能传送它。

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

1 个答案:

答案 0 :(得分:1)

  

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

没有。见https://www.rabbitmq.com/semantics.html

  

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

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