2017-12-09 26 views
0

現在、私は単一のキュー "devQueue"にメッセージを送信できます。メッセージが「devQueue」に届くと、それは「localQueue」にも送られる必要があります。私はこの実装が挑戦的であると感じています。私は別のクラス "local_send"を "class1"クラスから呼び出そうとしましたので、 "localQueue"(下のコードに示すように)の他の行き先に接続できますが、運がありません。便利なプロトン関数はありますか?また、v_message()関数内の "class1"クラス内のon_connection_open()の参照変数を使用できますか?この方向の助けやアイデアは非常に高く評価されます。Qpid Proton:2つの宛先にメッセージを送信

現在、コードは「local_send」クラスには入っていないため、メッセージは「localQueue」に送信されません。

class class1 : public proton::messaging_handler { 
std::string url; 
std::string devQueue; 
std::string localQueue; 
std::vector<proton::message> msgVector; 
local_send snd; 
std::vector<proton::message> msgV; 

public: 


class1(const std::string& u, const std::string& devQueue, const std::string& localQueue) : 
     url(u), devQueue(devQueue), localQueue(localQueue), snd(msgVector, localQueue) {} 

void on_container_start(proton::container& c) override { 
    c.connect(url); 
} 

void on_connection_open(proton::connection& c) override { 
    c.open_receiver(devQueue); 
} 

void on_message(proton::delivery &d, proton::message &msg) override { 
    msgV.push_back(msg); 
// Here, the messages are checked if they have a valid format or not and v_message() is called 
} 

void v_message(const pack& msg){ 
    this->msgVector.push_back(msg); 

//I need to send the message to localQueue and hence we are running another class from here (but that is not working :() 
    local_send snd(msgVector, localQueue); 
    proton::container(snd).run(); 
} 

void on_sendable(proton::sender &s) override { 
    for(auto msg: msgVector){ 
     s.send(msg); 
    } 
} 
}; 


// Do I even need this class to send message to another destination? 

class local_send : public proton::messaging_handler { 
    std::string localQueue; 
    std::vector<proton::message> msgVector; 

public: 
    local_send(std::vector<proton::message> msgVector, const std::string& localQueue) : 
     msgVector(msgVector), localQueue(localQueue) {} 

void on_connection_open(proton::connection& c) override { 
    c.open_receiver(localQueue); 
} 

void on_sendable(proton::sender &s) override { 
    for(auto msg: msgVector){ 
     s.send(msg); 
    } 
} 
}; 

答えて

1

メッセージを送信するためのチャネルを作成するには、open_senderを呼び出す必要があります。これを1つのハンドラですべて実行できます。擬似コード:

proton::sender snd; 

on_connection_open(conn) { 
    conn.open_receiver("queue1"); 
    snd = conn.open_sender("queue2"); 
} 

on_message(dlv, msg) { 
    // Relay message from queue1 to queue2 
    snd.send(msg); 
} 

このスニペットはon_sendableを使用しません。送信はライブラリにバッファリングされます。必要に応じて、コードで行ったようにメッセージベクタを使用し、on_sendable(同じハンドラ内)を使用してクレジットが送信されたときに送信することができます。

+0

ありがとうございました!これは非常に役に立ち、効果的でした。リファクタリングの際には、メッセージの構成についていくつかの洞察が必要です。この投稿をどのように拡張するのか分かりませんので、別の記事を投稿してください。 – Mooni

関連する問題