Я установил свойство тайм-аута для соединения 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;
}