使用QAMQP/RabbitMQ进行Qt
Qt with QAMQP / RabbitMQ
我正在使用此连接器连接RabbitMQ:https://github.com/fuCtor/QAMQP
我的应用程序需要性能和多线程。请问,我可以用多线程的连接器吗?
我试过了:
void Test::newMessage(QAMQP::Queue * q) {
while (q->hasMessage()) {
QAMQP::MessagePtr message = q->getMessage();
MyEvent *me = new MyEvent();
me->message = message;
poolThreadPosicao->start(me);
}
}
class MyEvent : public QRunnable {
public:
QAMQP::MessagePtr message;
void run() {
s.queue->ack(this->message);
}
};
在一些消息中,RabbitMQ说:"Unacked 10 messages"。这10条消息是我在broker中的qos消息。我需要什么来解决这个问题?怎么办?
首先,我建议您切换到https://github.com/mbroadst/qamqp,因为它是原始项目的替代品(该项目已不再处于积极开发中)。更新后的代码包含许多性能和内存增强,以及对RabbitMQ的更全面支持。话虽如此,目前该项目的两个版本都旨在为每个线程提供一个连接。这意味着,您创建的任何通道(Exchange或队列)都将成为创建它的连接(客户端)的父级,因此绑定到创建线程。
处理您面临的问题的一种方法是从QRunnable和QObject继承,在完成任务时发出消息(注意:这是未经测试的,我只是给出了基本结构):
using namespace QAMQP;
class MessageJob : public QRunnable, public QObject
{
Q_OBJECT
public:
MessageJob(const Message &message)
: m_message(message)
{
}
virtual void run() {
// process the message
// when you are done, emit the finished signal
Q_EMIT finished(m_message);
}
Q_SIGNALS:
void finished(const Message &message);
private:
Message m_message;
};
class Test : public QObject
{
Q_OBJECT
public:
Test(QObject *parent = 0)
: QObject(parent)
{
// setup and connect client
// create queue and start consuming
}
private Q_SLOTS:
void messageReceived(const Message &message)
{
MessageJob *job = new MessageJob; // no parent, this will be autodeleted
connect(job, SIGNAL(finished(Message)), this, SLOT(jobFinished(Message)), Qt::QueuedConnection);
// NOTE: Qt::QueuedConnection is very important as it allows the signal to
// cross threads
QThreadPool::globalInstance()->start(job);
}
void jobFinished(const Message &message) {
m_queue->ack(message);
}
private:
Client m_client;
Queue *m_queue;
};
相关文章:
- 无法使用 Qt 15.3.1 进行远程调试时加载 qtcreatorcdbext.dll
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- 为什么Qt必须从源代码构建以进行交叉编译?
- 如何使用带有Qt和C++的"Interface Class"进行通信
- 如何在Qt测试框架中对信号进行基准测试?
- 如何在macOS上的Qt中使用OpenMP进行编译?
- 使用 qt 进行 SSL 握手期间出错
- Qt 无法对类型"uint8_t"的参数进行排队,即使使用 qRegisterMetaType 也是如此
- Qt:无法对类型为"QProcess::P rocessError"的参数进行排队 - QProcess::P rocessError(FailedToStart)
- 使用命名空间进行 QT 测试
- 如何在Qt WebChannel中以独立于平台的方式在HTML/Javascript和C++之间进行通信?
- QtcpServer:Qt如何获取python字符串进行标记
- 如何使用 Qt 自发关闭事件进行单元测试
- 访问QT上的本地用户文件进行Web组件
- 如何在Qt中进行多个图形更改时最大程度地减少屏幕闪烁
- 为什么使用Qt Creator调整.ui文件会导致编译期间对.h文件进行更改
- 通过Modbus TCP与CMMO-ST-C5-1-LKP Festo控制器进行Qt/C++通信
- 使用 Visual Studio 2013 进行 Qt 安装
- 在发布模式下进行Qt调试 - 所有方法都不起作用
- 使用QAMQP/RabbitMQ进行Qt