我是AMQP新手,我正在尝试编写一个简单的应用程序,用Qpid Proton Messenger API写入Qpid Java代理。开箱即用的Qpid有四个默认交易所(amq.match、amq.fanout、amq.topic、amq.direct),一个在5672端口上的AMQP“端口”,带有passwordFile auth povider。为了避免此测试的安全性,我将auth提供程序更改为匿名。
为了给代理写信,我遵循这示例。这个例子没有说明如何写入特定的交换或队列,我认为我的问题就在这个领域的某个地方。这是我的瘦身版。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <Windows.h>
#include "proton\message.h"
#include "proton\messenger.h"
int main(int argc, const char* argv[])
{
while (true)
{
pn_message_t * message;
pn_messenger_t * messenger;
pn_data_t * body;
message = pn_message();
messenger = pn_messenger(NULL);
pn_messenger_start(messenger);
printf("set address result: %i\n", pn_message_set_address(message, "amqp://xxx.xxx.xxx.xxx:5672"));
body = pn_message_body(message);
char* msgtext = "howdy";
pn_data_put_string(body, pn_bytes(strlen(msgtext), msgtext));
pn_messenger_put(messenger, message);
printf("\nSent: %i\n", pn_messenger_send(messenger, 1));
pn_messenger_stop(messenger);
pn_messenger_free(messenger);
pn_message_free(message);
Sleep(10);
}
}pn_messenger_send返回0(成功)。从客户端机器上,我可以看到客户端正在通过有线发送消息。但是,在代理管理门户中,它显示了零个客户端连接,默认虚拟主机显示0 msg/s (0.00个B/s)入站。我希望这样可以显示来自测试客户端的字节。如果我与代理一起运行客户机,或者将它指向错误的端口,客户端将在pn_messenger_send调用中失败,因此我知道我至少在与代理对话。
我的问题是这些信息是去哪里的?如何在消息的连接字符串中定义exchange类型和队列?我搜了又搜,什么也没找到。任何我可能错过的文档或教程的链接都是受欢迎的。
下面是一些代理配置屏幕截图供参考。


谢谢!
发布于 2015-06-19 16:04:49
如果您试图将消息发送到特定队列,则您的地址必须具有以下形式:
amqp://host:port/test-queue-1您还可以向exchange发送消息:
amqp://host:port/test-exchange-1在这种情况下,您发送的消息没有地址中指定的目的地。因此,这些消息将转到默认的直接交换。所有队列都直接绑定到默认队列,队列名作为绑定键。但是您也没有在您的消息上设置路由密钥。它们可能被丢弃为不可路由的--我不记得qpid是否有一个死信队列实现。
编辑:不可路由的消息可能被丢弃。
为了在您的消息上指定路由密钥,请使用:
pn_message_set_subject(message, "my-routing-key");如果您考虑了自定义exchange和队列设置,则必须预定义exchange和队列绑定,以确保消息正确路由。我认为c-绑定是以编程方式定义和配置交换的,但我不熟悉它。
您可以使用命令行上的qpid-config命令创建交换、队列和绑定,或者通过webadmin应用程序创建REST,例如:
使用qpid-config创建持久队列:
qpid-config add queue test-queue-1 --durable 或者REST
#create a durable queue
curl -X PUT -d '{"durable":true}' http://localhost:8080/rest/queue/<vhostname>/test-queue-1创建一个交换
qpid-config add exchange direct test-exchange-1 --durable在队列和exchange之间创建绑定:
qpid-config bind test-exchange-1 test-queue-1 test-queue-binding-key发送到具有路由密钥test-queue-binding-key的交换的任何消息最终都将在test-queue-1中结束。
参考文献:qpid config
参考文献:REST API
https://stackoverflow.com/questions/30880665
复制相似问题