Spring提供了一个JMS集成框架,它简化了JMS API的使用,就像Spring对JDBC API的集成一样。
让 JmsListenerContainerFactory 中的两个消费者顺序处理消息
我有一个使用以下参数实现 JmsListenerContainerFactory 的类: 工厂.setSessionTransacted(true); 工厂.setConcurrency(“1”); 工厂.setAutoStartup(true); 还有
JMSCC0111:JMS 的 IBM MQ 类尝试在 Connection 或 JMSContext 上设置预先存在的客户端 ID
即使在属性文件中指定订阅者客户端 ID 后,我仍看到以下错误。我正在使用 Spring Boot 3.3.4 2024-10-28T15:47:30.173-04:00 警告 14156 --- [(2)-10.1.81.174] o....
com.ibm.mq.MQException:MQJE001:完成代码 2,原因 2009 使用 Sprint Boot 和 JMS (IBM MQ )
我不确定我做错了什么,这个问题非常零星,我有下面的代码在IBM MQ上发送JMS消息。我正在单独使用 spring @async 进行操作,如下所示。 @覆盖 @异步
从 ActiveMQ Classic 升级到 ActiveMQ Artemis - 类 java.util.ArrayList 不是有效的属性类型
我正在将 ActiveMQ Classic 升级到 ActiveMQ Artemis,同时维护客户端代码。我有多个地方的代码看起来像这样。 导入java.io.IOException; 导入java.util.ArrayList; 导入java...
ActiveMQ Artemis 和 Spring JmsTemplate 的性能问题
在使用 ActiveMQ Artemis 代理和我的 Spring Boot 应用程序进行一些负载测试时,我遇到了性能问题。 我正在做的是发送例如每秒 12,000 条消息发送至...
带有 CachingConnectionFactory 和负载均衡器的 JmsTemplate
我正在使用 Spring 的 JmsTemplate、CachingConnectionFactory 和 JmsTransactionManager 来提交或回滚向 IBM MQ 发送消息。我有多个 MQ 主机,其顶部有一个负载均衡器
防止将 CachingConnectionFactory 与 DefaultJmsListenerContainerFactory 一起使用
我正在开发一个全新的项目,其中我需要有监听器来消费来自多个队列的消息(目前不需要生产者)。 从头开始,我用的是最后一个
在DefaultMessageListenerContainer中配置sessionAcknowledgeMode
我有一个设置,我必须从 ActiveMQ 代理中的队列中读取消息。读取消息后,我必须对该消息执行长时间运行的操作。 由于这个长时间运行的操作...
Sonic MQ 12.0 无法与 Spring Boot 3.3.1 版本连接
在最新版本的 Spring Boot 3.3.1 中使用 TopicConnectionFactory 创建 ConnectionFactory 时,progress.message.jclient 预计会遇到像 jakarta package 这样的问题。
我目前使用的是 Spring Boot 版本 3.3.0 和 Java 21。 我在将 SessionAcknowledgeMode 设置为 Session.CLIENT_ACKNOWLEDGE 时遇到问题。我正在尝试手动确认消息...
缓存的 JMS Session 对象在 JmsTemplate 中打印为 null
我们的应用程序是一个在 Tomcat 内运行的 JAVA 后端应用程序。在较高级别上,它从 IBM MQ 读取输入,对其进行处理,将其保留在 ORACLE DB 中并将输出写入 MQ。这是一个分发...
Spring JMS 错误发送带有千分尺跟踪行李字段“X-Correlation-Id”的消息
我正在尝试使用 Spring JmsTemplate 发送 JMS 消息,如下所示。 jmsTemplate.convertAndSend(topicName, WebsocketMessage("")) 而且,我正在使用
大量带有选择器 JMSCorrelationID='CamelDummyJmsMessageSelector' 的异步消息使用者
我正在使用 apache Camel 使用 spring-jms 和 ibm-mq 配置 jms 请求/回复模式。 我的 Camel Route 配置为 InOut 模式,我能够成功地从回复队列中读取消息...
BackOff 和事务性不适用于消息处理,仅适用于侦听器设置
我有一个接收消息的 IbmMqEndpoint。我想要的是,如果在消息处理过程中发生错误,消息将保留在原始队列中。以下实施完美无缺...
org.springframework.messaging.converter.MessageConversionException:未找到从实际负载类型“byte[]”到预期负载的转换器
我有一个Spring Boot应用程序,在配置类中使用@EnableJMS,在侦听器类中使用@JMSListener 在配置类中,我创建了一个用于连接工厂的 bean 和一个用于混乱的 bean...
我正在使用 JMS 构建 Spring Boot 应用程序。为了解决consumer端的重复消息问题,所有出队的JMSMessageID都会保存在redis中,consumer会ign...
我正在使用 ActiveMQ Artemis 2.17 和 Spring Boot 2.5.7。 我正在发布有关主题和队列的消息并使用它。一切都是通过 JMS 完成的。 所有队列(任播或多播)都是持久的。我的
BackOff 和事务性不适用于消息处理,仅适用于侦听器设置
我有一个接收消息的 IbmMqEndpoint。我想要的是,如果在消息处理过程中发生错误,消息将保留在原始队列中。以下实现完美无缺...
问题 我们有一个具有以下消息驱动通道适配器配置的遗留应用程序 问题 我们有一个具有以下消息驱动通道适配器配置的旧应用程序 <jms:message-driven-channel-adapter id="processRequest" destination="requestFromLoader" connection-factory="connectionFactory" max-concurrent-consumers="30" message-converter="xmlMarshalConverter" channel="jmsInChannel" error-channel="errorChannel"/> 使用此配置max-concurrent-consumers =“30”我们预计有30个并行消费者(processRequest-container-1到30)来消费消息,但在测试过程中我们发现每个消费者依次消费10条消息,Eg - processRequest-container-1 处理消息 1 到 10,然后创建 processRequest-container-2 并处理 11 到 20 等等.. 如果只有 2 个请求,这会导致第二条消息等待,即使还有 29 个其他消费者。 分辨率 我们添加了 max-messages-per-task="1",这似乎产生了正确的结果,但我们仍在使用大量消息进行测试。 <jms:message-driven-channel-adapter id="processRequest" destination="requestFromLoader" connection-factory="connectionFactory" max-concurrent-consumers="30" max-messages-per-task="1" message-converter="xmlMarshalConverter" channel="jmsInChannel" error-channel="errorChannel"/> 问题 我们通知日志中的消费者名称(processRequest-container-1)将达到2000或3000(processRequest-container-2546),并且不限于processRequest-container-1到processRequest-container-30,但在第一种情况下,没有 max-messages-per-task="1" 它没有超出 processRequest-container-30,这正常吗?或者我们需要做些什么吗? 在spring文档中max-messages-per-task =“1”被定义为每条消息要执行的任务,什么是任务以及最大并行消费者如何受此影响? 添加 max-messages-per-task="1" 正确还是我们遗漏/忽略了其他内容? 任何建议或评论都很好。预先感谢。 这个问题更多的是关于 Spring JMS,而不是 Spring Integration。 最好阅读用于上述 DefaultMessageListenerContainer 的 <jms:message-driven-channel-adapter> 的源代码和 Javadoc。 有一条有趣的评论可能可以解释您的行为: /** * Specify the maximum number of concurrent consumers to create. Default is 1. * <p>If this setting is higher than "concurrentConsumers", the listener container * will dynamically schedule surplus consumers at runtime, provided that enough * incoming messages are encountered. Once the load goes down again, the number of * consumers will be reduced to the standard level ("concurrentConsumers") again. * <p>Raising the number of concurrent consumers is recommendable in order * to scale the consumption of messages coming in from a queue. However, * note that any ordering guarantees are lost once multiple consumers are * registered. In general, stick with 1 consumer for low-volume queues. * <p><b>Do not raise the number of concurrent consumers for a topic, * unless vendor-specific setup measures clearly allow for it.</b> * With regular setup, this would lead to concurrent consumption * of the same message, which is hardly ever desirable. * <p><b>This setting can be modified at runtime, for example through JMX.</b> * @see #setConcurrentConsumers */ public void setMaxConcurrentConsumers(int maxConcurrentConsumers) { 因此,由于您不使用 concurrent-consumers="30" 来代替,因此您获得最多 30 个动态实例,并且它们的 id 确实增加了,这是正常的。 如果不指定max-messages-per-task="1",逻辑是这样的: if (this.taskExecutor instanceof SchedulingTaskExecutor ste && ste.prefersShortLivedTasks()) { if (this.maxMessagesPerTask == Integer.MIN_VALUE) { // TaskExecutor indicated a preference for short-lived tasks. According to // setMaxMessagesPerTask javadoc, we'll use 10 message per task in this case // unless the user specified a custom value. this.maxMessagesPerTask = 10; } } 或者你的taskExecutor不是那个SchedulingTaskExecutor(这确实是默认情况下),因此你的所有消息都由同一个消费者实例处理。 一些文档也在这里:https://docs.spring.io/spring-framework/reference/integration/jms/using.html#jms-mdp
Spring Boot JmsTemplate 未考虑消息中的replyTo
我根据以下代码调用jmsTemplate @覆盖 公共字符串sendAndReceive(字符串有效负载){ 字符串 retVal = ""; 尝试 { 最后的混乱...