Spring JMS生产者和消费者中使用相同的ThreadLocal

问题描述

我正在使用SpringBoot和Spring JMS在后端处理Cart(商业Web应用程序)。 JMS生产者将发送Order消息,而消费者将提取并处理。

由于应为多租户配置应用程序,因此我将租户ID保留在ThreadLocal中。在生产者方面,一切都很好,并且ThreadLocal中提供了租户ID,但在消费者方面却没有。我该如何在消费者方面使它也可用?

解决方法

不能保证JMS生产者和使用者将由同一线程处理。说实话,这是非常不可能的。注意它们可以位于不同的JVM中,这使得不可能实现。因此,您将无法使用线程局部变量将信息从生产者传递到消费者。

您必须将此信息添加到邮件正文中,或将其添加为属性。

每条消息都包含一个内置工具,用于支持应用程序定义的属性值。属性提供了一种支持应用程序定义的消息过滤的有效机制。

来源:Message Javadoc

编写和阅读器属性很简单:

// Producer side
msg.setStringProperty("tenant","tenant-1");
// Consumer side
String tenant = msg.getStringProperty("tenant");

一旦在消费者端提取了租户信息,就可以将其放入线程局部变量中以供进一步使用。