void PostOffice::Pimpl::RunReceiverThread(const std::string& connectString) { std::set<slaim::MessageType> mySubscriptions; bool error = false; while (!killed) { try { AMQP amqp(connectString); AMQPExchange* exchange = amqp.createExchange(); DeclareExchange(exchange); AMQPQueue* queue = amqp.createQueue(); DeclareQueue(queue); for (const auto& messageType : mySubscriptions) { queue->Bind(exchangeName, messageType); } std::function<int(AMQPMessage*)> onMessage = [this](AMQPMessage* m) { return HandleReceivedMessage(m); }; queue->addEvent(AMQP_MESSAGE, onMessage); receiverOk = true; if (error) { error = false; std::lock_guard<std::mutex> lock(errorLogMutex); errorLog.SetError("Receiver now ok"); } while (!killed) { SubscribeAction subscribeAction; while (pendingSubscribeActions.pop_front(subscribeAction)) { if (subscribeAction.subscribe) { mySubscriptions.insert(subscribeAction.messageType); queue->Bind(exchangeName, subscribeAction.messageType); } else { mySubscriptions.erase(subscribeAction.messageType); queue->unBind(exchangeName, subscribeAction.messageType); } } queue->Consume(AMQP_NOACK); } } catch (std::exception& e) { receiverOk = false; if (!error) { error = true; std::lock_guard<std::mutex> lock(errorLogMutex); errorLog.SetError("Receiver: " + std::string(e.what())); } std::this_thread::sleep_for(std::chrono::seconds(1)); } } }
void publish() { try { reconnects++; std::cout << "Connecting:" << reconnects << "..." << std::endl; srand((unsigned)time(0)); std::stringstream ss; ss << "guest:guest@localhost:" << ports[rand() % 3]; AMQP amqp(ss.str()); AMQPExchange * ex = amqp.createExchange("hello-exchange"); ex->Declare("hello-exchange", "direct"); AMQPQueue * queue = amqp.createQueue("hello-queue"); queue->Declare(); queue->Bind( "hello-exchange", "hola"); std::cout << "Connected." << std::endl; reconnects = 0; ex->setHeader("Content-type", "text/text"); ex->setHeader("Content-encoding", "UTF-8"); std::string routing_key("hola"); int counter = 0; ISynchronizedQueue<protocol_t>* pQ=(ISynchronizedQueue<protocol_t>*)m_q; while(true) { boost::this_thread::sleep( boost::posix_time::milliseconds(50) ); protocol_t protocol; while (pQ->get(protocol)) { ex->Publish(protocol, routing_key); counter++; std::cout << protocol << std::endl; /* if (0 == counter % 1000) { cout << protocol << endl; } */ } } } catch (AMQPException e) { std::cout << e.getMessage() << std::endl; boost::this_thread::sleep( boost::posix_time::milliseconds(3000) ); publish(); } }