问题标签 [spring-integration-http]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
415 浏览

spring - 如何处理 SI HttpRequestExecutingMessageHandler 中的“Transfer-Encoding=chunked”

我正在使用HttpRequestExecutingMessageHandler调用外部服务器。我正在使用 JSON 到对象转换器来转换 JSON 数据。但我收到以下异常。

原因:com.fasterxml.jackson.core.JsonParseException:非法字符((CTRL-CHAR,代码 31)):在 [Source: (String )"�</p>

当我检查标题时,我发现了以下内容。 传输编码=分块

这是异常日志的原因吗?

出站网关和 JsonToObjectTransformer 如下所示:

如果标头导致问题,我该如何处理响应?

注意:如果我直接使用邮递员访问外部服务器,我会得到 JSON 结构的响应。

我不知道这里出了什么问题。如果我使用如下简单的 restemplate 调用,它可以正常工作。

我能找到的一个区别是响应标头。这些在下面给出:

出站网关响应标头:- { Transfer-Encoding= chunked , http_requestMethod=GET, errorChannel=org.springframework.messaging.core.GenericMessagingTemplate$TemporaryReplyChannel@d8b195e, Server=nginx, Accept= / , Connection=keep-alive, User-Agent =PostmanRuntime/7.28.0, Host=localhost:8901, Accept-Encoding=gzip, deflate, br, http_statusCode=200 OK, Date=1622533072000, Authorization=Bearer token, replyChannel=org.springframework.messaging.core.GenericMessagingTemplate$TemporaryReplyChannel@d8b195e, Cache-Control=no-cache, ETag=W/"1009-5SzdL+uWyY6ZcMWht5dMtm2Sxlc" , Content-Encoding=gzip, http_requestUrl=http://inboundurl, id=be07fc8d-d478-5fa9-33e4-61a2b5f92468, Content-Length=207, contentType=application/json;charset=utf-8, Content-Type=application /json,requestFrom=CUSTOM_HEADER,时间戳=1622533092827}

正常的 restTemplate 调用响应头 [服务器:“nginx”,日期:“星期二,2021 年 6 月 1 日 07:34:54 GMT”,内容类型:“application/json; charset=utf-8”,内容长度:“4105”,连接:“ keep-alive",访问控制允许来源:"*",内容安全策略:"default-src 'self';base-uri 'self';block-all-mixed-content;font-src ' self' https: 数据:;frame-ancestors 'self';img-src 'self' 数据:;object-src 'none';script-src 'self';script-src-attr 'none';style-src' self' https: 'unsafe-inline';upgrade-insecure-requests", X-DNS-Prefetch-Control:"off", Expect-CT:"max-age=0", X-Frame-Options:"SAMEORIGIN" , Strict-Transport-Security:"max-age=15552000; includeSubDomains", X-Download-Options:"noopen",X-Content-Type-Options:"nosniff", X-Permitted-Cross-Domain-Policies:"none", Referrer-Policy:"no-referrer", X-XSS-Protection:"0", ETag:"W /"1009-llD9DqxYkEsjyikWajYk+16cb1k""]

有人可以帮忙吗?

0 投票
2 回答
156 浏览

java - 出站/入站之间的 Spring Integration 代码共享

想象一下,您有一个带有入站 HTTP 接口(使用 HTTP 是一项要求)的应用程序(我们称之为 B )。您将来会从其他几个不同的应用程序中调用它,但目前您只想开发一个客户端(我们称之为 A)。所以在A中,有一个出站HTTP网关:

是否可以共享代码,例如 HTTP API 定义,如路径(例如“/hello”)、方法(GET、POST、PUT ...),也许是这两个应用程序之间的参数/它们的类型/响应?如果是,如何?

我想使用Java DSL,但我看到了Http.inboundGateway("..")并且Http.outboundGateway("..")完全不同(例如类型),所以我不确定。理想情况下,我可以有类似的东西:

Api 定义可以想象如下(伪代码):

0 投票
1 回答
25 浏览

spring-integration - Spring 集成异步 Http 出站调用

我有一个要求,我必须在循环中使用不同的有效负载值对 http 端点进行 Http 出站调用,调用函数不必等待从出站调用收到的响应,所以基本上出站调用将异步发生一个循环。

有没有办法我们可以使用 Http.outboundGateway 来实现这一点

0 投票
1 回答
40 浏览

spring-boot - Spring Integration HttpOutbound 在从服务器接收到 http 标头 ETag: 1 时抛出触发 ErrorChannel

对不起,我错过了这个问题。

问题是 ETag 标头。

这是我向服务器发出 curl 请求时的标头响应。

这是堆栈跟踪:

这是我的示例代码,如果远程服务器以标头 ETag: 1 引发异常,则在将消息发送到通道“request.input”时激活服务。

0 投票
0 回答
25 浏览

spring - 使用 JDBC 的 Spring Integration 消息传递应用程序

我是 Spring 集成和消息传递通道的新手,请您帮助我处理 JDBC Spring 集成消息传递通道。

我创建了 3 个应用程序 Poller 、 Executor 和出站通道,但我很困惑这 3 个应用程序将如何通信和发送消息。

如何使用 .xml 从 xml 下方配置请求通道和回复通道IngrationFlow

我的代码 -

如何在上面的代码中配置请求通道和回复通道,并将有效负载发送到回复通道。

0 投票
1 回答
85 浏览

java - 如何在 Spring 集成中使用 JAVA 配置创建 http 入站通道适配器?

我有以下 http 入站通道适配器。如何使用 Java Config 或 Spring DSL 进行此配置?

0 投票
2 回答
568 浏览

java - 如何在 Spring Integration 中使用 JAVA 配置配置 http 入站通道适配器?

我发现了一个我不完全理解的 xml 配置的入站适配器示例。配置指定REST请求设置请求方法、消费格式等。

我认为从 Spring Integration 的角度来看,响应应该更重要,因为响应是真正提供消息通道的东西。我对吗?

HTTP 入站适配器用作消息端点(实际上是消息起点),它调用 HTTP 请求 - REST 服务的 URL,比如“http://myRest/transfer/next” - 向 SI 消息通道提供结果. 那正确吗?

要么很难找到一个例子,要么很难将其他例子转换成满足我需求的东西。更多的例子是 XML 配置的,而我想用 Java 或 Dsl 配置。

我正在寻找一个调用 REST 服务(我将提供)的示例,该服务返回TransferRequest我的对象​​的 JSON 表示,该对象被馈送到 SI 通道“transfer_next_channel”以由消息处理程序处理。

我的代码方法有点像骨架。我需要做什么?

编辑 1

整个过程是通过 TCP/IP 从持久 DB 状态生成一个人的数据消息到字符串消息。首先是需要什么信息的信息。它是通过外部 REST 服务提供的。结果是一个TransferRequest实体。由此必须生成消息:另一个外部 REST 服务调用以转换TransferRequest为某种DataMessage所需的数据消息。一旦 TCP/IP 客户端连接,该结果将通过 TCP/IP 服务器传递。

编辑 2

消息通道是:从对外部服务的请求“http://myRest/transfer/next”开始,获取TransferRequest(包含一个personId),将其作为消息推送到通道中,transformer/handler 以请求(另一个)外部服务“ http://myRest/message/{personId}",获取DataMessage,将其作为消息推送到另一个通道,处理程序将消息推送到 TcpOutboundGateway 以被外部系统接收。

0 投票
1 回答
64 浏览

java - 如何在运行时更改 Http 出站网关中的轮询频率?

我的场景是一个 Http 出站网关,我在其中向外部服务请求由TransferRequest实体表示的下一个转换。网关是“httpOutRequest”通道的端点。“httpOutRequest”通道的起点是一个 bean IntegrationFlow source(),我在其中发送由轮询器触发的空字符串消息。(顺便说一句:这有必要吗?我可以将轮询器直接添加到出站网关吗?如何?)

然后我安装了 errorHandler 通道端点来捕获任何问题。如果问题(异常)的数量是MAX_COUNT_TO_REDUCE_POLLING- 假设因为外部服务不可访问 - 那么我想在运行时将轮询从最初的 5_000 减少到 60_000。

到目前为止,这是我的代码:

当遇到异常数量的阈值时,如何减少运行时的轮询频率?

我怎么能停止集成流程?

编辑 1

更具体:如果我有消息传递网关

如何在第二个 Lambda 中访问 p?

如何设置p.fixedRate使用Control Channel

0 投票
1 回答
24 浏览

spring-integration - 当用作丰富器子流的一部分时,显示 Http.outboundGateway() 的错误

我有一个由 URL 配置错误引起的场景

显然这是过于做作了,但是如果misconfiguredUrl说不包括http://hostURL 的部分,这将导致 URL 失败。

我没有看到这个特定的错误爆发,但没有找到#jsonPath(...)失败。$[value]

在这种情况下,是否有一些配置可用于从 outboundGateway 记录错误?

编辑:

在评论交流之后,我意识到我已经 (1) 省略了处理“合法”404 错误 (2) 情况的端点配置,这样做发现我设置setReturnFailureExpressionResult了不正确的。

删除setReturnFailureExpressionResult设置更正了问题并显示了错误。

EDIT2:所以我很快就谈过了,并没有完全测试这一点。

虽然这显示了错误,但它不允许我专门捕获一种情况(404)并返回默认值,同时仍然允许其他调用正常失败并出现异常。

我可能不得不在这里重新考虑一下这种方法。

EDIT3:实现了一个自定义处理类

0 投票
1 回答
53 浏览

spring - PublishSubscribeChannel 中的错误处理

我正在使用 Spring Integration 使用 DSL 来处理 JMS 和 REST 服务之间的通信。要求是消息应该无限期地重新传递。在一种情况下,我必须顺序执行两个操作。如果第一个失败,则不应执行第二个,但如果是 4xx 错误,我不应该尝试重新传递它。我的代码如下所示:

我怎样才能满足这些要求?我唯一的想法是在提交 JMS 会话时以某种方式中断 IntegrationFlow。

感谢您的任何建议。

更新

选项 A: 目前:

  • 操作 1 失败并出现任何错误
  • 操作 2 未执行
  • 消息被不确定地重新传递

选项 B:我也可以处理 4xx 错误,然后:

  • 操作 1 以 4xx 失败,已处理异常
  • 执行操作 2
  • 集成流程正常完成,提交 JMS 会话并且未重新传递消息

但这会导致执行操作 2

我需要的是:

  • 操作 1 以 4xx 失败

  • 操作 2执行

  • 消息重新发送

更新 2

我想我可能会有所进展。正如@gary-russel 建议的那样,我添加了错误通道,并处理了 4xx 错误:

我只想处理 4xx 错误,其余的应该被传播并应该导致 JMS 消息重新传递。我尝试不设置defaultOutputChannelErrorMessageExceptionTypeRouter而不是引发另一个异常)或设置defaultOutputChannel为默认值errorChannel(而不是处理所有错误)。

更新 3

在以下位置找到解决方案:Spring Integration Java DSL using JMS retry/redlivery

这是我的错误处理流程的代码:

因此解决方案是将异常重定向到将通过重新抛出它们来处理它们的流。太糟糕BaseIntegrationFlow了,没有接受和抛出的方法Throwable- 现在只能通过指定要调用的 bean 和方法名称来实现。