spring-cloud - 如何解决 java.lang.IllegalStateException: Only one connection receive subscriber allowed
问题描述
我使用spring-cloud-gateway搭建了网关服务,但是当服务接收到POST请求时,出现这个异常:“java.lang.IllegalStateException: Only one connection received subscriber allowed”。如何解决这个问题?下面是我的代码。谢谢你。
@Override
public GatewayFilter apply(Object config) {
return ((exchange, chain) -> {
URI uri = exchange.getRequest().getURI();
URI ex = UriComponentsBuilder.fromUri(uri).build(true).toUri();
ServerHttpRequest request = exchange.getRequest().mutate().uri(ex).build();
if ("POST".equalsIgnoreCase(request.getMethodValue())) {
Flux<DataBuffer> body = request.getBody();
AtomicReference<String> bodyRef = new AtomicReference<>(); //used for cache request body
//Cache request
body.subscribe(dataBuffer -> {
CharBuffer charBuffer = StandardCharsets.UTF_8.decode(dataBuffer.asByteBuffer());
DataBufferUtils.release(dataBuffer);
bodyRef.set(charBuffer.toString());
});
//generate bodyFlux
String bodyStr = bodyRef.get();
System.out.println(bodyStr);
DataBuffer bodyDataBuffer = stringBuffer(bodyStr);
Flux<DataBuffer> bodyFlux = Flux.just(bodyDataBuffer);
// generate request by bodyFlux
request = new ServerHttpRequestDecorator(request) {
@Override
public Flux<DataBuffer> getBody() {
return bodyFlux;
}
};
}
return chain.filter(exchange.mutate().request(request).build());
});
}
// Generated DataBuffer from String
protected DataBuffer stringBuffer(String value) {
byte[] bytes = value.getBytes(StandardCharsets.UTF_8);
NettyDataBufferFactory nettyDataBufferFactory = new NettyDataBufferFactory(ByteBufAllocator.DEFAULT);
DataBuffer buffer = nettyDataBufferFactory.allocateBuffer(bytes.length);
buffer.write(bytes);
return buffer;
}
解决方案
这看起来像以下问题:https ://github.com/spring-cloud/spring-cloud-gateway/issues/541
作为临时解决方法,您可以在应用程序中定义此 bean:
@Bean
public HiddenHttpMethodFilter hiddenHttpMethodFilter() {
return new HiddenHttpMethodFilter() {
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
return chain.filter(exchange);
}
};
}
这是从“Greenwich.M1”开始修复的。
推荐阅读
- c++ - Windows 系统还原点中请求者和写入者的使用
- javascript - 如何设置此 tinymce 的初始内容/值?
- drupal-7 - 需要解释 Icecast URL 身份验证
- reactjs - 无法访问axios
- javascript - 遍历 Chart.js 数据字段中的数组
- zabbix - 如何在 Zabbix 中计算一小时内 20% 的变化?
- highcharts - 如何使某些事件可点击或其他事件不在 Timeline Highchart 中?
- ruby-on-rails - 使用嵌套资源测试控制器
- graphql - 是否可以在 gremlin 中为整数类型保存空值
- mysql - 如何在SQL中查询当年月份的月份和天数?