6.2.4. AMQ Online C++ の例
C++ クライアントには、Python と同じオプションを持つ同等の simple_recv
と simple_send
の例があります。ただし、C++ ライブラリーは URL に対して同じレベルの処理を実行しません。特に、TLS の使用を意味する amqps://
は使用できないので、例を次のように変更する必要があります。
#include <proton/connection.hpp>
#include <proton/container.hpp>
#include <proton/default_container.hpp>
#include <proton/delivery.hpp>
#include <proton/message.hpp>
#include <proton/messaging_handler.hpp>
#include <proton/ssl.hpp>
#include <proton/thread_safe.hpp>
#include <proton/tracker.hpp>
#include <proton/url.hpp>
#include <iostream>
#include "fake_cpp11.hpp"
class hello_world : public proton::messaging_handler {
private:
proton::url url;
public:
hello_world(const std::string& u) : url(u) {}
void on_container_start(proton::container& c) OVERRIDE {
proton::connection_options co;
co.ssl_client_options(proton::ssl_client_options());
c.client_connection_options(co);
c.connect(url);
}
void on_connection_open(proton::connection& c) OVERRIDE {
c.open_receiver(url.path());
c.open_sender(url.path());
}
void on_sendable(proton::sender &s) OVERRIDE {
proton::message m("Hello World!");
s.send(m);
s.close();
}
void on_message(proton::delivery &d, proton::message &m) OVERRIDE {
std::cout << m.body() << std::endl;
d.connection().close();
}
};
int main(int argc, char **argv) {
try {
std::string url = argc > 1 ? argv[1] : "messaging-route-hostname:443/myqueue";
hello_world hw(url);
proton::default_container(hw).run();
return 0;
} catch (const std::exception& e) {
std::cerr << e.what() << std::endl;
}
return 1;
}
6.2.4.1. 階層トピックでサブスクライバーを作成する際の既知の問題
AMQ Online で階層トピックにサブスクライバーを作成すると、ブローカーが代わりに競合するコンシューマーとしてサブスクライバーを作成するという既知の問題が存在します (トピックではなくキューのようにアドレスを処理します)。
回避策として、ソースで トピック
ケイパビリティーを設定する必要があります。
手順
-
topic_receive.cpp
ファイルで、次の例のようにコードを編集します。
void on_container_start(proton::container& cont) override { proton::connection conn = cont.connect(conn_url_); proton::receiver_options opts {}; proton::source_options sopts {}; sopts.capabilities(std::vector<proton::symbol> { "topic" }); opts.source(sopts); conn.open_receiver(address_, opts); }