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));
        }
    }
}
Exemple #2
0
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();
    }
}