如何使用 Spring Boot 监听动态目的地?

2023-12-02

我们有一个使用 Spring Boot 及其 JMS 工具的应用程序。在运行时,我们有不同的生产者在线跳转并告诉我们的应用程序要侦听的主题或队列的名称。现在,我们有:

@JmsListener(destination = "helloworld.q")
public void receive(String message) {
  LOGGER.info("received message='{}'", message);
}

当我们向helloworld.q话题。问题是,直到运行时我们才知道主题的名称是什么,并且JmsListener似乎想要一个恒定的表达。

消息生产者将连接到我们的 ActiveMQ 实例并广播一条消息,告诉我们需要开始侦听他们的主题,例如“Wasabi”、“WhitePaper”、“SatelliteMajor”、“BigBoosters”等。无法知道运行时我们需要开始收听哪些主题。

我读过 Spring 文档,它解释了如何在运行时监听主题/队列(某种程度上):

@Configuration
@EnableJms
public class ReceiverConfig implements JmsListenerConfigurer {

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

  // other methods...
}

我已将其推入我们的接收器配置中作为测试,并且当我们发送消息时它确实会被调用。问题是,Spring 使所有这些东西都被自动调用,而我们不知道在哪里以及如何为该方法提供端点需要侦听的主题/队列的名称。另外,消息监听器似乎永远不会被调用,但这是一个单独的问题;我相信如果我们至少可以发送自定义主题或队列以供其收听,我们就可以解决这个问题。

我们正在使用 Spring 2。x.


您可以使用属性占位符作为目标名称

@SpringBootApplication
public class So56226984Application {

    public static void main(String[] args) {
        SpringApplication.run(So56226984Application.class, args);
    }

    @JmsListener(destination = "${foo.bar}")
    public void listen(String in) {
        System.out.println(in);
    }

    @Bean
    public ApplicationRunner runner(JmsTemplate template) {
        return args -> template.convertAndSend("baz", "qux");
    }

}

然后设置属性,例如在 Spring Boot 应用程序的 application.yml 中,或在启动 JVM 时的命令行属性中

-Dfoo.bar=baz

EDIT

您可以将侦听器 bean 设为原型并调整环境属性。

@SpringBootApplication
public class So56226984Application {

    public static void main(String[] args) {
        SpringApplication.run(So56226984Application.class, args).close();
    }

    @Bean
    public ApplicationRunner runner(JmsTemplate template, JmsListenerEndpointRegistry registry,
            ConfigurableApplicationContext context) {

        return args -> {
            Scanner scanner = new Scanner(System.in);
            String queue = scanner.nextLine();
            Properties props = new Properties();
            context.getEnvironment().getPropertySources().addLast(new PropertiesPropertySource("queues", props));
            while (!"quit".equals(queue)) {
                System.out.println("Adding " + queue);
                props.put("queue.name", queue);
                context.getBean("listener", Listener.class);
                template.convertAndSend(queue, "qux sent to " +  queue);
                System.out.println("There are now " + registry.getListenerContainers().size() + " containers");
                queue = scanner.nextLine();
            }
            scanner.close();
        };
    }

    @Bean
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public Listener listener() {
        return new Listener();
    }

    public static class Listener {

        @JmsListener(destination = "${queue.name}")
        public void listen(String in) {
            System.out.println(in);
        }

    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Spring Boot 监听动态目的地? 的相关文章

随机推荐

  • Windows Phone 8.1 中的 AutoSuggestBox 出现奇怪的结果

    我正在尝试使用标准AutoSuggestBox在 Windows Phone 8 1 XAML 应用程序中 但它的行为非常奇怪 在一个简单的演示中 我收集了 Items new ObservableCollection
  • Android - 加快在数据库中插入数据的速度

    我目前有一个 CSV 文件 我正在解析该文件 并尝试将数据插入到 android 数据库中 我遇到的问题是插入所有数据花费的时间太长 数据量很大 但我觉得不需要 20 分钟左右就能完成 基本上 我创建数据库 然后开始解析 在解析每个单独的
  • CameraSource .setAutoFocusEnabled(true) 返回:尽管设备支持自动对焦,但该设备不支持相机自动对焦

    下面是我的条形码扫描仪活动 除了 setAutoFocusEnabled true 之外 一切正常 它在运行时返回一条消息 显示我的设备不支持自动对焦 尽管 Samsung Tab E T561 是支持自动对焦的设备 import andr
  • 如何使用 R 和 ggplot 绘制逻辑回归模型的结果

    creat a new data frame and add a binary column called surv24 leukemia data lt data frame wbc leuk wbc ag leuk ag time le
  • 减小 pdf 大小 - Objective c

    我有一个pdf生成项目 它由一些文本和一个已存储在数据库中的图像组成 我想预览并邮寄生成的pdf 当只有文本数据时一切正常 如果我们的数据中有图像 就会出现问题 邮件收到 大小为 10MB 或以上的 pdf 即使它具有大小为 1MB 或以下
  • List RemoveAll() 没有删除项目

    我有一个看起来像这样的对象 Text Another lovely alert Category 2 UserAlerts UserId 2 这将传递到 Web API 并正确绑定到 Key Column Order 0 public lo
  • SwiftUI @FetchRequest 使应用程序崩溃并返回错误

    我正在尝试使用 Xcode 11 在 SwiftUI 的 mac 应用程序中使用核心数据 我在创建项目时勾选了 使用核心数据 我还创建了实体 称为 VisitedCases 并使用编辑器创建 NSManagedObject 子类文件 我还将
  • F#:从另一个列表中过滤一个列表中找到的项目

    假设我有两个列表 let a 1 1000 let b 250 500 如何获取包含值 1 249 501 1000 的新列表 由于您的列表已排序 因此您可以使用此 非尾递归 函数在线性时间内解决此问题 let rec except a b
  • Specs2 - 标记要运行的测试

    我已经使用 ScalaTest 一段时间了 我发现标记测试并从命令行仅运行具有特定标记的测试的功能非常有用 Specs2中有类似的东西吗 我知道您可以使用 testOnly 运行特定的测试类 但我只想使用规范中的特定标签运行测试 操作方法如
  • 如何在 CSS 中使用 :not 选择器?

    我的问题说明了一切 我是 CSS 新手 我正在尝试使用以下代码 但它不起作用 ul verticalNav declaration ul verticalNav li declaration ul verticalNav li a decl
  • AppCompat PreferenceActivity 向上按钮不起作用

    我正在尝试创建一个扩展 AppCompatPreferenceActivity 并在操作栏中实现向上按钮的活动 视觉上一切看起来都很好 但向上按钮不响应触摸事件 以下是我的java和xml代码 PrefrencesDisplayActivi
  • aChartEngine、GraphicalView OnClickListener 不起作用

    我是 android 新手 正在使用 aChartEngine 创建条形图 我想在用户单击图表时捕获 x 和 y 值 我已经查看了 aChartEngine 的演示 并且我的图表创建得很好 但是 当我单击图形时 onClickListner
  • 当 eventDrop 被调用时,如何发送 ajax 请求来更新 FullCalendar UI 中的事件?

    我正在尝试使用这个很棒的用户界面 全日历 但我想做的是 当用户移动事件时 发送一个 ajax 请求来更新数据库中的事件数据 因此 如果用户想要将事件移至日历中的不同日期 那么我需要能够使用 ajax 请求将请求发送到数据库 我如何收集新信息
  • 用户输入创建对象

    我正在尝试创建一个使用用户输入的新对象 我尝试将用户输入分配给变量但是不知道如何添加变量当我声明新对象时到新对象 这只是我需要帮助的代码部分 我需要帮助的部分是line 8 我知道我可以随机放置一些东西 当我使用我的设置方法时 它会覆盖 但
  • 从 Amazon MySQL RDS 本地导入转储时 MySQL 语法错误?

    当我从 Amazon RDS 创建数据库转储然后尝试将其导入本地时 结果是ERROR 1064 42000 at line 54 第 54 行有如下语句 CREATE TABLE account emailconfirmation 用于转储
  • 查找未加权无向图中两个节点之间的所有最短路径

    我需要帮助找到一个节点中两个节点之间的所有最短路径未加权无向图 我能够使用 BFS 找到最短路径之一 但到目前为止我不知道如何找到并打印所有路径 对我可以使用的算法 伪代码有什么想法吗 需要注意的是 请记住 图中两个节点之间的最短路径可能呈
  • 启动 Hbase:cygpath:无法转换空路径

    我希望有人能帮助我解决这个问题 启动 hbase 时出现此错误 start hbase sh cygpath can t convert empty path cygpath can t convert empty path soporte
  • iOS:仅绘制 UImage 的一部分

    我正在尝试仅绘制一个自定义部分UIImage 即 我想reveal的部分UIImage用户触摸 并且我通过使用得到了合理的结果mask的财产layer 我的身上有这样的东西UIView UIBezierPath maskPath UIBez
  • 一个 NFC 标签上有 2 条 NDEF 消息/记录 - Android

    有人尝试过Android默认行为如何 当NFC标签上保存2个NDEF记录时 一个指向带有应用程序 apk的URL 而第二个具有应用程序专有数据 用例如下 当用户尚未安装应用程序时 设备启动 Google Play 或网络浏览器 并且用户可以
  • 如何使用 Spring Boot 监听动态目的地?

    我们有一个使用 Spring Boot 及其 JMS 工具的应用程序 在运行时 我们有不同的生产者在线跳转并告诉我们的应用程序要侦听的主题或队列的名称 现在 我们有 JmsListener destination helloworld q