while (reconnectCount < maxReconnectAttempts) { try { // 创建连接 connection = connectionFactory->createConnection(); break; } catch (CMSException& ex) { std::cout << "Failed to connect. Retrying in " << reconnectDelay << " milliseconds..." << std::endl; ::sleep(reconnectDelay / 1000); reconnectCount++; } }这段代码是创建连接抛出异常会重新创建,没有就break退出码
时间: 2024-02-10 14:29:44 浏览: 68
非常抱歉,我之前提供的代码确实有误。在正确的逻辑下,如果创建连接抛出异常,应继续尝试重连,直到达到最大重连次数。只有当连接成功创建后,才应该退出循环。
以下是修正后的代码:
```cpp
#include <activemq/core/ActiveMQConnectionFactory.h>
#include <activemq/library/ActiveMQCPP.h>
#include <cms/Connection.h>
#include <cms/Session.h>
#include <cms/TextMessage.h>
using namespace activemq::core;
using namespace cms;
int main() {
// 设置 ActiveMQ broker 地址
std::string brokerURI = "tcp://localhost:61616";
// 设置 Topic 名称
std::string topicName = "topicName";
// 设置最大重连尝试次数
int maxReconnectAttempts = 3;
// 设置重连延迟时间(毫秒)
int reconnectDelay = 5000;
try {
// 初始化 ActiveMQ C++ 库
activemq::library::ActiveMQCPP::initializeLibrary();
// 创建连接工厂
ActiveMQConnectionFactory* connectionFactory = new ActiveMQConnectionFactory(brokerURI);
Connection* connection = nullptr;
int reconnectCount = 0;
while (reconnectCount < maxReconnectAttempts) {
try {
// 创建连接
connection = connectionFactory->createConnection();
break;
} catch (CMSException& ex) {
std::cout << "Failed to connect. Retrying in " << reconnectDelay << " milliseconds..." << std::endl;
::sleep(reconnectDelay / 1000);
reconnectCount++;
}
}
if (connection != nullptr) {
// 启动连接
connection->start();
// 创建会话
Session* session = connection->createSession(Session::AUTO_ACKNOWLEDGE);
// 创建目标(Topic)
Destination* destination = session->createTopic(topicName);
// 创建消息生产者
MessageProducer* producer = session->createProducer(destination);
// 创建消息
TextMessage* message = session->createTextMessage("Hello, ActiveMQ!");
// 发送消息
producer->send(message);
// 关闭连接
connection->close();
// 清理资源
delete message;
delete producer;
delete destination;
delete session;
} else {
std::cout << "Failed to connect after " << maxReconnectAttempts << " attempts." << std::endl;
}
// 清理资源
delete connectionFactory;
// 终止 ActiveMQ C++ 库
activemq::library::ActiveMQCPP::shutdownLibrary();
} catch (CMSException& ex) {
std::cout << "Exception occurred: " << ex.getMessage() << std::endl;
}
return 0;
}
```
在修正后的代码中,我们将创建连接的逻辑放在了 while 循环中。循环会在连接抛出异常时进行重试,直到连接成功创建或达到最大重连次数。只有当连接成功创建后,才会进入后续的会话创建、消息发送等操作。如果连接无法成功创建,则会输出相应的失败信息。
请注意,在成功创建连接后,我们仍然需要确保在结束时清理资源和终止 ActiveMQ C++ 库。
这样,无论连接是否成功创建,都可以在循环内部继续添加其他重连逻辑或错误处理逻辑,以满足实际需求。
阅读全文