当前位置: 首页 > 知识库问答 >
问题:

正确的方式分裂,丰富项目,然后发送每个项目到另一个频道?

谷光誉
2023-03-14

这是正确的方式拆分一个项目列表,丰富每个项目,然后将这些丰富的项目发送到另一个频道吗?

this.sitePackage = new Package();
this.sitePackage.add(page1);
this.sitePackage.add(page2);
this.sitePackage.add(page3);

//Publish using gateway
this.publishingService.publish(sitePackage);
this.sitePackage.add(page1);
this.sitePackage.add(page1);

this.sitePackage.add(page2);
this.sitePackage.add(page2);

this.sitePackage.add(page3);
this.sitePackage.add(page3);
@Bean
IntegrationFlow flowPublishPackage()
{
    return flow -> flow
        .channel(this.publishPackageChannel())
        .<Package>handle((p, h) -> this.savePackage(p))
        .split(Package.class, this::splitPackage)
        .channel(this.publishPackageItemChannel());
}

@Bean
@PublishPackageChannel
MessageChannel publishPackageChannel()
{
    return MessageChannels.direct().get();
}

@Bean
@PublishPackageItemChannel
MessageChannel publishPackageItemChannel()
{
    return MessageChannels.direct().get();
}

@Splitter
List<PackageEntry> splitPackage(final Package bundle)
{
    final List<PackageEntry> enrichedEntries = new ArrayList<>();
    for (final PackageEntry entry : bundle.getItems())
    {
       enrichedEntries.add(entry);
    }

    return enrichedEntries;
}

@Bean
GatewayProxyFactoryBean publishingGateway()
{
    final GatewayProxyFactoryBean proxy = new GatewayProxyFactoryBean(PublishingService.class);
    proxy.setBeanFactory(this.beanFactory);
    proxy.setDefaultRequestChannel(this.publishPackageChannel());
    proxy.setDefaultReplyChannel(this.publishPackageChannel());
    proxy.afterPropertiesSet();
    return proxy;
}

接下来,CMS发布流被附加到publishPackageItem通道,并根据拆分后的类型,路由到特定的元素通道进行处理。拆分页面后,只有特定的元素类型才可能有订阅流。

@Inject
public CmsPublishFlow(@PublishPackageItemChannel final MessageChannel channelPublishPackageItem)
{
    this.channelPublishPackageItem = channelPublishPackageItem;
}

@Bean
@PublishPageChannel
MessageChannel channelPublishPage()
{
    return MessageChannels.direct().get();
}

@Bean
IntegrationFlow flowPublishContent()
{
    return flow -> flow
        .channel(this.channelPublishPackageItem)
        .filter(PackageEntry.class, p -> p.getEntry() instanceof Page)
        .transform(PackageEntry.class, PackageEntry::getEntry)
        .split(Page.class, this::traversePageElements)
        .<Content, String>route(Content::getType, mapping -> mapping
            .resolutionRequired(false)
            .subFlowMapping(PAGE, sf -> sf.channel(channelPublishPage()))
            .subFlowMapping(IMAGE, sf -> sf.channel(channelPublishAsset()))
            .defaultOutputToParentFlow());
    //.channel(IntegrationContextUtils.NULL_CHANNEL_BEAN_NAME);
}

最后,我的目标是订阅通道并相应地处理每个元素。我将此流订阅到ChannelPublishPage。每个订户可以不同地处理元素。

@Inject
@PublishPageChannel
private MessageChannel channelPublishPage;

@Bean
IntegrationFlow flowPublishPage()
{
    return flow -> flow
        .channel(this.channelPublishPage)
        .publishSubscribeChannel(c -> c
            .subscribe(s -> s
                .<Page>handle((p, h) -> this
                    .generatePage(p))));
}

共有1个答案

锺离逸春
2023-03-14

我不知何故觉得问题就在这里:

proxy.setDefaultRequestChannel(this.publishPackageChannel());
 proxy.setDefaultReplyChannel(this.publishPackageChannel());

请考虑不要对请求和等待答复使用相同的通道。这样你会带来一些循环和意想不到的行为。

 类似资料:
  • 将多个项目发送到paypal rest api的正确方式是什么?我已经阅读了文档和示例,据我所知: 申报交易 - 声明新项目列表 循环订单 - - 结束循环 添加项目到项目列表 添加项目列表到交易 添加到事务 这是我一直在玩的代码,以使这项工作,但我得到了通常的贝宝重定向错误,这是标准错误时,有些东西是不正确的付款。 我可以成功地发送一个单项使用金额和金额细节类,它只是添加多个项目,我正在努力。

  • 问题内容: 我正在做一个多模块项目。我们正在其他几个模块中的一个模块中使用appCtx.xml。 当前的问题是它们并不总是彼此同步。 当有人修改文件并构建项目时,就会发生这种情况,这样做的人可能会忘记将其复制到另一个模块,从而导致问题。 如何将src / main / resources中的appCtx.xml从项目A复制到项目B中的src / main / resources? 问题答案: 您可

  • 问题内容: 我有两个在android studio中制作的单独的android应用程序项目,我正在尝试将项目1合并到项目2中,以使其全部成为一个应用程序,我该怎么做呢?我知道如何在Eclipse中做到这一点,但在android studio中却不行。请注意,这两个项目都是android应用程序,都不是android库。 任何帮助都将是惊人的! 当我将项目1导入到项目模块中时,在生成成绩时出现此错误

  • 问题内容: 我有这样的目录/项目设置: Logger 是一个使用Gradle的Android库项目。 MyProject 是一个标准的Android项目项目,需要使用 Logger 库。 我正在使用Android Studio,并尝试将 Logger 添加到外部库中。尽管这在开发期间有效,但我收到有关在构建时找不到该类的消息。 我是Gradle的新手,但在 MyProject的 build.gra

  • 我正在构建一个定制的Java库。我把我的大部分“重复”代码都保存在那里,比如文件处理、字符串处理等。每次我想使用它们时,我都必须将该类复制并粘贴到我正在进行的其他项目中。有没有办法让这个自定义库类成为“依赖项”?我在用我的智能手机。

  • 我有两个独立的android应用程序项目,它们都是在android studio中制作的。我正在尝试将项目1合并到项目2中,使其成为一个应用程序。我该怎么做呢?我知道如何在eclipse中完成,但不知道如何在android studio中完成。请注意,这两个项目都是android应用程序,没有一个是android库。 任何帮助将是惊人的! 当我将项目1导入项目模块时,我在年级生成中遇到以下错误: