gpt4 book ai didi

java - 使用传入的值作为@JmsListener 的目标参数

转载 作者:搜寻专家 更新时间:2023-11-01 02:21:46 25 4
gpt4 key购买 nike

有没有具体的方法可以做到这一点?我试图在这里找到解决方案,但找不到我需要的东西。我有一个 Spring Boot 应用程序,它将从命令行接受多个参数。有问题的参数是队列名称(即目的地)。它可以是我们众多队列中的几个。 JmsListener 的形式为

@JmsListener(destination="dest_goes_here")
public void processOrder(Message message){. . .}

我有一个基本上看起来像这样的类

 public class Arguments {
private static queue
private static antoherArg
:
:
getters and setters
}

而我想说的是destination = Arguments.getQueue(),不过好像destination只能是static final多变的?我假设这是因为错误提供了一个暗示这一点的小工具提示。

我还测试了它,因为我还有另一个名为 Constants 的类,它显然包含常量,如果我将队列名称硬编码为 public static final String QUEUE = "MyQ"; 然后说 destination = Constants.QUEUE 就可以了。

然后我假设我可以在我的监听器类中做这样的事情 private static final String QUEUE = Arguments.getQueue(); 但它也不喜欢那样。唉,我难住了。

如果有人愿意分享知识,那么这里真的有两个问题。为什么 @JmsListener 可以将 destination 设置为我的第二个解决方案,而不是第一个和最后一个?

然后是主要问题(我更希望您回答第一个问题)是,我可以使用什么策略将目标设置为源自命令行的变量(即动态变量)?

编辑:澄清一下,我不能将值保留在我的Constants 类中,因为该值将来自命令行并且需要传递给 JmsListener 类以用作 目的地

最佳答案

这就是 Java 的工作方式,destination 必须是一个编译时常量表达式,函数调用不被认为是一个。看看the official language specification for more details . 编辑:您还可以查看 this answer .

就您的第二个(也是更重要的)问题而言,我有几个建议给您。

首先,您可以从配置属性中读取队列名称,如下所示:destination="${jms.queue.name1}" 其中jms.queue.name1 是您的配置属性。然后,由于您使用的是 Spring Boot,您可以使用命令行参数来覆盖您的配置属性(请参阅 externalized configuration documentation for more details)。这样,您就可以在运行时通过将其作为命令行参数传递来指定队列名称,例如 --jms.queue.name1=foo

其次,您可以使用 programmatic listener registration ,像这样:

@Configuration
@EnableJms
public class AppConfig implements JmsListenerConfigurer {

@Override
public void configureJmsListeners(JmsListenerEndpointRegistrar registrar) {
SimpleJmsListenerEndpoint endpoint = new SimpleJmsListenerEndpoint();
endpoint.setId("myJmsEndpoint");
endpoint.setDestination(Arguments.getQueue());
endpoint.setMessageListener(message -> {
// processing
});
registrar.registerEndpoint(endpoint);
}
}

关于java - 使用传入的值作为@JmsListener 的目标参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38862279/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com