消息驱动通道适配器会在应用程序上下文启动后丢弃第一条消息,除非延迟调用 send

2023-12-02

我对 Spring Integration 配置进行了集成测试,该测试使用来自具有持久订阅的 JMS 主题的消息。为了进行测试,我使用 ActiveMQ 而不是 Tibco EMS。 我遇到的问题是,我必须在测试方法开始时使用睡眠调用来延迟将第一条消息发送到端点。否则该消息将被丢弃。 如果我删除持久订阅和选择器的设置,那么第一条消息可以立即发送,不会有延迟。 我想摆脱不可靠的睡眠。有没有办法在发送消息之前检查端点是否已完全设置? 下面是配置。

感谢您的帮助!

    <int-jms:message-driven-channel-adapter
        id="myConsumer" connection-factory="myCachedConnectionFactory"
        destination="myTopic" channel="myChannel" error-channel="errorChannel"
        pub-sub-domain="true" subscription-durable="true"
        durable-subscription-name="testDurable"
        selector="..."
        transaction-manager="emsTransactionManager" auto-startup="false"/>

如果您使用干净的嵌入式 activemq 进行测试,则在建立订阅之前,订阅的持久性是无关紧要的。所以你别无选择,只能等到那一天发生。

您可以通过发送一系列启动消息来避免睡眠,并且仅在收到最后一条消息时才开始真正的测试。

EDIT

我忘了还有一个方法isRegisteredWithDestination() on the DefaultMessageListenerContainer.

Java文档...

/**
 * Return whether at least one consumer has entered a fixed registration with the
 * target destination. This is particularly interesting for the pub-sub case where
 * it might be important to have an actual consumer registered that is guaranteed
 * not to miss any messages that are just about to be published.
 * <p>This method may be polled after a {@link #start()} call, until asynchronous
 * registration of consumers has happened which is when the method will start returning
 * {@code true} &ndash; provided that the listener container ever actually establishes
 * a fixed registration. It will then keep returning {@code true} until shutdown,
 * since the container will hold on to at least one consumer registration thereafter.
 * <p>Note that a listener container is not bound to having a fixed registration in
 * the first place. It may also keep recreating consumers for every invoker execution.
 * This particularly depends on the {@link #setCacheLevel cache level} setting:
 * only {@link #CACHE_CONSUMER} will lead to a fixed registration.
 */

我们用它来一些通道测试,我们使用反射获取容器,然后轮询该方法,直到我们订阅该主题。

/**
 * Blocks until the listener container has subscribed; if the container does not support
 * this test, or the caching mode is incompatible, true is returned. Otherwise blocks
 * until timeout milliseconds have passed, or the consumer has registered.
 * @see DefaultMessageListenerContainer#isRegisteredWithDestination()
 * @param timeout Timeout in milliseconds.
 * @return True if a subscriber has connected or the container/attributes does not support
 * the test. False if a valid container does not have a registered consumer within
 * timeout milliseconds.
 */
private static boolean waitUntilRegisteredWithDestination(SubscribableJmsChannel channel, long timeout) {
    AbstractMessageListenerContainer container =
            (AbstractMessageListenerContainer) new DirectFieldAccessor(channel).getPropertyValue("container");
    if (container instanceof DefaultMessageListenerContainer) {
        DefaultMessageListenerContainer listenerContainer =
            (DefaultMessageListenerContainer) container;
        if (listenerContainer.getCacheLevel() != DefaultMessageListenerContainer.CACHE_CONSUMER) {
            return true;
        }
        while (timeout > 0) {
            if (listenerContainer.isRegisteredWithDestination()) {
                return true;
            }
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) { }
            timeout -= 100;
        }
        return false;
    }
    return true;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

消息驱动通道适配器会在应用程序上下文启动后丢弃第一条消息,除非延迟调用 send 的相关文章

随机推荐

  • 阻止用户打开开始菜单

    我有一个程序应该阻止用户打开任务管理器和打开开始菜单 我已经添加了代码来禁用任务管理器 现在需要阻止用户通过键盘上的 windows 键启动 开始 菜单 请问有人有想法吗 据我所知 您可以减少用户的访问权限 以便他们拥有almost开始菜单
  • WEB API 2 删除返回 405

    我正在尝试在我的 Web API 类中创建一个删除函数 我之前在使用 Put 和 Patch Http 消息时遇到了问题 因为这些消息链接到 WebDAV 更改此设置后 补丁和放置有效 但删除给我带来了问题 这是我的课程 RoutePref
  • 测试点是否在圆内的方程

    如果你有一个以中心为中心的圆 center x center y 和半径radius 如何测试给定点是否具有坐标 x y 是在圈内吗 一般来说 x and y必须满足 x center x y center y lt radius 请注意
  • VBScript 能否确定特定文件夹中最近修改(或添加)的文件?

    我有一个脚本 或更准确地说将有一个脚本 来检查文件夹并将文件从该文件夹复制到不同的位置 每天运行一次 然而 我想要复制的文件名会根据日期而变化 基本上 我不想将 strFilePath 设置为 C somePath somePath2 my
  • 我在哪里为 Qt 设计器中的单个升级的 QWidget 编写类

    我阅读 测试并理解了很多来自 Qt 设计器的 QWidgets 使用示例 这些示例已升级到 PyQt5 尽管如此 我无法为我自己处理一个简单的例子 下面我展示了我的代码 该代码不起作用并尝试解释 在 Qt 设计器中 我创建一个简单的 Mai
  • 带 UIImages 指针的模拟时钟?

    我想知道如何在iPhone SDK中制作模拟时钟 但是 我希望时钟的指针是自定义图像 而不是像本教程中那样绘制的正方形 http iphone dev tips alterplay com 2010 03 analog clock usin
  • var let 可以,但 let let 不行吗?

    Version A var let true console log let true Version B let let 0 syntax Error let is disallowed as a lexically bound name
  • 如何在没有 Storyboard 的 Xcode 中创建空应用程序

    Xcode6已删除Empty Application创建新项目时的模板 我们如何创建一个空的应用程序 没有故事板 Xcode6及以上 就像早期版本一样 里面没有选项XCode6及以上版本用于直接创建空应用程序 如下所示XCode5和更早的时
  • 如何使用 IF 函数编写步进函数

    我有 3 个数字范围 答案取决于范围 75 79 gt 0 255 80 84 gt 0 327 85 gt 0 559 我尝试创建一个方程 通过使用嵌套来解释范围IF函数 但 Excel 指出我为此函数输入了太多参数 下面是我输入的方程式
  • 将字符串传递给 ggplot 函数

    我想要一个可以应用于任何满足条件的对象的函数 并且有一个很好的ggplot带回归线打印的散点图 但是 我无法概括我能做什么REPL与代码 所以我有这个工作 require ggplot2 require xts set seed 1 dd
  • sql中的trunc和round函数

    trunc 和 round 与否定参数相同吗 SQL gt select round 123456 76 4 from dual ROUND 123456 76 4 120000 SQL gt select trunc 123456 76
  • 是否可以在 Xamarin.Forms 中将字符串转换为标题大小写?

    所以在我的程序中我有一个Entry像这样
  • LINQ to Entities - 使用字符串名称寻址类属性

    我有一个打开了服务器端过滤的 Kendo 网格 要过滤的字段作为字符串传递 例如 我想按 SampleId 进行过滤 现在 我需要编写一个 LINQ to Entities 查询 该查询可以使用强类型属性 SampleId 进行过滤 例如
  • LINQ 和区分大小写

    我有这个 LINQ 查询 TempRecordList new ArrayList TempRecordList Cast
  • Google Tango:对齐深度和颜色框架

    我想使用 Google Tango 平板电脑对齐 同步 深度 颜色帧对 这样 假设两个帧具有相同的分辨率 深度帧中的每个像素对应于颜色帧中的相同像素 即 我想实现视网膜主题映射 如何使用最新的 C API 希尔伯特发布版本 1 6 来实现这
  • “合并”列表中元素上的 2 个数据框? - 双钥匙

    这是此问题的后续问题 合并 列表中元素上的 2 个数据框 扩展是 现在某些名称可以在 df8 中加倍 因此为了能够区分各个文本 我创建了一个日期 df8 pd DataFrame Dates 2017 12 14 2017 12 14 20
  • PHP 中可以将字符串附加到变量吗? [复制]

    这个问题在这里已经有答案了 为什么下面的代码输出0 它可以很好地处理数字而不是字符串 我在 JavaScript 中有类似的代码也可以工作 PHP 不喜欢 字符串吗 这是因为 PHP 使用句点字符 用于字符串连接 而不是
  • 应用程序允许后台播放视频、Cordova 问题、Google Play 拒绝应用程序

    我使用 Cordova 创建了一些 Android 应用程序 其中包含视频 我正在尝试在 Google Play 商店上上传应用程序 但每次他们都会拒绝所有应用程序 原因如下 您提交的内容因启用 YouTube 视频后台播放而被拒绝 这违反
  • 如何在__construct中访问会话?

    在 Laravel 5 3 4 中 我无法访问构造中的会话变量 有什么办法可以做到这一点吗 这是我的代码 app Http Controllers Controller php class Controller extends BaseCo
  • 消息驱动通道适配器会在应用程序上下文启动后丢弃第一条消息,除非延迟调用 send

    我对 Spring Integration 配置进行了集成测试 该测试使用来自具有持久订阅的 JMS 主题的消息 为了进行测试 我使用 ActiveMQ 而不是 Tibco EMS 我遇到的问题是 我必须在测试方法开始时使用睡眠调用来延迟将