我希望能够在Rabbit之间(手动)在队列之间移动消息。
例如:
first-queue has messages ['a','b','c','d','e','f']
second-queue has messages ['x','y']
我希望能够移动例如消息' a'从第一队列到第二队列。这可以是手动操作。两个队列都在同一个代理上,我不想通过任何交换发送它们。反正有没有这样做?我一直在玩rabbitmqctl,但似乎无法让它发挥作用。我对任何其他可以让我实现这一目标的工具持开放态度。最后我希望有一些消息选择器(例如,将所有带有一些头字段= X的消息从第一个队列移到第二个队列)。
我仍然是兔子和amqp的新手,但一直无法找到如何做到这一点的文件(如果可能的话)。
感谢。
答案 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