Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.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 屏障组件在spring集成中是如何工作的?_Java_Spring Integration_Spring Integration Dsl - Fatal编程技术网

Java 屏障组件在spring集成中是如何工作的?

Java 屏障组件在spring集成中是如何工作的?,java,spring-integration,spring-integration-dsl,Java,Spring Integration,Spring Integration Dsl,我试图理解以下示例: 并使用JavaDSL重写它 首先,我想了解这个例子中发生了什么。我当然读过,但我还是不明白。 我在这里提问是因为我知道SI团队负责人(该示例的作者)回答了所有标记为spring集成的问题 服务器配置: <int-http:inbound-gateway request-channel="receiveChannel" path="/postGateway"

我试图理解以下示例:

并使用JavaDSL重写它

首先,我想了解这个例子中发生了什么。我当然读过,但我还是不明白。 我在这里提问是因为我知道SI团队负责人(该示例的作者)回答了所有标记为spring集成的问题

服务器配置:

<int-http:inbound-gateway request-channel="receiveChannel"
                            path="/postGateway"
                            error-channel="errorChannel"
                            supported-methods="POST"/>

    <int-http:inbound-gateway request-channel="createPayload"
                            path="/getGateway"
                            error-channel="errorChannel"
                            supported-methods="GET"/>

    <int:transformer input-channel="createPayload" output-channel="receiveChannel" expression="'A,B,C'" />

    <int:channel id="receiveChannel" />

    <int:header-enricher input-channel="receiveChannel" output-channel="processChannel">
        <int:header name="ackCorrelation" expression="headers['id']" />
    </int:header-enricher>

    <int:publish-subscribe-channel id="processChannel" />

    <int:chain input-channel="processChannel" order="1">
        <int:header-filter header-names="content-type, content-length" />
        <int:splitter delimiters="," />
        <int-amqp:outbound-channel-adapter amqp-template="rabbitTemplate"
            exchange-name="barrier.sample.exchange" routing-key="barrier.sample.key"
            confirm-ack-channel="confirmations"
            confirm-nack-channel="confirmations"
            return-channel="errorChannel"
            confirm-correlation-expression="#this"/>
    </int:chain>

    <!-- Suspend the HTTP thread until the publisher confirms are asynchronously received -->

    <int:barrier id="barrier" input-channel="processChannel" order="2"
        correlation-strategy-expression="headers['ackCorrelation']"
        output-channel="transform" timeout="10000" />

    <int:transformer input-channel="transform" expression="payload[1]" />

    <!-- Aggregate the publisher confirms and send the result to the barrier release channel -->

    <int:chain input-channel="confirmations" output-channel="release">
        <int:header-filter header-names="replyChannel, errorChannel" />
        <int:service-activator expression="payload" /> <!-- INT-3791; use s-a to retain ack header -->
        <int:aggregator>
            <bean class="org.springframework.integration.samples.barrier.AckAggregator" />
        </int:aggregator>
    </int:chain>

    <int:channel id="release" />

    <int:outbound-channel-adapter channel="release" ref="barrier.handler" method="trigger" />

    <!-- Consumer -> nullChannel -->

    <int-amqp:inbound-channel-adapter channel="nullChannel"
        queue-names="barrier.sample.queue"
        connection-factory="rabbitConnectionFactory" />

    <!-- Infrastructure -->

    <rabbit:queue name="barrier.sample.queue" auto-delete="true" />

    <rabbit:direct-exchange name="barrier.sample.exchange" auto-delete="true">
        <rabbit:bindings>
            <rabbit:binding queue="barrier.sample.queue" key="barrier.sample.key" />
        </rabbit:bindings>
    </rabbit:direct-exchange>
服务器接受该请求:

<int-http:inbound-gateway request-channel="receiveChannel"
                        path="/postGateway"
                        error-channel="errorChannel"
                        supported-methods="POST"
我不知道这里怎么用栅栏

从服务器端,一切都在部分工作-我看到队列中的消息(在rabbitMq web界面上),但从客户端,我开始看到以下stacktrace:

2019-08-28 22:38:43.432 ERROR 12936 --- [ask-scheduler-8] o.s.integration.handler.LoggingHandler   : org.springframework.messaging.MessageHandlingException: HTTP request execution failed for URI [http://localhost:8080/spring_integration_post]; nested exception is org.springframework.web.client.HttpServerErrorException$InternalServerError: 500 null, failedMessage=GenericMessage [payload=6, headers={id=36781a7f-3d4f-e17d-60e6-33450c9307e4, timestamp=1567021122424}]
    at org.springframework.integration.http.outbound.HttpRequestExecutingMessageHandler.exchange(HttpRequestExecutingMessageHandler.java:171)
    at org.springframework.integration.http.outbound.AbstractHttpRequestExecutingMessageHandler.handleRequestMessage(AbstractHttpRequestExecutingMessageHandler.java:289)
    at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:123)
    at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:169)
    at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:115)
    at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:132)
    at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:105)
    at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:73)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:453)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:401)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:187)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:166)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:47)
    at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:109)
    at org.springframework.integration.endpoint.SourcePollingChannelAdapter.handleMessage(SourcePollingChannelAdapter.java:234)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint.doPoll(AbstractPollingEndpoint.java:390)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint.pollForMessage(AbstractPollingEndpoint.java:329)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint.lambda$null$1(AbstractPollingEndpoint.java:277)
    at org.springframework.integration.util.ErrorHandlingTaskExecutor.lambda$execute$0(ErrorHandlingTaskExecutor.java:57)
    at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50)
    at org.springframework.integration.util.ErrorHandlingTaskExecutor.execute(ErrorHandlingTaskExecutor.java:55)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint.lambda$createPoller$2(AbstractPollingEndpoint.java:274)
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
    at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:93)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:264)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)
    at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: org.springframework.web.client.HttpServerErrorException$InternalServerError: 500 null
    at org.springframework.web.client.HttpServerErrorException.create(HttpServerErrorException.java:79)
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:124)
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:102)
    at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:778)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:736)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:710)
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:598)
    at org.springframework.integration.http.outbound.HttpRequestExecutingMessageHandler.exchange(HttpRequestExecutingMessageHandler.java:165)
    ... 30 more

这很简单;不清楚你不明白什么

  • 我们收到来自http的请求
  • 我们向消息添加一个相关头(头enricher)
  • 我们向rabbitmq发送3条消息
  • 我们需要等待确认-因此HTTP线程挂起在屏障中
  • 异步返回3个确认
  • 我们将响应聚合为一条消息(使用相关头)
  • 我们将该消息发送到释放HTTP线程的屏障
receiveChannel
是标题充实器的输入通道


您需要添加流来接收确认、聚合和触发屏障。

这非常简单;不清楚你不明白什么

  • 我们收到来自http的请求
  • 我们向消息添加一个相关头(头enricher)
  • 我们向rabbitmq发送3条消息
  • 我们需要等待确认-因此HTTP线程挂起在屏障中
  • 异步返回3个确认
  • 我们将响应聚合为一条消息(使用相关头)
  • 我们将该消息发送到释放HTTP线程的屏障
receiveChannel
是标题充实器的输入通道


您需要添加流以接收确认、聚合和触发屏障。

您需要添加另一个流以接收确认、聚合和触发屏障。确定。thx-高水平的图片是清楚的,但仍然有几个问题。1.让我们从enricher开始。正如您所看到的,我的enricher是硬编码的,应该以某种方式重写。A、B和C消息应该具有相同的correlationId(或ackCorrelationId)是否正确。2.据我所知,我必须以某种方式使用大量拆分的消息初始化屏障。我不知道怎么做我也更新了主题的最后一部分-请看一看。相关id必须是唯一的-这就是为什么我在预拆分消息中使用
id
标题作为相关id。是,标题将复制到拆分中。不聚合器处理拆分器向拆分添加的所有序列信息,默认的发布策略使用它来决定组何时完成。
>我还更新了主题的最后一部分-
为什么需要屏障?您的处理程序似乎没有执行生成需要等待的异步消息的操作。您需要添加另一个流来接收确认、聚合和触发屏障。确定。thx-高水平的图片是清楚的,但仍然有几个问题。1.让我们从enricher开始。正如您所看到的,我的enricher是硬编码的,应该以某种方式重写。A、B和C消息应该具有相同的correlationId(或ackCorrelationId)是否正确。2.据我所知,我必须以某种方式使用大量拆分的消息初始化屏障。我不知道怎么做我也更新了主题的最后一部分-请看一看。相关id必须是唯一的-这就是为什么我在预拆分消息中使用
id
标题作为相关id。是,标题将复制到拆分中。不聚合器处理拆分器向拆分添加的所有序列信息,默认的发布策略使用它来决定组何时完成。
>我还更新了主题的最后一部分-
为什么需要屏障?处理程序似乎没有执行生成需要等待的异步消息的操作。
<int:header-enricher input-channel="receiveChannel" output-channel="processChannel">
        <int:header name="ackCorrelation" expression="headers['id']" />
    </int:header-enricher>
<int:chain input-channel="processChannel" order="1">
        <int:header-filter header-names="content-type, content-length" />
        <int:splitter delimiters="," />
        <int-amqp:outbound-channel-adapter amqp-template="rabbitTemplate"
            exchange-name="barrier.sample.exchange" routing-key="barrier.sample.key"
            confirm-ack-channel="confirmations"
            confirm-nack-channel="confirmations"
            return-channel="errorChannel"
            confirm-correlation-expression="#this"/>
    </int:chain>
    @Bean
public IntegrationFlow integrationFlow() {
    return IntegrationFlows.from(Http.inboundGateway("/spring_integration_post")
            .requestMapping(m -> m.methods(HttpMethod.POST))
            .requestPayloadType(String.class))
            .enrich(enricherSpec -> {
                enricherSpec.header("correlationId", 1); //or ackCorrelationId ?
            })
            .split(s -> s.applySequence(false).get().getT2().setDelimiters(","))
            .log()
            //.barrier(1000L) is it correct place for barrier?
            .log()
            .handle(Amqp.outboundAdapter(amqpTemplate())
                    .exchangeName("barrierExchange")
                    .routingKey("barrierKey"))
            .get();
}
2019-08-28 22:38:43.432 ERROR 12936 --- [ask-scheduler-8] o.s.integration.handler.LoggingHandler   : org.springframework.messaging.MessageHandlingException: HTTP request execution failed for URI [http://localhost:8080/spring_integration_post]; nested exception is org.springframework.web.client.HttpServerErrorException$InternalServerError: 500 null, failedMessage=GenericMessage [payload=6, headers={id=36781a7f-3d4f-e17d-60e6-33450c9307e4, timestamp=1567021122424}]
    at org.springframework.integration.http.outbound.HttpRequestExecutingMessageHandler.exchange(HttpRequestExecutingMessageHandler.java:171)
    at org.springframework.integration.http.outbound.AbstractHttpRequestExecutingMessageHandler.handleRequestMessage(AbstractHttpRequestExecutingMessageHandler.java:289)
    at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:123)
    at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:169)
    at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:115)
    at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:132)
    at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:105)
    at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:73)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:453)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:401)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:187)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:166)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:47)
    at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:109)
    at org.springframework.integration.endpoint.SourcePollingChannelAdapter.handleMessage(SourcePollingChannelAdapter.java:234)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint.doPoll(AbstractPollingEndpoint.java:390)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint.pollForMessage(AbstractPollingEndpoint.java:329)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint.lambda$null$1(AbstractPollingEndpoint.java:277)
    at org.springframework.integration.util.ErrorHandlingTaskExecutor.lambda$execute$0(ErrorHandlingTaskExecutor.java:57)
    at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50)
    at org.springframework.integration.util.ErrorHandlingTaskExecutor.execute(ErrorHandlingTaskExecutor.java:55)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint.lambda$createPoller$2(AbstractPollingEndpoint.java:274)
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
    at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:93)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:264)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)
    at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: org.springframework.web.client.HttpServerErrorException$InternalServerError: 500 null
    at org.springframework.web.client.HttpServerErrorException.create(HttpServerErrorException.java:79)
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:124)
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:102)
    at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:778)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:736)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:710)
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:598)
    at org.springframework.integration.http.outbound.HttpRequestExecutingMessageHandler.exchange(HttpRequestExecutingMessageHandler.java:165)
    ... 30 more