当我向代理发送消息时,我已经为activemq连接设置了超时值属性。
但当它发送超时时,我无法得到任何异常或返回。
我无法获得发送成功或超时的状态。
这也发生在我使用接收(长时间超时);
有办法区分这两种状态吗?
版本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;
}发布于 2012-01-06 14:30:27
首先,我建议使用最新的版本v3.4.1,有许多修复可能会影响到这一点。接下来,当您传递一个超时值时,您应该从接收返回一个空值。
至于超时选项,您说您正在设置,您应该更加清楚您正在设置的选项,因为有一对夫妇。有一个用于同步发送消息时超时的requestTimeout,并且在故障转移传输上有一个超时选项,在代理连接中断时也会起作用。
由于您已经显示了任何代码或URI,很难说出这里发生了什么,但是对于send,如果您没有设置AlwaysSyncSend选项,那么消息就可能被发送为异步。
https://stackoverflow.com/questions/8752856
复制相似问题