-
Notifications
You must be signed in to change notification settings - Fork 104
/
callee_new.cpp
135 lines (98 loc) · 3.82 KB
/
callee_new.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include <iostream>
#include <memory>
#include <string>
#include <thread>
#include <tuple>
#include <sstream>
#include <cstdlib>
#include <boost/asio.hpp>
#include <boost/version.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <autobahn/autobahn.hpp>
void log (const std::string& msg) {
std::cerr << msg << " [thread " << boost::this_thread::get_id() << "]" << std::endl;
}
void add2(autobahn::wamp_invocation invocation)
{
auto a = invocation->argument<uint64_t>(0);
auto b = invocation->argument<uint64_t>(1);
std::ostringstream oss;
oss << "Procedure com.examples.calculator.add2 invoked: " << a << ", " << b << std::endl;
log(oss.str());
invocation->result(std::make_tuple(a + b));
}
void longop(autobahn::wamp_invocation invocation)
{
auto a = invocation->argument<uint64_t>(0);
std::ostringstream oss;
oss << "Procedure com.myapp.longop invoked: " << a << std::endl;
log(oss.str());
uint64_t i = 0;
for (; i < a; i++)
{
boost::this_thread::sleep(boost::posix_time::milliseconds(3000));
if (i < a)
{
invocation->progress(std::make_tuple(i));
}
}
invocation->result(std::make_tuple(i));
}
int main(int argc, char** argv)
{
if (argc != 3) {
std::cerr << "Usage: callee <RawSocket IP> <RawSocket PORT>" << std::endl;
return -1;
}
try {
log("starting program ..");
log(argv[1]);
log(argv[1]);
boost::asio::io_service io;
bool debug = true;
// Make sure the continuation futures we use do not run out of scope prematurely.
// Since we are only using one thread here this can cause the io service to block
// as a future generated by a continuation will block waiting for its promise to be
// fulfilled when it goes out of scope. This would prevent the session from receiving
// responses from the router.
boost::future<void> f1, f2, f3;
auto endpoint = boost::asio::ip::tcp::endpoint(boost::asio::ip::address::from_string(argv[1]), atoi(argv[2]));
auto transport = std::make_shared<autobahn::wamp_tcp_transport>(io, endpoint, debug);
auto session = std::make_shared<autobahn::wamp_session>(io, debug);
transport->attach(std::static_pointer_cast<autobahn::wamp_transport_handler>(session));
f1 = transport->connect().then([&](boost::future<void> connected) {
connected.get();
log("transport connected");
f2 = session->start().then(boost::launch::deferred, [&](boost::future<void> started) {
started.get();
log("session started");
f3 = session->join("realm1").then(boost::launch::deferred, [&](boost::future<uint64_t> joined) {
joined.get();
log("joined realm");
auto f4 = session->provide("com.examples.calculator.add2", &add2).then(
boost::launch::deferred,
[&](boost::future<autobahn::wamp_registration> registration) {
log("registered procedure com.examples.calculator.add2");
});
auto f5 = session->provide("com.myapp.longop", &longop).then(
boost::launch::deferred,
[&](boost::future<autobahn::wamp_registration> registration) {
log("registered procedure com.myapp.longop");
});
f5.get();
f4.get();
});
f3.get();
});
f2.get();
});
log("starting io service ..");
io.run();
log("stopped io service");
}
catch (const std::exception& e) {
log(e.what());
return -1;
}
return 0;
}