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

如何在Spring集成中从网关发送响应

齐泰
2023-03-14

我遵循下面的示例来实现spring集成网关。

问题:无法从服务激活器发送的网关上获得响应。

  1. 网关应答通道是"最佳应答通道"。
  2. 服务激活器写入同一个通道。

所有的自定义方法都被执行,响应被组成,但是从来没有被发送出去。知道这里缺少什么吗?我的配置在流程中也有一个分散收集。

<!--Gateway:-->
<channel id="bestQuoteResponseChannel"/>
<gateway id="loanBrokerGateway"
        default-request-channel="loanRequestsChannel"
        service-interface="org.springframework.integration.samples.loanbroker.LoanBrokerGateway">
    <method name="getBestLoanQuote" reply-channel="bestQuoteResponseChannel">
        <header name="RESPONSE_TYPE" value="BEST"/>
    </method>
</gateway>

<chain input-channel="loanRequestsChannel">
    <header-enricher>
        <header name="creditScore" expression="@creditBureau.getCreditReport(payload).score"/>
    </header-enricher>
    <recipient-list-router apply-sequence="true">
        <recipient selector-expression="headers.creditScore > 800" channel="exclusiveBankChannel"/>
        <recipient selector-expression="headers.creditScore > 750" channel="premiereBankChannel"/>
        <recipient selector-expression="headers.creditScore > 700" channel="qualityBankChannel"/>
        <recipient selector-expression="headers.creditScore > 650" channel="friendlyBankChannel"/>
        <recipient channel="easyBankChannel"/>
    </recipient-list-router>
</chain>

<!-- Messages are sent to the banks via bank channels and will be received and processed by an aggregator -->

<aggregator input-channel="loanQuotesChannel" output-channel="input" method="aggregateQuotes">
    <beans:bean class="org.springframework.integration.samples.loanbroker.LoanQuoteAggregator"/>
</aggregator>

<service-activator ref="findBestQuoteService" method="findBestQuote" input-channel="input" output-channel="bestQuoteResponseChannel"/>

共有2个答案

宗政安歌
2023-03-14

在spring集成流将应答发送到网关之前,我已经在spring集成流中进行了分散收集。这在某种程度上阻止了它向网关发送响应。

所做的更改:我用发布-订阅通道聚合器组合替换了散点-收集组件。

https://docs.spring.io/spring-integration/docs/5.3.0.M1/reference/html/scatter-gather.html#scatter-聚集命名空间

广瑞
2023-03-14

首先,在这种情况下,网关上不需要回复通道,因此服务激活器上也不需要输出通道。所有的应答逻辑都应该落在replyChannel头上,当网关方法被调用时,它总是由框架填充。

很高兴看到你的找到了什么样的TestQuoteService。findBestQuote已经为我们做了一切,因为LoanQuoteAggregator已经为我们做了一切:

/**
 * Aggregates LoanQuote Messages to return a single reply Message.
 *
 * @param quotes list of loan quotes received from upstream lenders
 * @param responseType header that indicates the response type
 * @return the best {@link LoanQuote} if the 'RESPONSE_TYPE' header value is 'BEST' else all quotes
 */
public Object aggregateQuotes(List<LoanQuote> quotes,
        @Header(value="RESPONSE_TYPE", required=false) String responseType) {
    Collections.sort(quotes);
    return ("BEST".equals(responseType)) ? quotes.get(0) : quotes;
}

那么,你以后的定制服务有什么意义呢?

还可以考虑打开org.springframework.integration类别的DEBUG级别,以查看您的消息是如何传输的。可能我们也会在日志中看到一些问题。

我不知道你的逻辑怎么会丢失replyChannel头,但我们需要更多信息来调查。

 类似资料:
  • 我正在使用spring云网关作为边缘服务器。这就是流程 问题是,响应有响应是得到正确的200代码,注入的头是在响应上出现,但数据是不可用的响应。

  • 我试图使用Spring Integration和HTTP出站网关组合一个非常简单的HTTP POST示例。 我需要能够发送带有一些POST参数的HTTP POST消息,就像使用: 如果向接口方法发送一个简单的作为参数,我可以让它工作(没有POST参数),但我需要发送一个pojo,其中pojo的每个属性都成为POST参数。 我有以下SI配置: 我的接口如下所示: 我的类如下所示: 我为此搜索了大量的

  • 我计划将Razorpay支付网关集成到我的客户网站中,该网站已在WordPress中开发,其中的场景如下。 用户将填写他的需求查询表。 然后根据客户的要求,业主将回复成本和一些代码给客户(通过移动/电子邮件通信)。 客户将在网站的支付页面提交表单(姓名,金额,代码为备注和电子邮件ID),该表单将重定向到支付网关页面。 在WordPress网站上,该插件(Razorpay Quick Payment

  • 文档在控制台中的操作非常清楚,https://docs.aws.amazon.com/apigateway/latest/developerguide/integrating-api-with-aws-services-s3.html,但在CDK中复制真的很痛苦。 我的问题是如何在CDK中创建一个以s3(中间没有lambda)为支持的RESTAPI,或者至少如何创建apigateway。AWS整合

  • 这是我的第一个问题。 我的Web应用程序正在使用Spring集成来获取第三方API响应。 响应具有以“X-”开头的自定义标头值。X值是两个。(X-AccessToken-Quota-Allotted,X-AccessToken-Quota-Flow) 因此,我在config xml的header-mapper中添加了inboundHeaderNames,如下所示。 以下是回应。我可以看到X-Acc

  • 我使用Spring与的集成调用Spring数据Rest URL。 我的调用是对已知资源URL的简单HTTP GET(在我的例子中是“Examples”)。 我想这是引用配置,但我不知道这个警告是否与问题相关。 这是用包含要调用的REST url的消息调用该出站通道: 调用很好,我有一个HTTP状态代码200;这是response.getPayload(): 如果我在浏览器上使用GET直接转到该UR