[spring-projects/spring-boot]为JMS侦听器容器的接收超时提供配置属性

2024-04-10 741 views
7

JMS receiveTimeout 属性spring.jms.template.receive-timeout不会从配置属性传播到创建的 JMS 侦听器中。这迫使应用程序代码显式设置它 - 我们发现应用程序很少这样做,并且默认值在某些环境中对性能不利。

这个小更改将外部配置复制到侦听器中。

(我听说现在有一个企业 CLA 可以让这一点被接受。)

回答

9

感谢您的建议。

鉴于我们对模板和侦听器有单独的属性,用户可能会惊讶于某个spring.jms.template.*属性影响了侦听器的配置。我认为我们应该考虑几个替代方案:

  1. 引入一个单独的spring.jms.listener.receive-timeout属性
  2. 弃用spring.jms.template.receive-timeout并添加spring.jms.receive-timeout在模板和侦听器上配置接收超时

1 提供了更大的灵活性,而 2 则更容易保持两者同步。我对哪个是更好的选择没有强烈的意见,尽管我倾向于 1。你觉得怎么样,@ibmmqmet。 @snicoll 回到办公室后可能也会有意见。

7

该模板似乎被用于相当多的其他属性,但不清楚真正的区别是什么 - 它确实在 JMSProperties.Template 类中具有 receiveTimeout 属性,该属性在我能看到的其他地方没有使用 - 所以这样做这种方式是有道理的。否则,在班级中拥有该财产有什么意义呢?它可以配置到模板中,只是不传播。也许存在一种关于什么属于“模板”以及什么属于“真实”创建的对象的哲学。

我不知道为什么您会以不同于默认属性的目标/连接的方式对待 JMS 侦听器,但如果有一种首选方法,那么我并不关心。

在您的两个选项中(1)可能是最容易理解的。

5

spring.jms.template属性用于配置JmsTemplate由以下方法创建的 bean JmsAutoConfiguration

https://github.com/spring-projects/spring-boot/blob/aef92b9295f62d008faa9ab79905a474bf3496f3/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/JmsAutoConfiguration。 java#L85-L96

它可以配置到模板中,只是不传播。也许存在一种关于什么属于“模板”以及什么属于“真实”创建的对象的哲学。

听起来您似乎不知道 Spring FrameworkJmsTemplate简化了使用 JMS 的代码。这就是template属性名称中的 the 所指的内容。JmsTemplate由自动配置创建并使用属性配置的对象是spring.jms.template.*一个真实的对象,并作为 bean 暴露给应用程序。另一方面,这些spring.jms.listener属性用于配置由 JMS 自动配置创建的消息侦听器容器。

简而言之:

  • 当应用程序代码使用 JMS时,自动配置的接收超时JmsTemplate控制接收消息的超时JmsTemplate
  • 自动配置的消息侦听器容器上的接收超时控制容器接收消息的超时,然后将消息传递给正在侦听 JMS 消息的任何 Bean。

鉴于上述情况,您仍然倾向于我提出的两个选项中的第一个吗?

1

是的,(1)中的单独属性可以工作。

7

您想更新您的提案吗?

1

@ibmmqmet 感谢您的更新。您能否进行必要的更改以使您的 GitHub 帐户与 IBM 的 CLA 相关联?

6

@ibmmqmet 我们可以得到一些反馈吗?

1

抱歉耽搁了——其他项目和离开我的办公桌妨碍了......

我已经添加了所要求的评论。但无法将函数添加到测试文件中,因为 org.springframework.jms.listener.AbstractPollingMessageListenerContainer#getReceiveTimeout() 方法被标记为“受保护”(没有明显原因),因此无法直接访问。

6

感谢您的更新。

方法被标记为“受保护”(没有明显的原因),因此无法直接访问。

它被标记protected为限制公共 API 的表面积。

当我们想要测试不可公开访问的东西的价值时,我们通常使用反射。 AssertJhasFieldOrPropertyWithValue提供了一种方法来做到这一点。在一些测试中有一些它的用法示例JmsAutoConfigurationTests。这是一个:

https://github.com/spring-projects/spring-boot/blob/c44a6dee3d0bf523339972715f752e878e2b346a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jms/JmsAutoConfigurationTests。 java#L168-L169

您能否使用这种方法来测试新的接收超时属性?

除了缺少测试之外,不幸的是,由于 CLA 检查失败,我们也无法合并它。我们目前的理解是,您的 IBM 或 OpenLiberty GitHub 组织成员资格需要公开。

2

感谢您的更新。有CLA的消息吗?

不幸的是,如果这拖得太久,我们将不得不关闭 PR,因为监视它的开销开始超过更改的好处。

4

CLA 好像已经签了

4

非常感谢 @ibmmqmet 对 Spring Boot 做出的第一个贡献。我很高兴我们最终成功实现了这一目标。