使用Qpid Proton写入Qpid Java代理的简单示例

时间:2015-06-17 00:59:21

标签: amqp qpid

我是AMQP的新手,我正在尝试编写一个简单的应用程序,该应用程序使用Qpid Proton Messenger API写入Qpid Java Broker。开箱即用的Qpid Java代理有四个默认交换(amq.match,amq.fanout,amq.topic,amq.direct),端口5672上的AMQP“端口”,带有passwordFile auth povider。为了将安全性从测试中删除,我将auth提供程序更改为Anonymous。

为了写信给经纪人,我遵循this示例。该示例未显示如何写入特定交换或队列,我认为我的问题在该域中的某个位置。这是我的瘦身版本。

#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调用失败,所以我知道我至少在与代理交谈。

我的问题是这些消息会在哪里发生?如何在消息的连接字符串中定义交换类型和队列?我搜索并搜索过,但没有找到任何东西。欢迎任何我可能错过的文档或教程链接。

以下是一些代理配置截图供参考。

enter image description here

enter image description here

谢谢!

1 个答案:

答案 0 :(得分:2)

如果您尝试将邮件发送到特定队列,则您的地址必须采用以下格式:

amqp://host:port/test-queue-1

您也可以向交易所发送消息:

amqp://host:port/test-exchange-1

在您的情况下,您发送的邮件没有在地址中指定的目的地。所以消息转到默认的直接交换。所有队列都绑定到默认的direct,队列名称作为绑定密钥。但是你没有在你的消息上设置路由密钥。它们很可能被丢弃为不可路由的 - 我不记得qpid是否有死信函队列实现。

编辑:Unrouteable messages could be discarded

要在邮件中指定路由密钥,请使用:

pn_message_set_subject(message, "my-routing-key");

如果您考虑到自定义交换和队列设置,则必须预先定义交换和队列绑定,以确保正确路由消息。我想存在c-bindings来以编程方式定义和配置交换,但我不熟悉它。

您可以使用命令行上的qpid-config命令或通过webadmin应用程序的REST API创建交换,队列和绑定,例如:

使用qpid-config创建持久队列:

qpid-config add queue test-queue-1 --durable 

或REST API

#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

在队列和交换之间创建绑定:

qpid-config bind test-exchange-1 test-queue-1 test-queue-binding-key

您使用路由密钥test-queue-binding-key发送给交换机的任何邮件最终都会以test-queue-1结尾。

参考:qpid-config
参考:REST API