Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在spring boot应用程序中关闭客户端sse连接_Java_Spring Boot_Webclient_Flux - Fatal编程技术网

Java 如何在spring boot应用程序中关闭客户端sse连接

Java 如何在spring boot应用程序中关闭客户端sse连接,java,spring-boot,webclient,flux,Java,Spring Boot,Webclient,Flux,我有一个spring启动应用程序,我必须使用SSE连接到一些外部服务。WebClient建立连接,然后我使用Flux读取响应。一切正常,但问题是连接保持打开状态,因为在第三方服务中,流程不是设计为每次都达到终点。我想作为客户端手动关闭连接,因为我知道此连接应该在何时完成。我该怎么做 建立连接: private Flux<ServerSentEvent<String>> connect(String accessToken) { TcpClient timeoutC

我有一个spring启动应用程序,我必须使用SSE连接到一些外部服务。WebClient建立连接,然后我使用Flux读取响应。一切正常,但问题是连接保持打开状态,因为在第三方服务中,流程不是设计为每次都达到终点。我想作为客户端手动关闭连接,因为我知道此连接应该在何时完成。我该怎么做

建立连接:

private Flux<ServerSentEvent<String>> connect(String accessToken) {
    TcpClient timeoutClient = createTimeoutClient();
    ReactorClientHttpConnector reactorClientHttpConnector = new ReactorClientHttpConnector(HttpClient.from(timeoutClient));
    String url = npzServerBaseUrl+uniqueCodePath;
    WebClient client = WebClient
            .builder()
            .clientConnector(reactorClientHttpConnector)
            .defaultHeader(HttpHeaders.AUTHORIZATION, Naming.TOKEN_PREFIX + accessToken)
            .baseUrl(url)
            .build();

    ParameterizedTypeReference<ServerSentEvent<String>> type
            = new ParameterizedTypeReference<ServerSentEvent<String>>() {};
    return client.get()
            .retrieve()
            .onStatus(HttpStatus::is4xxClientError, clientResponse -> {
                String msg = "Error from server: "+clientResponse.statusCode().toString();
                        //invalidate access token
                        if (clientResponse.statusCode().value()==401) {
                            //remove invalid token and connect again
                            loginContext.invalidToken(accessToken);
                            return Mono.error(new InvalidNpzToken(msg));
                        }
                        return Mono.error(new IllegalStateException(msg));
                    }
            )
            .onStatus(HttpStatus::is5xxServerError, clientResponse ->
                    Mono.error(new IllegalStateException("Error from server: "+clientResponse.statusCode().toString()))
            )
            .bodyToFlux(type);
}

private TcpClient createTimeoutClient() {
    return TcpClient.create()
            .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, SECONDS*1000)
            .option(EpollChannelOption.TCP_USER_TIMEOUT, SECONDS*1000)
            .doOnConnected(
                    c -> c.addHandlerLast(new ReadTimeoutHandler(SECONDS))
                            .addHandlerLast(new WriteTimeoutHandler(SECONDS)));
}
弹簧靴:

<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
org.springframework.boot
spring启动程序父级
2.1.1.1发布

eventStream.subscribe()
返回一个
reactor.core.Disposable


您可以在其上调用
dispose()
,以取消订阅和基础资源。

谢谢。我实际上是在阅读这种方法的文档,但不是一直读到最后一行:)
import io.netty.channel.ChannelOption;
import io.netty.channel.epoll.EpollChannelOption;
import io.netty.handler.timeout.ReadTimeoutHandler;
import io.netty.handler.timeout.WriteTimeoutHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.client.reactive.ReactorClientHttpConnector;
import org.springframework.http.codec.ServerSentEvent;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.netty.http.client.HttpClient;
import reactor.netty.tcp.TcpClient;
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>