0

メッセージをブローカーに送信するときに、activemq 接続のタイムアウト プロパティを設定しました。

しかし、タイムアウトを送信したときに例外やリターンを取得できませんでした。

送信成功またはタイムアウトのステータスを取得できませんでした。

これは、 receive(long long timeout); を使用したときにも発生しました。

これら2つの状態を区別する方法はありますか?

バージョン 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;

}
4

1 に答える 1

0

最初に、これに影響を与える可能性のある多くの修正がある最新リリース v3.4.1 を使用することをお勧めします。次に、タイムアウト値を渡すと、receive から NULL が返されます。

設定しているタイムアウトオプションについては、いくつかあるため、設定しているオプションをより明確にする必要があります。メッセージが同期的に送信されるときにタイムアウトするために使用される requestTimeout があり、ブローカー接続がダウンしたときにも機能するフェイルオーバー トランスポートのタイムアウト オプションがあります。

コードまたは URI を示したので、ここで何が起こっているのかを説明するのは難しいですが、AlwaysSyncSend オプションを設定していない場合、メッセージが非同期で送信される可能性があります。

于 2012-01-06T14:30:27.637 に答える