【问题标题】:Simple example writing to the Qpid Java broker with Qpid Proton not working使用 Qpid Proton 写入 Qpid Java 代理的简单示例不起作用
【发布时间】:2015-09-02 01:03:19
【问题描述】:

我是 AMQP 的新手,正在尝试编写一个简单的应用程序,该应用程序使用 Qpid Proton Messenger API 写入 Qpid Java Broker。开箱即用的 Qpid Java 代理有四个默认交换器(amq.match、amq.fanout、amq.topic、amq.direct),端口 5672 上的 AMQP“端口”和 passwordFile auth povider。为了保证本次测试的安全性,我将身份验证提供程序更改为匿名。

为了写信给经纪人,我正在关注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 调用上失败,所以我知道我至少在与代理交谈。

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

这里有一些代理配置截图供参考。

谢谢!

【问题讨论】:

  • 我从未使用过 HTTP webadmin 控制台。它多久刷新一次?数据是实时显示的吗?您能否尝试在命令行上使用qpid-stat 查找相同的交换/数据直通信息?你的 qpid 是在 linux 上运行的吗?

标签: amqp qpid


【解决方案1】:

如果您尝试将消息发送到特定队列,您的地址需要采用以下格式:

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

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

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

在您的情况下,您发送的消息没有在地址中指定目的地。因此,消息转到默认的直接交换。所有队列都绑定到默认直接,队列名称作为绑定键。但是您也没有在消息上设置路由键。它们很可能因为不可路由而被丢弃 - 我不记得 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

【讨论】:

    猜你喜欢
    • 2016-08-06
    • 2015-11-18
    • 2018-07-12
    • 2016-01-13
    • 2014-09-07
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多