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

Same ThreadLocal in Spring JMS producer and consumer

我正在使用 SpringBoot 和 Spring JMS 在后端处理购物车(商业网络应用程序)。 JMS生产者发送Order消息,消费者接收并处理。

由于应为多租户配置应用程序,我将租户 ID 保留在 ThreadLocal 中。在生产者方面,一切都很好,租户 ID 在 ThreadLocal 中可用,但在消费者方面则不然。我怎样才能让消费者也可以使用它?

不保证 JMS 生产者和消费者将由同一个线程处理。说实话的可能性很小。哎呀,他们可以在不同的 JVM 中,这使得它不可能。因此,您将无法使用线程局部变量将信息从生产者传递给消费者。

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

Each message contains a built-in facility for supporting application-defined property values. Properties provide an efficient mechanism for supporting application-defined message filtering.

来源:Message Javadoc

写 reader 属性 很简单:

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

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