activemq-cpp如何获取状态发送或接收超时

时间:2012-01-06 03:01:20

标签: timeout send states activemq-cpp

当我向代理发送消息时,我已经设置了activemq连接的超时属性。

但是在发送超时时我无法获得任何异常或返回。

我无法获得发送成功或超时的状态。

当我使用receive(long long timeout)时也会发生这种情况;

有没有办法区分这两种状态?

版本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 :(得分:0)

首先,我建议使用最新版本v3.4.1,有许多修复可能会影响这一点。接下来,当您传递超时值时,应该从接收返回NULL。

至于你说你正在设置的超时选项你应该更清楚你正在设置什么选项,因为有几个。有一个requestTimeout用于在同步发送消息时超时,并且故障转移传输上有一个超时选项,当代理连接断开时也会发挥作用。

由于你已经显示了任何代码或URI,很难说这里发生了什么,但是对于发送,如果你没有设置AlwaysSyncSend选项,则可能会将消息发送为异步。