AW08 Spring Integration

delivery变成integration

大致思路:

aw07中的delivery不再作为微服务的一部分(去掉discovery和gateway配置)

pos-cart中添加发送消息的部分;发送的消息有load,字符串(与aw08样例中直接get不同);添加接收

pos-delivery 保持不变

Tech Solution

  • pos-order

替换成改写demo中的inbound/outbound

inboud:处理发送来的post请求,提取string信息,调用placeOrder函数进行中间处理转换

1
2
3
4
5
6
inboundGateway(uri)
.requestMapping(r -> r.methods(Https.POST)
.consumes("text/plain"))
.<String>handle((s)-> return placeOrder(s))
.requestPayloadType(String.class)
.get();

中间处理ref

outbound:向pos-delivery发送post请求

1
2
3
4
outboundGateway((Message<String> r)->r.getPayload())
.httpMethod(Https.POST)
.expectedResponseType(Boolean.type)
.get();

#注释 初步 handle是具体的处理函数,可以做简单的处理

method改动

  • pos-delivery:

    普通的网页应用 rest架构,参数使用和测试方法参考

    1
    curl -d "orderInfo=3|CityA" http://localhost:8086/delivery/

    采用了RequestParam

  • pos-cart

image-20220621094639379

提问:post传递参数和url中携带参数的不同?

Reference:

consumes

outboundGateway加参数

code ref1 ref2

outbound中使用的流的类型BaseHttpMessageHandlerSpec

搜索关键词:intergrationflows inbound post

pos-order inbound 接收参数,

在函数中额外指定input/outputChannelxml配置

  • 引入channel配置

AbstractApplicationContext context = new ClassPathXmlApplicationContext(xmlfile in resource,claassName);

  • 对inbound channel配置

https://stackoverflow.com/questions/50108253/http-outbound-gateway-post-with-payload

测试 curl -X POST -d “orderInfo=3|CityA” http://localhost:8085/order 在暂时删除掉inbound中的处理函数的情况下
-d 是json的意思
curl -H “Content-Type:text/plain” -X POST -d ‘p1|p2|addr:CityA’ http://localhost:8085/order 明确是发送字符串

Obstacles:

  • 直接访问样例中的外部服务无问题,但是运行时出现:
1
GenericMessage [payload=Each hair in Chuck Norris's beard contributes to make the world's largest DDOS., headers={Transfer-Encoding=chunked, http_requestMethod=GET, errorChannel=org.springframework.messaging.core.GenericMessagingTemplate$TemporaryReplyChannel@3be35f5c, Server=cloudflare, Connection=keep-alive, http_statusCode=200 OK, Date=1653960361000, Via=1.1 vegur, accept=*/*, replyChannel=org.springframework.messaging.core.GenericMessagingTemplate$TemporaryReplyChannel@3be35f5c, host=localhost:8080, http_requestUrl=http://localhost:8080/check, id=35b1eb39-4b71-13c7-c14e-9a360c5a757e, contentType=application/json;charset=UTF-8, user-agent=curl/7.47.0, timestamp=1653960361139}]

与外部服务链接无问题 如果需要查看其中的信息可能需要指定gateway,指定errorChannel并提取信息

解决: 中间的打印实际上消耗了流中的数据 因此去掉打印的代码即可

  • 设计上的不足 head的模式 类型不匹配——用json改写所有看看

how to find api I need:

search spring integration directly:搜索出来的结果和demo并不相似,更像老师的hello-world例子,即显式调用channel发送消息,样例中的服务本质并不是独立服务而是一个java类中的方法

直接搜索demo中调用的方法,查看api doc;然后搜素是否可能用该api传递post中的参数

利用xml是配置的好方式尤其是使用了默认的channel的时候,但是对于代码阅读不是很直观,可以参考stackoverflow和github搜索到的代码样例中的api

Thoughts

inbound outbound作为接口 和之前接收http request的方法比更加简洁,体现了流式了处理,可以把更多的精力放在中间处理函数上(因为之前在http request上花费了时间)借用更加稳定的架构