0

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

但是当它发送超时时我无法得到任何异常或返回。

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

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

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

版本 Activemq 5.4.2 activemq-cpp 3.2.5

网址:

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;

}
4

1 回答 1

0

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

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

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

于 2012-01-06T14:30:27.637 回答