首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Qpid Proton编写Qpid Java代理的简单示例

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

Stack Overflow用户
提问于 2015-06-17 00:59:21
回答 1查看 3.7K关注 0票数 1

我是AMQP新手,我正在尝试编写一个简单的应用程序,用Qpid Proton Messenger API写入Qpid Java代理。开箱即用的Qpid有四个默认交易所(amq.match、amq.fanout、amq.topic、amq.direct),一个在5672端口上的AMQP“端口”,带有passwordFile auth povider。为了避免此测试的安全性,我将auth提供程序更改为匿名。

为了给代理写信,我遵循示例。这个例子没有说明如何写入特定的交换或队列,我认为我的问题就在这个领域的某个地方。这是我的瘦身版。

代码语言:javascript
复制
#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类型和队列?我搜了又搜,什么也没找到。任何我可能错过的文档或教程的链接都是受欢迎的。

下面是一些代理配置屏幕截图供参考。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-19 16:04:49

如果您试图将消息发送到特定队列,则您的地址必须具有以下形式:

代码语言:javascript
复制
amqp://host:port/test-queue-1

您还可以向exchange发送消息:

代码语言:javascript
复制
amqp://host:port/test-exchange-1

在这种情况下,您发送的消息没有地址中指定的目的地。因此,这些消息将转到默认的直接交换。所有队列都直接绑定到默认队列,队列名作为绑定键。但是您也没有在您的消息上设置路由密钥。它们可能被丢弃为不可路由的--我不记得qpid是否有一个死信队列实现。

编辑:不可路由的消息可能被丢弃。

为了在您的消息上指定路由密钥,请使用:

代码语言:javascript
复制
pn_message_set_subject(message, "my-routing-key");

如果您考虑了自定义exchange和队列设置,则必须预定义exchange和队列绑定,以确保消息正确路由。我认为c-绑定是以编程方式定义和配置交换的,但我不熟悉它。

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

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

代码语言:javascript
复制
qpid-config add queue test-queue-1 --durable 

或者REST

代码语言:javascript
复制
#create a durable queue
curl -X PUT  -d '{"durable":true}' http://localhost:8080/rest/queue/<vhostname>/test-queue-1

创建一个交换

代码语言:javascript
复制
qpid-config add exchange direct test-exchange-1 --durable

在队列和exchange之间创建绑定:

代码语言:javascript
复制
qpid-config bind test-exchange-1 test-queue-1 test-queue-binding-key

发送到具有路由密钥test-queue-binding-key的交换的任何消息最终都将在test-queue-1中结束。

参考文献:qpid config

参考文献:REST API

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30880665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档