1
+ /*
2
+ *
3
+ * Licensed to the Apache Software Foundation (ASF) under one
4
+ * or more contributor license agreements. See the NOTICE file
5
+ * distributed with this work for additional information
6
+ * regarding copyright ownership. The ASF licenses this file
7
+ * to you under the Apache License, Version 2.0 (the
8
+ * "License"); you may not use this file except in compliance
9
+ * with the License. You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing,
14
+ * software distributed under the License is distributed on an
15
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16
+ * KIND, either express or implied. See the License for the
17
+ * specific language governing permissions and limitations
18
+ * under the License.
19
+ *
20
+ */
21
+
22
+ #include " options.hpp"
23
+
24
+ #include < proton/connection.hpp>
25
+ #include < proton/container.hpp>
26
+ #include < proton/message.hpp>
27
+ #include < proton/message_id.hpp>
28
+ #include < proton/messaging_handler.hpp>
29
+ #include < proton/types.hpp>
30
+ #include < proton/transaction.hpp>
31
+
32
+ #include < iostream>
33
+ #include < map>
34
+ #include < string>
35
+
36
+ #include < chrono>
37
+ #include < thread>
38
+
39
+ class tx_recv : public proton ::messaging_handler, proton::transaction_handler {
40
+ private:
41
+ proton::receiver receiver;
42
+ std::string url;
43
+ int expected;
44
+ int batch_size;
45
+ int current_batch = 0 ;
46
+ int committed = 0 ;
47
+
48
+ proton::session session;
49
+ public:
50
+ tx_recv (const std::string &s, int c, int b):
51
+ url (s), expected(c), batch_size(b) {}
52
+
53
+ void on_container_start (proton::container &c) override {
54
+ receiver = c.open_receiver (url);
55
+ }
56
+
57
+ void on_session_open (proton::session &s) override {
58
+ session = s;
59
+ std::cout << " Session open, declare_txn" << std::endl;
60
+ s.declare_transaction (*this );
61
+ }
62
+
63
+ void on_transaction_declare_failed (proton::session) {}
64
+ void on_transaction_commit_failed (proton::session s) {
65
+ std::cout << " Transaction Commit Failed" << std::endl;
66
+ s.connection ().close ();
67
+ exit (-1 );
68
+ }
69
+
70
+ void on_transaction_declared (proton::session s) override {
71
+ std::cout << " Transaction is declared!" << (&s)
72
+ << std::endl;
73
+ receiver.add_credit (batch_size);
74
+ }
75
+
76
+ void on_message (proton::delivery &d, proton::message &msg) override {
77
+ std::cout<<" # MESSAGE: " << msg.id () <<" : " << msg.body () << std::endl;
78
+ session.txn_accept (d);
79
+ current_batch += 1 ;
80
+ if (current_batch == batch_size) {
81
+ }
82
+ }
83
+
84
+ void on_transaction_committed (proton::session s) override {
85
+ committed += current_batch;
86
+ current_batch = 0 ;
87
+ std::cout<<" Transaction Committed:" << committed<< std::endl;
88
+ if (committed == expected) {
89
+ std::cout << " All messages committed" << std::endl;
90
+ s.connection ().close ();
91
+ }
92
+ else {
93
+ s.declare_transaction (*this );
94
+ }
95
+ }
96
+
97
+ };
98
+
99
+ int main (int argc, char **argv) {
100
+ std::string address (" 127.0.0.1:5672/examples" );
101
+ int message_count = 6 ;
102
+ int batch_size = 3 ;
103
+ example::options opts (argc, argv);
104
+
105
+ opts.add_value (address, ' a' , " address" , " connect and send to URL" , " URL" );
106
+ opts.add_value (message_count, ' m' , " messages" , " number of messages to send" , " COUNT" );
107
+ opts.add_value (batch_size, ' b' , " batch_size" , " number of messages in each transaction" , " BATCH_SIZE" );
108
+
109
+ try {
110
+ opts.parse ();
111
+
112
+ tx_recv recv (address, message_count, batch_size);
113
+ proton::container (recv).run ();
114
+
115
+ return 0 ;
116
+ } catch (const example::bad_option& e) {
117
+ std::cout << opts << std::endl << e.what () << std::endl;
118
+ } catch (const std::exception& e) {
119
+ std::cerr << e.what () << std::endl;
120
+ }
121
+
122
+ return 1 ;
123
+ }
0 commit comments