【问题标题】:Response Message passing between multiple Outbound gateway calls over Rest Api通过 Rest Api 在多个出站网关调用之间传递响应消息
【发布时间】:2018-02-13 20:38:17
【问题描述】:

我有一个通过 Rest 接收消息的入站网关。收到的所有消息都进入内部网关。下面是入站网关 xml 文件。

 <bean name="testConfig" class="test.TestApiConfiguration"/>
    <context:annotation-config/>

    <int-http:inbound-gateway request-channel="requestChannel" supported-methods="POST" path="/data" reply-channel="replyChannel"
                              request-payload-type="com.test.model.CallFlow" header-mapper="cc20InBoundHeaders" error-channel="errorChannel" reply-timeout="9000">
        <int-http:request-mapping produces="application/json" consumes="application/json"/>
    </int-http:inbound-gateway>

    <bean id="cc20InBoundHeaders" class="org.springframework.integration.http.support.DefaultHttpHeaderMapper">
        <property name="inboundHeaderNames" value="*"/>
    </bean>

    <bean id="cc20OutBoundHeaders" class="org.springframework.integration.http.support.DefaultHttpHeaderMapper">
        <property name="outboundHeaderNames" value="Content-Type, HTTP_REQUEST_HEADERS"/>
        <property name="userDefinedHeaderPrefix" value="" />
    </bean>

因此,入站网关消息以 Json 的形式正确到达,然后内部网关接受它们,消息按照配置传递到通道中。

@MessagingGateway(name="callFlowGateway", requestChannel = "callFlowRequestChannel")
public interface ICallFlow {

    /**
     * Process CallFlow Request
     * @param message SI Message covering APiCall payload and relevant headers for service
     */
    @Gateway
    void processCallFlowRequest(Message<CallFlow> message);

}

到这里为止,它按预期工作。消息流向过滤器,然后是路由器。在 Router 中,如果一个 json 属性的类型是“drink”服务,则调用饮料通道并调用相关的出站网关以通过 REST 请求外部 API 端点。

但在调用该外部 API 的每个其余端点之前,您需要有一个有效的会话 id 令牌才能访问其他端点。它在其有效负载中返回一个会话 id 以调用其他端点除此之外,它将 application/x-www-form-urlencoded 作为标头中的内容类型。 我创建了一个转换器来创建身份验证服务请求。

@MessageEndpoint               
public class AuthenticateTransformer {

    @Transformer(inputChannel = "splitterChannel", outputChannel = "authenticateRequestChannel")
    public Message<?> transform(CallFlow callFlow) {

        Map<String, Object> messagePayload = new HashMap<String, Object>();
        messagePayload.put("user", "test");
        messagePayload.put("password", "test");
        return MessageBuilder.withPayload(messagePayload).setHeader("Content-Type", "application/x-www-form-urlencoded").build();
        }
}

因此,理想情况下,呼入网关- Json 被转换为内部对象。基于 JSON 中的一个属性值,我使用 http 出站网关调用不同的外部休息端点。

由于获取会话 ID 的身份验证调用不在接收到的 Json 中,因此我必须在流程中创建订单。

  1. 我需要调用 http 出站网关进行身份验证以获取该会话 ID。我如何从入站网关调用此出站,因为这应该在每次调用其他端点之前执行。

  2. 在我获得该会话 ID 后,我希望其他端点通过 Rest,在此阶段,我希望调用 ICallFlow 网关,以便基于 json 中的值和步骤 1 中的会话 ID,我可以调用其他 REST 端点并获得响应。

所以,我被困在将会话 ID 令牌从第一次调用传递到第二次调用?另外,我希望 ICallFlow 仅在第一个身份验证请求完成后才被调用,并将该会话传递给其他后续请求。我读到标头丰富器可以做到这一点,我可以将有效负载放入标头中,但不知何故它不起作用。另外,我不确定如何以正确的顺序创建上述流程。

任何帮助将不胜感激。

【问题讨论】:

    标签: spring-integration


    【解决方案1】:

    你在一个线程中的信息太多了,它在某种程度上令人困惑和误导。

    我可以建议你像ContentEnricher:https://docs.spring.io/spring-integration/docs/5.0.1.RELEASE/reference/html/messaging-transformation-chapter.html#payload-enricher

    因此,您将通过 request-channel 子流调用该身份验证服务,获取会话 ID,并能够将其填充到标头或 ICallFlow 有效负载中(如果可能的话)。

    您应该小心在 @Transformer 用例中使用 MessageBuilder。那个之后不会合并请求标头,您将无法在开始时对&lt;int-http:inbound-gateway&gt; 做出响应,因为replyChannel 标头将丢失。

    携带请求头的方式就像在transform()方法中接受一个Message并在MessageBuilder上调用copyHeaders()

    【讨论】:

    • 谢谢阿特姆。我同意它在同一线程上的信息太多。哪个部分令人困惑?当消息(json)到达入站网关时,如何调用出站网关(获取会话 ID)?当消息到达 Inbound 时,它会转到具有 Message 消息的内部网关 ICallFlow,并且从第一个经过身份验证的呼叫传递的消息负载不是 CallFlow 类型。我希望我能解释这个问题。
    • 好吧,首先让我们看看我的回答是否为您的任务提供了一些线索!
    • 我尝试使用它,它可以工作,但由于问题上下文中的调用顺序,我没有使用它。我设法在 bean 中编写了一个简单的 http 客户端实现,它创建了在入站网关上首次调用所需的会话令牌。从那里开始,对外部服务的 subsequest REST 调用发生。正如您所说,您可以使用转换器丢失消息标头。我将 ServiceActivators 用于请求构造消息,该消息调用出站网关以使用 Rest 访问外部服务端点。我猜,对于每个请求构造,服务激活器可能都过大了。
    • 因此,我设法通过填充标头(使用的 httpclient,以及从有效负载,填充的会话令牌)将会话令牌从一个请求传递到另一个请求。现在,对于一个功能用例,我有 4 次对外部服务的 Rest 调用。例如,我认为
    • 很高兴听到您有解决方案。您的所有其他问题都需要单独的 SO 线程
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多