问题标签 [jms-queue]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
44 浏览

java - 如何有效地处理 JMS 队列避免服务器负载

我的问题是如果 jms 队列(Wildfly 10)被大量填充,我该如何处理服务器上的负载。问题是消息不断被添加到JMS队列中,但是它们是被一个一个处理的。写的逻辑是只一个一个处理消息。我们不能一次处理多个消息,逻辑不能改变。但这会导致服务器负载增加,因为队列加载了许多消息。此时我该如何管理队列。

这是我用于生产和消费的示例代码:-

以下代码每 100 毫秒运行一次,并从数据库中获取 100 条消息并发送到队列。

Arraylist arrMessages=GetMessagesFromdatabase();

for(MessageObject obj:arrMessages) sendMessagetoQueue(obj);

生产者代码:-

然后另一个计划每 100 毫秒运行一次,以消耗队列中的消息并将其转发以逐个处理。

消费者守则:-

0 投票
1 回答
296 浏览

java - 在 jboss EAP 7 中创建 JMS 消息生产者时出错

我在 JBOSS_EAP_7.0 中配置了 JMS 主题,并编写了一个简单的 java 代码来创建消息生产者。我有以下无状态bean

这工作正常,直到我进行简单的更改以将sendMessage(String message)方法移动到 pojo 类,如下所示。

ConnectionFactory在 EJB 方法和 pojo 类中设置的目标Queue变量PostConstruct如下所示,现在包含创建和发布方法到 EJB 队列的逻辑

但是当我执行审核代码时,它给了我以下错误

javax.ejb.EJBTransactionRolledbackException:生产者已关闭

任何可能的修复?

0 投票
1 回答
96 浏览

spring-boot - 是否可以在同一个 springboot 应用程序中配置 jmsTemplate 主题发布者和队列消息生产者

我的应用程序最初使用的是队列,所以我还需要为同一个应用程序实现一个主题。我在设置配置时遇到了困难。请帮助伙计们

0 投票
0 回答
58 浏览

c# - 收到错误“请在调用此方法之前为当前资源定义接收(响应)队列”

我正在尝试使用 C# 从队列中读取消息。我能够将消息发布到队列,但无法从队列中检索消息。下面是示例代码片段。

消息已经存在于某个队列中,有人将消息发布到队列中,我想从同一个队列中读取这些消息。

这是错误:

0 投票
0 回答
311 浏览

jms - 通过 JMS 从 Weblogic 到 MQ 的访问队列问题。完成代码“2”,原因“2085”

这是我面临的一个非常不寻常的问题。

我有一个在 Weblogic 12c 中运行的应用程序。JMS 外部服务器和目的地都在 weblogic 中创建。此外,所有队列都在队列管理器中定义。.Bindings 文件也已到位,该文件已使用 MQ 定义创建。现在最初我的应用程序可以访问所有这些队列。我可以使用 runmqsc 命令和 DISPALY QSTATUS 查看 QM 内的队列。

但是最近几天后,我在访问队列时收到以下错误:

我正在使用 MQ-9、Weblogic 12c、OS:Linux、Java 8。任何帮助找到根本原因将不胜感激

0 投票
1 回答
390 浏览

java - JMS MessageProducer 不需要 Connection.start,但 MessageConsumer 需要 Connection.start

一个问题

我知道有一个类似的问题,但在 SO 中不一样。

我试图了解JMS 中MessageProducerMessageConsumer的幕后情况。使用ActiveMQ的实现,我编写了一个简单的MessageProducer示例来将消息发送到队列,并编写了一个MessageConsumer示例来使用队列中的消息,同时在本地运行ActiveMQ 。

向队列发送消息需要Connection#start方法。确切的调试点如下。Connection#start触发ActiveMQSession#start方法。此方法在调用Connection#start时触发。请参阅以下调试点org.apache.activemq.ActiveMQSession#start

ActiveMQ 调试点

问题是,Connection#start不是MessageProducer明确需要的,而是MessageConsumer需要的。但是,对于这两个示例,我们都需要清除资源(会话连接)。我意识到的是,如果我在生产者上删除Connection#start方法,代码将执行,调试点不会被触发(甚至在引擎盖下也不会),我会在队列中看到消息。但是,如果我在消费者上删除 Connection#start 方法,代码将不会执行,这就是问题,为什么在MessageProducer中不需要它并且代码成功执行但在MessageConsumer上需要?还有为什么我们甚至不使用MessageProducerConnection#start甚至我们需要关闭连接以刷新资源。好像代码有异味。

我看到那个字段开始是一个AtomicBoolean. 我不是并发和多线程方面的专家,所以,可能有人可以解释为什么对于 MessageProducer,Connection#start 不是强制性的;

org.apache.activemq.ActiveMQSession - 开始字段

B - 带有 ActiveMQ 的 JMS MessageProducer 的示例代码

C - 带有 ActiveMQ 的 JMS MessageConsumer 示例代码

D - 配置和 Maven 依赖

JDK版本是1.8,我正在运行ActiveMQ 5.15.12,并且客户端依赖项也使用相同的版本;

0 投票
3 回答
275 浏览

docker - 如何在集成测试中等待某些操作

嗨,我使用测试容器与 docker 进行了集成测试。在容器上我运行 jms。在测试中,我将消息放在队列中。

我如何在测试中等待以使其填充到 jms 上?

在本地机器上它可以工作,但在詹金斯它失败了,所以我必须添加

但这很讨厌。org.awaitility 似乎错过了用法:

我只需要暂停一下以使 jms 传播(放入 jms 队列)并等待侦听器采取行动,即将消息放入数据库。然后我必须调用 get rest 端点来查看它是否有效。

使用主题会更容易,因为我会在主题上创建测试监听器。但它是队列,可以有监听器来获取消息。

在此先感谢您的任何建议

0 投票
1 回答
1011 浏览

kubernetes - ActiveMQ Artemis 集群在一个实例崩溃后不会重新分发消息

我在 Kubernetes 中有一个 Artemis 集群,有 3 组主/从:

我正在使用 Spring boot JmsListener 来使用发送到通配符队列的消息,如下所示。

有 20 条消息发送到队列,master-1 是传递节点。当 5 条消息被消耗时,我杀死了 master-1 节点以模拟崩溃,我看到 slave-1 开始运行,然后在 Kubernetes 重新启动它后返回给 master-1。监听器抛出JMSException连接丢失并尝试重新连接。然后我看到它成功连接到master-0(我看到创建的队列和消费者计数> 0)。然而,master-0 上的队列是空的,而 master-1 中的同一个队列仍然有 15 条消息,并且没有附加消费者。我等了一会儿,但 15 条消息从未送达。我不确定为什么没有重新分配。

master-1上的通配符队列在崩溃后重新上线时的属性是这样的(我手动替换了字段accessToken的值,因为它有敏感信息):

master-0上的通配符队列的属性是这样的:

使用的 Artemis 版本是 2.17.0。这是我在 master-0 中的集群配置broker.xml。除了connector-ref更改为匹配代理之外,其他代理的配置相同:

从 Stack Overflow 的另一个回答中,我了解到我的高可用性拓扑是多余的,我计划移除从属设备。但是,我不认为奴隶是重新分配消息不起作用的原因。是否有我缺少处理 Artemis 节点崩溃的配置?

更新 1:正如贾斯汀建议的那样,我尝试在没有 HA 的情况下使用由 2 个 Artemis 节点组成的集群。

以下是2 artemis节点的broker.xml。它们之间唯一不同的是节点名称和日志缓冲区超时:

使用此设置,我仍然得到相同的结果,在 artemis 节点崩溃和恢复后,剩余的消息没有移动到另一个节点。

更新 2 我尝试按照贾斯汀的建议使用非通配符队列,但仍然得到相同的行为。我注意到的一个不同之处是,如果我使用非通配符队列,消费者计数仅为 1,而在通配符队列的情况下为 3。这是崩溃后旧队列的属性

这是新队列的属性

0 投票
0 回答
60 浏览

spring-boot - ActiveMQ 负载均衡

我有一个 ActiveMQ 实例,并且生产者正在将数据推送到队列中。目前,我们有一个并发设置为 1-5 的单个消费者,它是使用 Spring Boot 开发的。现在我在不同的端口上运行相同的 Spring Boot 应用程序(Consumer)来扩展消费者。当我检查日志时,只有一个消费者正在接收消息,而另一个消费者(它是另一个消费者的副本)没有从该队列接收任何消息。

请在下面找到消费者代码

我是否需要在代理或消费者端配置一些东西,以便以循环方式使用消息,即基本上在这两个消费者之间共享负载?我尝试将预取设置为 1,但无论哪个消费者首先开始,仍然会接收消息。

0 投票
0 回答
117 浏览

java - ActiveMQ 等待消息超时 (ActiveMQ 5.16.2)

我们有一个用我们的 Tomcat 配置的 ActiveMQ,就像在context.xmlTomcat 中一样:

现在在 Java 代码中,我正在创建这样的 JMS 生产者:

我的订阅者代码如下所示:

因此,在负载较低的情况下它可以正常工作。现在我们传递如下消息:

sendMessage 的编码如下:

我们正在获取这样的消息:

waitForAllMessages方法看起来像这样:

我们确实看到了这样的错误:

所以偶尔 ActiveMQ 消息会卡住。并且 Web 服务正在超时等待 JMS 消息进来。

任何指针都会有所帮助。这让我们整个团队都感到困惑。问题是,它发生了几分钟,然后又开始正常工作。

注意:这是我们使用的非常旧的代码,我们将很快转向 JSONMessaging。以前它使用 WebSphere 的 JMS 工具。但是自从我们摆脱了 WebSphere 并转移到了 Tomcat。我们迁移到 ActiveMQ 并重新设计代码以使用 ActiveMQ。

线程转储: