ActiveMQ CMS:有没有办法在没有线程的情况下使用它?

Posted

技术标签:

【中文标题】ActiveMQ CMS:有没有办法在没有线程的情况下使用它?【英文标题】:ActiveMQ CMS: Is there a way to use it without threading? 【发布时间】:2021-06-07 16:32:05 【问题描述】:

我在这里从 Apache 获取示例代码:https://activemq.apache.org/components/cms/example

(特别是生产者部分)并尝试重写它,因此它不会创建任何用于生产的线程。相反,在我的程序的主线程中,创建一个生产者对象并设置连接、会话、目的地等。然后它使用消息生产者发送消息。这一切都是在一个单例中完成的,因此我的程序只有一个 Producer 对象,并且只要它需要将任何消息转储到我的队列之一就可以访问它。这个示例代码似乎为每个线程创建了一个生产者,每次都设置它,只是为了发送一条消息,然后删除所有内容。每次你想从你的程序中产生一些东西时,它都会这样做。

当我尝试使用任何给定消息对消息生产者调用 send 时,我正在崩溃。经过一番挖掘后,我发现在发送调用之后它会尝试锁定互斥锁并进入临界区。我想这是为了线程?我的代码中根本不使用线程,所以我猜它会因此而崩溃......有谁知道绕过这个的方法?我不想使用多个线程,我不需要担心两个线程同时尝试调用 send 或使用互斥锁试图解决的任何问题。

【问题讨论】:

【参考方案1】:

您不需要创建一个线程来运行生产者,但在内部库将使用几个线程,因为这是满足 API 要求所必需的,而且仅仅因为您不使用多个线程并不't 表示其他人不会,因此互斥锁是内部要求。

您可以随意修改示例,只在应用程序的主线程内创建一个生产者,该示例使用两个线程,因为它既是生产者又是消费者。

您收到错误的一个可能原因是您没有初始化 ActiveMQ-CPP 库:

activemq::library::ActiveMQCPP::initializeLibrary();

【讨论】:

就是这样。我昨天在朋友的帮助下弄明白了。结果我忘记了我的 ActiveMQ 消费者代码仍在运行,它使用完全相同的 initializeLibrary 调用,所以当它完成时,它会调用 shutdownLibrary,并且生产者代码会因为没有重新初始化而崩溃。让我永远卡住了。

以上是关于ActiveMQ CMS:有没有办法在没有线程的情况下使用它?的主要内容,如果未能解决你的问题,请参考以下文章

在 CMS ActiveMQ 中使用 VM

具有接收器线程配置文件配置的 Mule ActiveMQ JMS 组件不起作用

有没有办法解决帝国cms的js自动刷新问题?

ActiveMQ CMS:在创建消费者和设置监听器之间会丢失消息吗?

静态链接 ActiveMQ-cpp

无法使用 OpenSSL 1.1.1 构建 activemq CMS 3.9.5