- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试在一个非常简单的控制台应用程序上使用手动 ACK,但我无法让它工作。
在发件人上,我有以下代码:
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
channel.QueueDeclare(queue: "task_queue",
durable: true,
exclusive: false,
autoDelete: false,
arguments: null);
var message = GetMessage(args);
var body = Encoding.UTF8.GetBytes(message);
channel.ConfirmSelect();
channel.BasicAcks += (sender, e) =>
{
Console.Write("ACK received");
};
var properties = channel.CreateBasicProperties();
channel.BasicPublish(exchange: "",
routingKey: "task_queue",
basicProperties: properties,
body: body);
Console.WriteLine(" [x] Sent {0}", message);
}
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
在接收器上我有以下代码:
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
channel.QueueDeclare(queue: "task_queue",
durable: true,
exclusive: false,
autoDelete: false,
arguments: null);
channel.BasicQos(prefetchSize: 0, prefetchCount: 1, global: false);
channel.ConfirmSelect();
Console.WriteLine(" [*] Waiting for messages.");
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body;
var message = Encoding.UTF8.GetString(body);
Console.WriteLine(" [x] Received {0}", message);
int dots = message.Split('.').Length - 1;
Thread.Sleep(dots * 1000);
channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
Console.WriteLine(" [x] Done");
};
channel.BasicConsume(queue: "task_queue",
noAck: false,
consumer: consumer);
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
}
我期望的是,当我调用接收方的 channel.BasicAck()
时,发送方的事件 BasicAcks
被触发,但是当消息在 consumer.Received
之前传递给客户端。
我期望的是正确的行为还是我遗漏了什么?
最佳答案
您的期望不正确。 BasicAcks
是关于 publisher confirms ,而不是关于接收方的确认。因此,您向代理发布消息,代理(因此,RabbitMQ 本身)将在处理此消息时(例如,当它将其写入磁盘以获取持久消息时)ack 或 nack(否定确认) ,或者在将其放入队列时)。请注意,此处不涉及接收方 - 它完全在发布方和 RabbitMQ 之间。
现在,当您在接收方确认消息时——同样仅在接收方和 RabbitMQ 之间——您告诉兔子消息已处理并且可以安全删除。这样做是为了处理接收者在处理过程中崩溃的情况——然后 rabbit 将能够将此消息传递给下一个接收者(如果有的话)。
请注意,这种架构的全部目的是将发布者和接收者分开 - 他们不应相互依赖。
如果您有一个接收方(可以有多个)并且您希望确保它处理了您的消息 - 使用 RPC 模式:发送消息并等待该接收方返回另一条消息。
关于c# - C# 客户端上的 RabbitMQ 手动 ACK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37307437/
使用普通的 grep 命令,有一个 --exclude 选项(详细介绍如下: Use grep --exclude/--include syntax to not grep through certa
我有 ubuntu 14.04。并使用 ack-grep 2.12 在目录内递归搜索文件中的文本 我想设置 ack-grep 选项 特定于目录 ~/workspace/project/ 这样当我在路径
我们不理解这种 TCP 行为表明 redhat linux 5 TCP 堆栈(HTTP 服务器,这是此转储的来源)收到 SYN 的 ACK,ACK 但继续忽略它并重复重复的 SYN,ACK 5次。最后
我不确定它的用途,但我正在处理的代码有一堆名为“save.d”的文件夹,看起来它们用于某种版本控制(我们也有 . svn 文件夹)。 如何更新我的 .ackrc 文件以默认忽略这些目录? 我的 .ac
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭去年。 Improve th
我已经针对运行在 Ubuntu 14.04.3 LTS (3.13.0-71-generic x86_64) 上的 OpenSSL 1.0.2e 编译了 nginx 1.9.7。我可以毫无问题地使用浏
我有添加新的 ack-grep 文件类型的语法: $ ack-grep --type-add=min=.min.js,.min.css --help types | grep min --[n
我想在任何名为 search-this-one.html 的文件中搜索字符串“my-search-string” 在我当前工作目录的所有子目录中。 我想要包含此字符串的文件的完整路径列表。有数百个名为
我正在使用 ack.pl 工具来搜索文件中的字符串或 IP ack.pl 的官方网站是 - http://beyondgrep.com/documentation/ ack.pl CLI 示例(想在/
如果您正在编写一个基本的 python TCP 服务器和客户端,您需要自己添加 SYN、SYN ACK 和 ACK 响应,还是由套接字模块处理? 如果需要自己写,会这么简单吗? 客户: #set up
[FIN, ACK]、[RST]和[RST, ACK]是什么原因,如何避免? 是否是由于 SO 的 TCP 参数之间存在某种不匹配?服务器在 TCP/IP 连接中回复 [FIN, ACK] 是什么意思
我使用 Vim 插件 ack.vim ,但我不明白为什么命令是带有大写“A”的 :Ack (按住 shift 有点烦人)。 是否可以将其重新映射到 :ack ? 最佳答案 内置命令以小写字符开头,自定
我有一个文件导致 Ack 2.0 报告“权限被拒绝”错误,所以我一直试图让它忽略该文件。 我已经在我的 ackrc 中尝试了以下内容 --type-set=lockfile:match:/NameOf
我有一个文件导致 Ack 2.0 报告“权限被拒绝”错误,所以我一直试图让它忽略该文件。 我已经在我的 ackrc 中尝试了以下内容 --type-set=lockfile:match:/NameOf
我尝试了可能的组合并在互联网上进行了搜索,但无法完成这项工作,错误是: Error: Unexpected ACK received for message-id 如果有人能指出以下代码中是否存在一些
在用 Linux C 编写的 tcp 程序中我想关闭一个 tcp 连接我使用了close(sockfd)我注意到此函数将向另一个对等方发起 FIN/ACK 数据包但是如果另一个对等点由于网络问题或 t
我已经构建了一个 c 函数,该函数应该通过 stomp 库从 ActiveMQ 读取。此代码正在读取收据之前的附加消息(这是我所期望的)。请告知为什么我的 RECEIPT 帧没有在第二个 MESSAG
我正在使用这样的 ack:ack-grep assets\\. (在 Ubuntu 上) 但是,我想排除不以“ Assets ”开头的结果。例如:网站 Assets 。 到目前为止,我已经尝试过 ac
如何使用ack搜索特定文件类型的文件。 例如 ack -f .scss blah acl -f .rb blah 显然上述方法不起作用,但是如何使用ack来做到这一点? 最佳答案 为此使用--type
每次我尝试在ack中添加类型似乎都失败了,即在ack中添加类型(log) ack --type-set log:ext:log ack: No regular expression found. 或者
我是一名优秀的程序员,十分优秀!