activemq-cpp как я могу получить статус отправки или получения тайм-аут - PullRequest
0 голосов
/ 06 января 2012

Я установил свойство тайм-аута для соединения activemq при отправке сообщения брокеру.

Но я не смог получить исключение или возврат при тайм-ауте.

Мне не удалось получить статус отправки или тайм-аута.

Это также происходило, когда я использую receive (длинный длинный тайм-аут);

Есть ли способ отличить эти два состояния?

Версия Activemq 5.4.2 activemq-cpp 3.2.5

URI:

failover:(tcp://192.168.32.11:61617) without any option, all use default.

Код подключения:

bool CActiveMqProducer::Initial()
{
    try
    {
        activemq::library::ActiveMQCPP::initializeLibrary();

        //sure has been cleaned up before initial
        if (!m_bCleanUp)
            CleanUp();

        if(m_strBrokerURI == "" || m_strDestURI == "")
        {
            printf("MQ initial failed for m_strBrokerURI == \"\" || m_strDestURI == \"\"\n");
            return false;
        }

        //create a connection factory
        auto_ptr<ActiveMQConnectionFactory> ConnFactoryPtr(new ActiveMQConnectionFactory(m_strBrokerURI, m_strAccount, m_strPsw));

        // Create a Connection
        try
        {
            m_pConnObj = ConnFactoryPtr->createConnection();
            if(m_pConnObj != NULL)
            {

                ActiveMQConnection* amqConnection = dynamic_cast<ActiveMQConnection*>(m_pConnObj);
                amqConnection->setSendTimeout(m_unSendTimeout);
                //here set send timeout option
            }
            else
            {
                return false;
            }

            m_pConnObj->start();
        }
        catch (CMSException& e)
        {
            e.printStackTrace();
            throw e;
        }

        // Create a Session
        if (m_bClientAck)
        {
            m_pSession = m_pConnObj->createSession(Session::CLIENT_ACKNOWLEDGE);
            if(m_pSession == NULL)
                return false;
        }
        else
        {
            m_pSession = m_pConnObj->createSession(Session::AUTO_ACKNOWLEDGE);
            if(m_pSession == NULL)
                return false;
        }

        // Create the destination (Topic or Queue)
        if (m_bUseTopic)
        {
            m_pMsgDest = m_pSession->createTopic(m_strDestURI);
            if(m_pMsgDest == NULL)
                return false;
        }
        else
        {
            m_pMsgDest = m_pSession->createQueue(m_strDestURI);
            if(m_pMsgDest == NULL)
                return false;
        }

        // Create a MessageProducer from the Session to the Topic or Queue
        m_pMsgProducer = m_pSession->createProducer(m_pMsgDest);
        if(m_pMsgProducer == NULL)
            return false;
        if(m_bPresistent)
        {
            m_pMsgProducer->setDeliveryMode(DeliveryMode::PERSISTENT);
        }
        else
        {
            m_pMsgProducer->setDeliveryMode(DeliveryMode::NON_PERSISTENT);
        }

        //control the logic
        m_bInitialized = true;
        m_bCleanUp = false;

    }
    catch (CMSException& e)
    {
        e.printStackTrace();
        return false;
    }
    return true;
}

Отправьте код:

bool CActiveMqProducer::SendTextMessage(const char* msg, int deliveryMode, int priority, long long timeToLive, std::map<std::string,std::string> property)
{
    try
    {
        if(!m_bInitialized)
        {
            printf("MQ client has not been initialized!\n");
            return false;
        }
        TextMessage * tmsg = m_pSession->createTextMessage();
        tmsg->setText(msg);
        std::map<std::string, std::string>::iterator it = property.begin();
        for(; it != property.end(); it++)
        {
            tmsg->setStringProperty(it->first,it->second);
        }

        m_pMsgProducer->send(tmsg, deliveryMode, priority, timeToLive);

        delete tmsg;
    }
    catch(MessageFormatException &e)
    {
        e.printStackTrace();
        return false;
    }
    catch(InvalidDestinationException &e)
    {
        e.printStackTrace();
        return false;
    }
    catch(UnsupportedOperationException &e)
    {
        e.printStackTrace();
        return false;
    }
    catch(CMSException &e)
    {
        //if an internal error occurs while sending the message.
        e.printStackTrace();
        return false;
    }
    return true;

}

1 Ответ

0 голосов
/ 06 января 2012

Прежде всего, я рекомендую использовать последнюю версию v3.4.1, есть много исправлений, которые могут повлиять на это.Затем вы должны получить значение NULL, возвращенное при получении, когда вы передадите ему значение тайм-аута.

Что касается параметра тайм-аута, который, как вы говорите, вы устанавливаете, вы должны быть более ясны в отношении того, какой параметр вы устанавливаете, поскольку есть пара.Существует requestTimeout, который используется для тайм-аута, когда сообщение отправляется синхронно, и есть опция тайм-аута для транспорта отработки отказа, который также вступает в действие, когда соединение с брокером разрывается.

Поскольку вы показали какой-либо код или URI, трудно сказать, что здесь происходит, но для отправки, если вы не установили опцию AlwaysSyncSend, возможно, сообщение отправляется асинхронно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...