Spring integration SpringWebFlux:测试WebClient服务器发送事件

Spring integration SpringWebFlux:测试WebClient服务器发送事件,spring-integration,ribbon,spring-webflux,server-sent-events,spring-cloud-function,Spring Integration,Ribbon,Spring Webflux,Server Sent Events,Spring Cloud Function,事实上,我甚至不确定是否可以做我想做的事情:我正在使用Spring Integration从代理(MQTT)消费一个事件流(event.class),并希望将该流转发到另一个微服务。这两个服务都应该是水平可伸缩的。因此,在另一个服务中,我有一个POST端点,它将Flux作为主体(使用Spring云函数:Spring云启动函数webflux)。在转发服务中,我想使用Ribbon和WebClient 到目前为止,我所做的(简化): @配置 公共类EventFlowConfiguration{ @自动

事实上,我甚至不确定是否可以做我想做的事情:我正在使用Spring Integration从代理(MQTT)消费一个事件流(
event.class
),并希望将该流转发到另一个微服务。这两个服务都应该是水平可伸缩的。因此,在另一个服务中,我有一个POST端点,它将
Flux
作为主体(使用Spring云函数:
Spring云启动函数webflux
)。在转发服务中,我想使用Ribbon和
WebClient

到目前为止,我所做的(简化):

@配置
公共类EventFlowConfiguration{
@自动连线
私人网络客户端网络客户端;
@豆子
public MessageProducerSupport inboundAdapter(){
最终MQTTPAHomeMessageDrivenChannelAdapter适配器=新的MQTTPAHomeMessageDrivenChannelAdapter(MqttAsyncClient.generateClientId(),this.mqttClientFactory,“/topic”);
setConverter(新的DefaultPaHomeMessageConverter());
返回适配器;
}
@豆子
发布者事件流(){
返回积分流
.from(inboundAdapter())
.handle((有效负载,标头)->this.eventHandler((字符串)有效负载))
.toReactivePublisher();
}
私有事件事件处理程序(字符串负载){
//正在分析,存储在数据库中。。。
返回事件;
}
@施工后
公共void setTrigger(){
buildTrigger(webClient,“/receiveEventStream”,eventFlow(),Event.class);
}
私有void buildTrigger(WebClient WebClient、字符串uri、发布者发布者、类eventClass){
网络客户
.post()
.uri(uri)
.contentType(MediaType.APPLICATION\u STREAM\u JSON)
.身体(
Flux.from(出版商)
.重试()
.map(消息::getPayload)
,
事件类
)
.retrieve()
.bodyToMono(无效等级)
.重试()
.subscribe();
}
}
我的问题是:

(1) 他们是否有机会测试这一点?我该怎么做?我想了解一下OkHttp,WireMock,测试中的一个内部spring引导应用程序,它有
/eventReceiverEndpoint
,但只做断言。然而,他并没有真正取得任何进展。事实上,我连一个错误都没有。我本来希望是4xx,因为启动时内存中没有服务器

(2) 这两个
retry()
调用是否真的在两侧重试连接问题?如果断开连接,我是否会释放消息?我如何测试它

(3) 在连接建立之后(比如当最终用户的负载达到较高水平时),Ribbon与这种长寿命流量相结合是否仍然能够进行负载平衡。我想它必须自动将通量重新连接到另一个实例

@Configuration
public class EventFlowConfiguration{ 

@Autowired
private Webclient webClient;

@Bean
public MessageProducerSupport inboundAdapter() {
    final MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter(MqttAsyncClient.generateClientId(), this.mqttClientFactory, "/topic");
    adapter.setConverter(new DefaultPahoMessageConverter());
    return adapter;
}

@Bean
Publisher<Message<Event>> eventFlow() {
    return IntegrationFlows
            .from(inboundAdapter())
            .handle((payload, header) -> this.eventHandler((String) payload))
            .toReactivePublisher();
}

private Event eventHandler(String payload) {
    // parsing, store in database ...
    return event;
}

@PostConstruct
public void setTrigger() {
    buildTrigger(webClient, "/receiveEventStream", eventFlow(), Event.class);
}

private <T, E extends Event> void buildTrigger(WebClient webClient, String uri, Publisher<Message<T>> publisher, Class<E> eventClass) {
    webClient
            .post()
            .uri(uri)
            .contentType(MediaType.APPLICATION_STREAM_JSON)
            .body(
                    Flux.from(publisher)
                            .retry()
                            .map(Message::getPayload)
                    ,
                    eventClass
            )
            .retrieve()
            .bodyToMono(Void.class)
            .retry()
            .subscribe();
}
}