在队列rabbitMQ之间移动消息

时间:2014-03-25 20:24:56

标签: rabbitmq message messaging amqp

我希望能够在Rabbit之间(手动)在队列之间移动消息。

例如:

first-queue has messages ['a','b','c','d','e','f']
second-queue has messages ['x','y']

我希望能够移动例如消息' a'从第一队列到第二队列。这可以是手动操作。两个队列都在同一个代理上,我不想通过任何交换发送它们。反正有没有这样做?我一直在玩rabbitmqctl,但似乎无法让它发挥作用。我对任何其他可以让我实现这一目标的工具持开放态度。最后我希望有一些消息选择器(例如,将所有带有一些头字段= X的消息从第一个队列移到第二个队列)。

我仍然是兔子和amqp的新手,但一直无法找到如何做到这一点的文件(如果可能的话)。

感谢。

4 个答案:

答案 0 :(得分:8)

@Dax - 我刚才在这里回答了同样的问题:Is it possible to move / merge messages between RabbitMQ queues?

我在那里有很长的描述。为避免重复内容,我不想复制/粘贴。

听起来你正在寻找的是rabbitmq铲子插件。

它内置于核心,只需启用它:

rabbitmq-plugins enable rabbitmq_shovel
rabbitmq-plugins enable rabbitmq_shovel_management

从GUI的“管理”部分,您将找到一个简单的界面来创建铁锹。

请参阅我发布的其他帖子!

答案 1 :(得分:5)

没有记录的事实是因为它远离消息传递模型。

将消息发送到特定队列很容易 - 例如,请参阅tutorial #1 - 但阅读消息的唯一方法是消费它们,按顺序经纪人发送给客户。

不允许从队列中选择消息,就像使用SQL一样。

你可以做的是让一个客户端(或者最终,一个插件,但这是一个高级主题)消耗来自队列的消息,并根据你重新的一些规则将发布到后续队列或另一个队列。

答案 2 :(得分:2)

这是一个简单的java代码,用于将所有内容从一个队列移动到另一个队列:

public void moveMessages(
            final String sourceQueueName,
            final String targetQueueName,
            final String rabbitmqHost,
            final String rabbitmqUsername,
            final String rabbitmqPassword,
            final String rabbitmqVirtualHost
) throws IOException {

        // Initialize the consuming and publishing channel
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost(rabbitmqHost);
        factory.setUsername(rabbitmqUsername);
        factory.setPassword(rabbitmqPassword);
        factory.setVirtualHost(rabbitmqVirtualHost);
        Connection connection = factory.newConnection();

        Channel consumingChannel = connection.createChannel();
        Channel publishingChannel = connection.createChannel();


        while (true) {
            // Get the first message in the queue (auto ack = false)
            GetResponse response = consumingChannel.basicGet(sourceQueueName, false);

            if (response == null) {
                return;
            }

            BasicProperties properties = response.getProps();

            // Publish the message to the origin queue
            publishingChannel.txSelect();
            publishingChannel.basicPublish("", targetQueueName, (AMQP.BasicProperties) properties, response.getBody());
            publishingChannel.txCommit();

            // Acknowledge the message in the dead letter queue
            consumingChannel.basicAck(response.getEnvelope().getDeliveryTag(), false);
        }
    }

答案 3 :(得分:0)

您可以使用此卷曲来创建铲子:

curl 
-u  "user:password" 
-vvv 'http://localhost:15672/api/parameters/shovel/%2Foms/Move%20from%20sourceQueue' 
-X PUT 
-H 'content-type: application/json' 
--data-binary '
{
    "component": "shovel",
    "vhost": "/vhost",
    "name": "Move from sourceQueue",
    "value": {
        "src-uri": "amqp:///%2Fvhost",
        "src-queue": "sourceQueue",
        "src-protocol": "amqp091",
        "src-prefetch-count": 1000,
        "src-delete-after": "queue-length",
        "dest-protocol": "amqp091",
        "dest-uri": "amqp:///%2Fvhost",
        "dest-add-forward-headers": false,
        "ack-mode": "on-confirm",
        "dest-queue": "destQueue"
    }
}
' --compressed