static void* _receiveThread(void* param) { MsgReceiver_t *receiver = (MsgReceiver_t *)param; amqp_envelope_t envelope; amqp_rpc_reply_t reply; amqp_frame_t *frame; time_t curtime; assert(receiver != NULL); LOG4CXX_DEBUG(logger, "_receiveThread: event receiver thread started"); sendLeaseRequest(receiver); curtime = getCurrentTime(); while(receiver->thread_run) { amqp_maybe_release_buffers(receiver->conn_state); pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL); if(getElapsedSecond(curtime, getCurrentTime()) > 60*5) { sendLeaseRequest(receiver); curtime = getCurrentTime(); } reply = amqp_consume_message(receiver->conn_state, &envelope, NULL, 0); if(reply.reply_type == AMQP_RESPONSE_NORMAL) { // call handler MsgClientCallback_t callback = receiver->callback; LOG4CXX_INFO(logger, "_receiveThread: received a message"); if(callback != NULL) { LOG4CXX_INFO(logger, "_receiveThread: received a message - calling a callback function"); callback((const char*)envelope.routing_key.bytes, envelope.routing_key.len, (const char*)envelope.message.body.bytes, envelope.message.body.len); } int ack_result = amqp_basic_ack(receiver->conn_state, receiver->channel, envelope.delivery_tag, false); if(ack_result != 0) { LOG4CXX_ERROR(logger, "_receiveThread: ack failed " << ack_result); } amqp_destroy_envelope(&envelope); } else { LOG4CXX_INFO(logger, "_receiveThread: an exception occurred"); } pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); } receiver->thread_run = false; }
float getElapsedMillisecond() { return getElapsedSecond()*1000.0f; }