You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@qpid.apache.org by "Panos Sakellariou (JIRA)" <ji...@apache.org> on 2019/01/30 09:40:00 UTC

[jira] [Created] (PROTON-2000) [cpp] source timeout

Panos Sakellariou created PROTON-2000:
-----------------------------------------

             Summary: [cpp] source timeout
                 Key: PROTON-2000
                 URL: https://issues.apache.org/jira/browse/PROTON-2000
             Project: Qpid Proton
          Issue Type: Bug
            Reporter: Panos Sakellariou


Hi there,

Receiver side (c++):
{code:java}
#include <proton/messaging_handler.hpp>
#include <proton/receiver.hpp>
#include <proton/container.hpp>
#include <proton/message.hpp>
#include <proton/message_id.hpp>
#include <proton/connection.hpp>
#include <proton/delivery.hpp>


#include <iostream>

#include <unistd.h>
#include <proton/target_options.hpp>


//using namespace std;

using namespace proton;
/*
*
*/
class in : public proton::messaging_handler
{
private:
receiver reiviever1;

public:
in() :
messaging_handler(), reiviever1()
{
}
void on_container_start(container& c) override
{
reiviever1 = c.open_receiver("amqp://127.0.0.1:5672/mbx");

std::cout << "id of the container is " << c.id() << std::endl;

}
void on_message(delivery& d, message& m) override
{
/// Just print what you have for now.
std::cout << "Received user <" << m.user() << ">" << std::endl;
std::cout << "Received body <" << m.body() << ">" << std::endl;
std::cout << "Received reply to <" << m.reply_to() << ">" << std::endl;
std::cout << "Received ttl <" << m.ttl().milliseconds() << ">" << std::endl;
std::cout << "Received subject <" << m.subject() << ">" << std::endl;
if (!m.reply_to().empty())
{
std::cout << "sleeping for sometime before reply" << std::endl;
sleep(5);

proton::message r;
r.to(m.reply_to());


std::string text;
text ="Reply form the receiver";
r.body(text);

r.correlation_id(m.correlation_id());

proton::sender sr = d.connection().open_sender(m.reply_to());
sr.send(r);
sr.close();

}
std::cout << __func__ << ": Ended" << std::endl;

}


} ;


int main(int argc, char** argv)
{
try
{

in i;
proton::container(i).run();

}
catch (const std::exception & e )
{
std::cerr << e.what() << std::endl;
}
catch (...)
{
std::cout << "caught" << std::endl;
}

return 0;
}


{code}
 

Client side (sender): 
{code:java}
#include <proton/messaging_handler.hpp>
#include <proton/sender.hpp>
#include <proton/receiver.hpp>
#include <proton/container.hpp>
#include <proton/message.hpp>
#include <proton/sender_options.hpp>
#include <proton/delivery.hpp>
#include <iostream>
#include <proton/source_options.hpp>
#include <proton/receiver_options.hpp>
#include <proton/target_options.hpp>
#include <proton/message.hpp>

//using namespace std;

using namespace proton;
/*
*
*/
class out : public proton::messaging_handler
{
private:
sender _sender;
receiver _receiver;

public:
out() :
messaging_handler(), _sender(), _receiver()
{
}
void on_container_start(container& c) override
{
/// Set the sender.
/// open to send
_sender = c.open_sender("amqp://127.0.0.1:5672/mbx");


_receiver = _sender.connection().open_receiver("",
receiver_options().source(
source_options().timeout(duration(500)).dynamic(true)
)
);

}
void on_receiver_open(receiver& r) override
{
std::cout << __func__ << " called" << std::endl;
send();

}
///
void send()
{
message msg;
msg.user("Sender User");
msg.subject("Sbj");
std::string text;
text = "Hello there!";
msg.body(text);


msg.reply_to(_receiver.source().address());

std::cout << "out msg user <" << msg.user() << ">" << std::endl;
std::cout << "out msg body <" << msg.body() << ">" << std::endl;
std::cout << "out msg reply to <" << msg.reply_to() << ">" << std::endl;


_sender.send(msg);
_sender.close();

/// do not close the connection yet.
//s.connection().close();


}
void on_message(delivery& d, message& m) override
{
/// Just print what you have for now.
std::cout << "RPL user <" << m.user() << ">" << std::endl;
std::cout << "RPL body <" << m.body() << ">" << std::endl;
std::cout << "RPL reply to <" << m.reply_to() << ">" << std::endl;

d.connection().close();



//
int main(int argc, char** argv)
{

try
{
out o;
proton::container(o).run();

}
catch (const std::exception & e )
{
std::cerr << e.what() << std::endl;
}
catch (...)
{
std::cout << "caught" << std::endl;
}

return 0;
}


{code}
 

What I'm trying to do is if the sender is not receiving an answer withing some time then timeout waiting.

Please correct me if I'm wrong. I think this should done by source timeout option.

This one doesn't seem to work

 

Work environment :

Ubuntu 18.04 

libraries installed by apt 

apt install libqpid-proton-cpp12-dev

which is proton 0.22

 

 

Thanks in advance,

Panos

 

 



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@qpid.apache.org
For additional commands, e-mail: dev-help@qpid.apache.org