spring-integration并行分割路由聚合流由于单向MessageHandler而失败

2024-04-15

我想通过拆分项目、将每个项目路由到适当的网关并聚合结果来并行处理项目列表。但是,我的应用程序无法启动,出现以下错误:

BeanCreationException: The 'currentComponent' ... is a one-way 'MessageHandler' 
and it isn't appropriate to configure 'outputChannel'. 
This is the end of the integration flow.

这是一个示例流定义,它说明了行为:

@Bean
public IntegrationFlow parallelSplitRouteAggregateFlow() {
    return IntegrationFlows
            .from(Http.inboundGateway("/trigger"))
            .handle(message -> Arrays.asList(1, 2, 3))
            .split()
            .channel(MessageChannels.executor(Executors.newCachedThreadPool()))
            .<Integer, Boolean>route(o -> o % 2 == 0, m -> m
                    .subFlowMapping(true, oddFlow())
                    .subFlowMapping(false, evenFlow()))
            .aggregate()
            .get();
}

@Bean
public IntegrationFlow oddFlow() {
    return flow -> flow.<Integer>handle((payload, headers) -> "odd");
}

@Bean
public IntegrationFlow evenFlow() {
    return flow -> flow.<Integer>handle((payload, headers) -> "even");
}

我见过错误“是 Spring 集成聚合器 DSL 的单向“MessageHandler” https://stackoverflow.com/questions/40725701/error-is-a-one-way-messagehandler-for-spring-integration-aggregator-dsl,但那里的解决方案不适用于此处,我没有登录 handle() 方法。 我还尝试将 .defaultOutputToParentFlow() 添加到映射定义中,因为咖啡馆示例使用了它,但这也没有什么区别。

我应该提到的是,这是带有 spring-boot 2.0.1 版本的 spring-integration 5.0.4。


你的问题在这里:

.handle(message -> Arrays.asList(1, 2, 3))

如果您使用内联实现,它看起来像:

.handle(new MessageHandler() {

        @Override
        public void handleMessage(Message<?> message) throws MessagingException {
            Arrays.asList(1, 2, 3);
        }
})

注意void返回类型。由于没有什么可以返回,因此也没有什么可以发送到下游 -is a one-way 'MessageHandler'.

要解决您的问题,您需要执行以下操作:

 .handle((p, h) -> Arrays.asList(1, 2, 3))

这相当于:

.handle(new GenericHandler<Object>() {

        @Override
        public Object handle(Object p, Map<String, Object> h) {
            return Arrays.asList(1, 2, 3);
        }
})

实际上我的想法是说我的变体,例如:

这给了我一些暗示,表明我做错了什么。

UPDATE

工作代码:

@Bean
public IntegrationFlow parallelSplitRouteAggregateFlow() {
    return IntegrationFlows
            .from(Http.inboundGateway("/trigger"))
            .handle((p, h) -> Arrays.asList(1, 2, 3))
            .split()
            .channel(MessageChannels.executor(Executors.newCachedThreadPool()))
            .<Integer, Boolean>route(o -> o % 2 == 0, m -> m
                    .subFlowMapping(true, sf -> sf.gateway(oddFlow()))
                    .subFlowMapping(false, sf -> sf.gateway(evenFlow())))
            .aggregate()
            .get();
}

@Bean
public IntegrationFlow oddFlow() {
    return flow -> flow.<Integer>handle((payload, headers) -> "odd");
}

@Bean
public IntegrationFlow evenFlow() {
    return flow -> flow.<Integer>handle((payload, headers) -> "even");
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring-integration并行分割路由聚合流由于单向MessageHandler而失败 的相关文章

随机推荐

  • 在 Material-ui React 中处理多个菜单项

    Please help me with this multiple menu handling events I have dynamic menus and its corresponding menuitems in a json I
  • 在Python中,整数除法中向零舍入的好方法是什么?

    1 2 gives 0 正如它应该 然而 1 2 gives 1 但我希望它向 0 舍入 即我希望 1 2 为 0 无论它是正数还是负数 最好的方法是什么 进行浮点除法 然后转换为 int 不需要额外的模块 Python 3 gt gt g
  • 由于接口方法只是公共的,如何强制执行私有方法?

    接口可用于强制方法实现 但它们需要是公共的 如果我想强制执行私有方法怎么办 更新 这不是为了阻止调用 而是为了确保私有方法已被实现 所以我不想使用接口本身 我想将某种编码风格强加给团队 根据定义 接口始终是公共的 强制实施受保护 外部私有
  • 如何在类中使用 lambda 作为方法?

    这就是我想做的 class BaseClass object successify lambda x
  • 为什么 Google Cloud Endpoints 不支持简单对象返回类型?

    我的大多数方法都会返回字符串 整数 布尔值等 我敢打赌这对 99 的开发人员来说都是如此 当然我们有时会返回复杂的对象 数组等 但大多数时候会返回更简单的东西 为什么 Cloud Endpoints 不支持此功能 谢谢 因此 有一些返回 简
  • 如何从 JavaScript 访问 ASPxTextBox 的值

    假设我有一个 id 为 instrument 的 DevExpress ASPxTextBox 我想访问客户端文本框的值 所以我需要写一个javascript 如果它是一个普通的 asp 文本框 我可以通过编写如下代码来访问该文本框var
  • 当我将区域性添加到文件名时,我的全局资源设计器文件为空

    我正在编写一个支持多语言的 ASP NET Web 应用程序 我想将一个名为 GlobalStrings 的资源添加到 App GlobalResources 文件中 当我将文件命名为 GlobalStrings resx 时 一切都很好
  • 测试 React 组件:Jest 遇到意外标记

    我尝试用 Jest 进行测试 但出现错误 Jest 遇到意外令牌 这通常意味着您正在尝试导入 Jest 无法解析的文件 例如它不是普通的 JavaScript 我有一个照片库应用程序 每当我单击图像时 就会弹出一个带有图像的模式 我想测试当
  • Gitlab Pipeline 失败“远程:HTTP Basic:访问被拒绝”

    我是 Gitlab Pipelines 的新手 想为我的一个 Python 项目设置一个 我将 docker GitLab runner 容器与此配置文件一起使用 version 3 services runner container na
  • Yii 将数据库连接限制为只读

    我有两个数据库连接 一个用于大部分应用程序数据 另一个仅用于读取 虽然我可以将我的数据库用户帐户设置为仅允许读取 但还有其他人管理该系统 并且我希望在应用程序级别上有一些冗余 以绝对防止使用 Yii 的标准 ActiveRecord 类进行
  • ggplot2 按组密度曲线下的阴影面积

    我有这个数据框 set seed 1 x lt c rnorm 50 mean 1 rnorm 50 mean 3 y lt c rep site1 50 rep site2 50 xy lt data frame x y 我做了这个密度图
  • Android 布局、绘图和分辨率,最好的方法是什么?

    我想开发屏幕分辨率 854 480 800 480 480 320 正确的 res 结构是什么 1 drawable 854x480 drawable 800x480 drawable 480x320 layout 854x480 layo
  • 尝试在 React 项目上运行 npm build 时出错

    我正在尝试通过 VPS Ubuntu 和 Nginx 部署我的应用程序 但这个错误不断出现 在 vs code 上它工作正常 知道我该如何继续吗 谢谢 gt email protected cdn cgi l email protectio
  • VB.NET中有条件三元运算符吗?

    在 Perl 和其他语言 中 条件三元运算符可以表示如下 my foo bar buz cat dog VB NET中有类似的运算符吗 取决于版本 这IfVB NET 2008 中的运算符是三元运算符 以及空合并运算符 这是刚刚推出的 20
  • 如何将Processing核心库与Maven一起使用?

    我想在我的 Maven 项目中使用处理库 但我找不到任何依赖项 我在哪里可以得到它 Edit 从处理 3 开始 官方文物 https mvnrepository com artifact org processing core发布到 Mav
  • Laravel 5.6 Passport OAuth 最大登录尝试次数

    我刚刚使用 Laravel Passport 创建了一个简单的 OAuth 系统 该系统将负责外部应用程序的用户注册和身份验证 一切都按我的预期进行 现在我想实现一种机制 在预定义的失败登录尝试次数后锁定用户 我是 Laravel 和 Pa
  • 如何跟踪同一函数的多次运行?

    我有一个这样的函数 function run arg if window alreadyRun init window alreadyRun true more code 你明白了 我想弄清楚这是否是第一次调用函数 有一个更好的方法吗 不使
  • QT画一个圆[重复]

    这个问题在这里已经有答案了 我正在学习 QT 有一个简单的问题 画一个半径为 r 中心点为 x y 的圆的最佳方法是什么 Thanks In a paintEvent用这个 http doc qt io qt 4 8 qpainter ht
  • 如何防止mysql重置自动增量值?

    我有一个表来制作临时 id s 当我删除表中的所有行时 该表的自动增量值将重置为 0 但我不想重置自动增量 我能做些什么 Compare 截断表 http dev mysql com doc refman 5 5 en truncate t
  • spring-integration并行分割路由聚合流由于单向MessageHandler而失败

    我想通过拆分项目 将每个项目路由到适当的网关并聚合结果来并行处理项目列表 但是 我的应用程序无法启动 出现以下错误 BeanCreationException The currentComponent is a one way Messag