【发布时间】: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 中,因此我必须在流程中创建订单。
我需要调用 http 出站网关进行身份验证以获取该会话 ID。我如何从入站网关调用此出站,因为这应该在每次调用其他端点之前执行。
在我获得该会话 ID 后,我希望其他端点通过 Rest,在此阶段,我希望调用 ICallFlow 网关,以便基于 json 中的值和步骤 1 中的会话 ID,我可以调用其他 REST 端点并获得响应。
所以,我被困在将会话 ID 令牌从第一次调用传递到第二次调用?另外,我希望 ICallFlow 仅在第一个身份验证请求完成后才被调用,并将该会话传递给其他后续请求。我读到标头丰富器可以做到这一点,我可以将有效负载放入标头中,但不知何故它不起作用。另外,我不确定如何以正确的顺序创建上述流程。
任何帮助将不胜感激。
【问题讨论】: