- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经构建了一个 c 函数,该函数应该通过 stomp 库从 ActiveMQ 读取。此代码正在读取收据之前的附加消息(这是我所期望的)。请告知为什么我的 RECEIPT 帧没有在第二个 MESSAGE 帧之前到来。另请注意,我用 BEGIN 和 COMMIT 框架包装此代码,这可能是也可能不是最佳实践。
提前致谢。
int receive_from_queue_ack( MQDEF *mqdef, int transaction ) {
apr_status_t rc;
stomp_frame frame_write;
stomp_frame* frame_read = NULL;
char transaction_str[37];
char* ack = NULL;
char* protocol = NULL;
char* receipt_id = NULL;
char* message_id = NULL;
char* message = NULL;
char* seq = NULL;
uuid_t uuid;
char receipt_id_begin_uuid[37];
char receipt_id_commit_uuid[37];
char receipt_id_ack_uuid[37];
char id_uuid[37];
int receipt_flag = 1;
uuid_generate_random(uuid);
uuid_unparse_lower(uuid, transaction_str);
uuid_generate_random(uuid);
uuid_unparse_lower(uuid, receipt_id_begin_uuid);
uuid_generate_random(uuid);
uuid_unparse_lower(uuid, id_uuid);
uuid_generate_random(uuid);
uuid_unparse_lower(uuid, receipt_id_commit_uuid);
uuid_generate_random(uuid);
uuid_unparse_lower(uuid, receipt_id_ack_uuid);
fprintf(stdout, "1) *** Transaction BEGIN - (receive_from_queue)\n");
frame_write.command = "BEGIN";
frame_write.headers = apr_hash_make((apr_pool_t *)mqdef->pool);
apr_hash_set(frame_write.headers, "transaction", APR_HASH_KEY_STRING, transaction_str);
frame_write.body_length = -1;
frame_write.body = NULL;
rc = stomp_write(mqdef->amqConnection, &frame_write, (apr_pool_t *)mqdef->pool);
if ( rc != APR_SUCCESS ) {
return FAILURE;
}
printf("3) Subscribe begin\n");
frame_write.command = "SUBSCRIBE";
frame_write.headers = apr_hash_make((apr_pool_t *)mqdef->pool);
apr_hash_set(frame_write.headers, "destination", APR_HASH_KEY_STRING, mqdef->queueName);
apr_hash_set(frame_write.headers, "ack", APR_HASH_KEY_STRING, "client");
apr_hash_set(frame_write.headers, "id", APR_HASH_KEY_STRING, "client-123");
apr_hash_set(frame_write.headers, "activemq.prefetchSize", APR_HASH_KEY_STRING, "1");
frame_write.body_length = -1;
frame_write.body = NULL;
rc = stomp_write(mqdef->amqConnection, &frame_write, (apr_pool_t *)mqdef->pool);
if ( rc != APR_SUCCESS ) {
return FAILURE;
}
frame_read = NULL;
rc = stomp_read(mqdef->amqConnection, &frame_read, (apr_pool_t *)mqdef->pool);
if ( rc != APR_SUCCESS ) {
return FAILURE;
}
ack = NULL;
if( frame_read != NULL && strncmp(frame_read->command, "MESSAGE", 7) == 0 ) {
ack = (char*) apr_hash_get(frame_read->headers, "ack", APR_HASH_KEY_STRING);
printf("5) ack=<%s>\n", ack);
if( ack == NULL ) {
printf("ack being null is a problem\n");
exit(1);
}
message_id = (char*) apr_hash_get(frame_read->headers, "message-id", APR_HASH_KEY_STRING);
printf("5) message_id=<%s>\n", message_id);
printf("5) command=<%s>, body=<%s>\n", frame_read->command, frame_read->body);
} else if( frame_read != NULL && strncmp(frame_read->command, "ERROR", 5) == 0 ) {
message_id = (char*) apr_hash_get(frame_read->headers, "message-id", APR_HASH_KEY_STRING);
printf("5) message_id=<%s>\n", message_id);
printf("5) command=<%s>, body=<%s>\n", frame_read->command, frame_read->body);
exit(1);
} else {
message_id = (char*) apr_hash_get(frame_read->headers, "message-id", APR_HASH_KEY_STRING);
printf("5) message_id=<%s>\n", message_id);
printf("5) command=<%s>, body=<%s>\n", frame_read->command, frame_read->body);
printf("5) should never get here.\n");
exit(1);
}
frame_write.command = "ACK";
frame_write.headers = apr_hash_make((apr_pool_t *)mqdef->pool);
apr_hash_set(frame_write.headers, "transaction", APR_HASH_KEY_STRING, transaction_str);
apr_hash_set(frame_write.headers, "id", APR_HASH_KEY_STRING, ack);
apr_hash_set(frame_write.headers, "receipt-id", APR_HASH_KEY_STRING, receipt_id_ack_uuid);
printf("set id =<%s>\n", ack);
frame_write.body_length = -1;
frame_write.body = NULL;
rc = stomp_write(mqdef->amqConnection, &frame_write, (apr_pool_t *)mqdef->pool);
if ( rc != APR_SUCCESS ) {
return FAILURE;
}
frame_read = NULL;
rc = stomp_read(mqdef->amqConnection, &frame_read, (apr_pool_t *)mqdef->pool);
if ( rc != APR_SUCCESS ) {
return FAILURE;
}
if( frame_read != NULL && strncmp(frame_read->command, "RECEIPT", 7) == 0 ) {
message_id = (char*) apr_hash_get(frame_read->headers, "message-id", APR_HASH_KEY_STRING);
receipt_id = (char*) apr_hash_get(frame_read->headers, "receipt-id", APR_HASH_KEY_STRING);
printf("7) receipt-id=<%s>\n", receipt_id);
printf("7) message-id=<%s>\n", message_id);
printf("7) command=<%s>, body=<%s>\n", frame_read->command, frame_read->body);
} else if( frame_read != NULL && strncmp(frame_read->command, "ERROR", 5) == 0 ) {
message_id = (char*) apr_hash_get(frame_read->headers, "message_id", APR_HASH_KEY_STRING);
receipt_id = (char*) apr_hash_get(frame_read->headers, "receipt-id", APR_HASH_KEY_STRING);
printf("7) receipt-id=<%s>\n", receipt_id);
printf("7) message-id=<%s>\n", message_id);
printf("7) command=<%s>, body=<%s>\n", frame_read->command, frame_read->body);
exit(1);
} else {
message_id = (char*) apr_hash_get(frame_read->headers, "message_id", APR_HASH_KEY_STRING);
printf("7) message-id=<%s>\n", message_id);
printf("7) command=<%s>, body=<%s>\n", frame_read->command, frame_read->body);
ack = (char*) apr_hash_get(frame_read->headers, "ack", APR_HASH_KEY_STRING);
printf("5) ack=<%s>\n", ack);
printf("this is a failure\n");
frame_write.command = "ACK";
frame_write.headers = apr_hash_make((apr_pool_t *)mqdef->pool);
apr_hash_set(frame_write.headers, "transaction", APR_HASH_KEY_STRING, transaction_str);
apr_hash_set(frame_write.headers, "id", APR_HASH_KEY_STRING, ack);
apr_hash_set(frame_write.headers, "receipt-id", APR_HASH_KEY_STRING, receipt_id_ack_uuid);
rc = stomp_write(mqdef->amqConnection, &frame_write, (apr_pool_t *)mqdef->pool);
if ( rc != APR_SUCCESS ) {
return FAILURE;
}
}
frame_write.command = "COMMIT";
frame_write.headers = apr_hash_make((apr_pool_t *)mqdef->pool);
apr_hash_set(frame_write.headers, "transaction", APR_HASH_KEY_STRING, transaction_str);
frame_write.body_length = -1;
frame_write.body = NULL;
rc = stomp_write(mqdef->amqConnection, &frame_write, (apr_pool_t *)mqdef->pool);
if ( rc != APR_SUCCESS ) {
return FAILURE;
}
fprintf(stdout, "12) *** Transaction Complete - (receive_from_queue)\n\n");
}
最佳答案
您没有在确认中使用正确的 STOMP header 来指示 ACK ID,因此代理告诉您您做错了。 STOMP 规范是开始学习在每个执行中添加什么内容的好地方,在本例中, header 是“id”而不是“message-id”
与往常一样,C 代码很难阅读,因此使用一些注释或上下文重新修改上面的代码会很有帮助,但到目前为止,我还没有看到客户端代码从传入消息中获取“ack” header ,并且将其传输到实际的“ACK”帧,因此这可能是问题所在。
来自规范:
If the message is received from a subscription that requires explicit acknowledgment (either client or client-individual mode) then the MESSAGE frame MUST also contain an ack header with an arbitrary value. This header will be used to relate the message to a subsequent ACK or NACK frame.
请参阅STOMP specification了解更多
关于c - Stomp 1.2 ActiveMQ 5.15 - 收到 ACK 时没有确认 ack id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50929695/
使用普通的 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. 或者
我是一名优秀的程序员,十分优秀!