Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法聚合消息,使用了错误的方法?_Java_Spring_Spring Integration - Fatal编程技术网

Java 无法聚合消息,使用了错误的方法?

Java 无法聚合消息,使用了错误的方法?,java,spring,spring-integration,Java,Spring,Spring Integration,我对Spring集成非常陌生。我不知道如何解决以下情况 我有两个通道为要发送到REST端点的最终消息生成两个关键数据段 轮询通道定期生成OAuth2令牌并发布(供此通道和其他通道使用) 文件监视通道产生有效负载(从文件加载有效负载的内容) 我需要将通道1的令牌添加到通道2的头中,类似下图: other channels __ Ch3 (uses token) subscribed to th

我对Spring集成非常陌生。我不知道如何解决以下情况

我有两个通道为要发送到REST端点的最终消息生成两个关键数据段

  • 轮询通道定期生成OAuth2令牌并发布(供此通道和其他通道使用)
  • 文件监视通道产生有效负载(从文件加载有效负载的内容)
  • 我需要将通道1的令牌添加到通道2的头中,类似下图:

                         other channels            __ Ch3 (uses token)
                         subscribed to the -->    /
                         publishing channel    --+ -- Ch4 (uses token)
                                              /   \__ Ch5 (uses token)
    Ch1 ==> getToken ==> enrich header & publ.
                                              \    Merge
                                               ==> Token &  ==> Send to endpoint
                                              /    Payload
    Ch2 ==>  readFile ==>  create new Payload
    
    我尝试使用聚合器,但我不确定关联策略或发布策略使用什么

    我的问题是:

  • 聚合器是未来的发展方向吗?(或者可能有另一种方法?)
  • 对关联/发布策略有何建议
  • 如有任何指示,将不胜感激

    以下是我目前掌握的情况:

    <!-- channels -->
    <int:channel id="aggregatedMsgOutChannel"/>
    
    <!-- Token messages are published to here -->
    <int:publish-subscribe-channel id="tokenInChannel" />
    
    <!-- Message Aggregator -->
    <int:aggregator
            id="messageAndOauthTokenAggregator"
            input-channel="tokenInChannel"
            message-store="simpleMessageStore"
            ref="oauthTokenAggregator"
            method="aggregate"
            output-channel="aggregatedMsgOutChannel">
     </int:aggregator>
    
     <!-- Define a store for our messages -->
     <bean id="simpleMessageStore" class="org.springframework.integration.store.SimpleMessageStore" />
    
    <bean id="oauthTokenAggregator" class="c.s.i.OauthTokenAggregator">
    
    
    
    OauthTokenAggregator.java

    @组件
    公共类OauthTokenAggregator{
    私有静态最终记录器log=LoggerFactory.getLogger(OauthTokenAggregator.class);
    @聚合器
    
    公共消息聚合(收集我认为您使用聚合器是正确的

  • 您应该为生成的令牌和文件内容选择一些公共属性。我很确定它一定在那里,否则如果没有聚合器或Spring集成,您将如何连接

  • 发布策略看起来非常简单——只有2个令牌和有效负载的大小

  • 聚合功能实际上只能根据作为有效负载的文件内容从一条消息生成一条消息。并将令牌放入另一条消息的头中。您可以通过有效负载类型或某个头来区分消息

  • 唯一的问题是我不知道您的业务逻辑,因此,我无法向您提供好的建议。也许您不应该使用单独的轮询通道适配器,而是使用文件进程生成令牌

    或者……如果令牌是单独生成的,并且可以在其他地方使用,则每个文件都可以从某个队列轮询令牌


    这是一个没有聚合器的变体。如果我们坚持使用聚合器,我们没有选择,除非在文件和令牌之间选择某种相关性。

    我最后使用了@Artem建议的方法:在文件进程中生成令牌

    主要实现的功劳来自于此。复制此处的代码以确保完整性(完全归功于文章作者)

    所以基本上

  • 我在第一个
    链中启动了文件进程,将其签入claim check-in并将其UUID放入我的头中

  • >P>而不是在中间使用代码>链< /代码>

    我去拿了一个令牌,并将它添加到我的头和

  • 继续到最后一个
    ,从索赔检查中获取有效负载并将其发布到REST端点

    
    

  • 谢谢您的建议。让我尝试在文件过程中生成令牌(可能是在链中?),然后我会报告我得到了多少;)您可以通过
    的子流生成令牌,并按预期填充到标头:
    @Component
    public class OauthTokenAggregator{
        private static final Logger log = LoggerFactory.getLogger(OauthTokenAggregator.class);
    
        @Aggregator
        public Message aggregate(Collection<Message<?>> messages) {
            log.debug("aggregating...");
    
            //.... Unsure as to how to fill this section
    
            return new GenericMessage("test");
        }
    }
    
    <int:chain input-channel="claim-check-in-channel"
               output-channel="processing-channel">
        <int:claim-check-in message-store="simpleMessageStore"/>
        <int:header-enricher>
            <int:header 
    
                name="#{T(com.l8mdv.sample.ClaimCheckGateway).CLAIM_CHECK_ID}"
                expression="payload"/>
        </int:header-enricher>
    </int:chain>
    
    <int:chain input-channel="processing-channel"
               output-channel="claim-check-out-channel">
        <int:service-activator expression="new String('different string')"/>
    </int:chain>
    
    <int:chain input-channel="claim-check-out-channel">
        <int:transformer
                expression="headers.get('#{T(com.l8mdv.sample.ClaimCheckGateway)
                .CLAIM_CHECK_ID}')"/>
        <int:claim-check-out message-store="simpleMessageStore"
                             remove-message="true"/>
    </int:chain>