Spring WebFlux Mono.block()即使未发生超时,也不会返回任何响应
在那里,我试图从我的Mongo存储库中获取Mono。但是,我的调试器在作为Mono对象从repo接收响应并对其应用block()后丢失 下面是详细的代码Spring WebFlux Mono.block()即使未发生超时,也不会返回任何响应,spring,spring-boot,spring-webflux,Spring,Spring Boot,Spring Webflux,在那里,我试图从我的Mongo存储库中获取Mono。但是,我的调试器在作为Mono对象从repo接收响应并对其应用block()后丢失 下面是详细的代码 private Map<String, Object> parameters(Bid bid,String tripId) { final Map<String, Object> parameters = new HashMap<>(); ShipperLoad shipperLoad = (
private Map<String, Object> parameters(Bid bid,String tripId) {
final Map<String, Object> parameters = new HashMap<>();
ShipperLoad shipperLoad = (ShipperLoad)bid.getLoad();
// getting supplier data from other service..
SupplierUserDTO supplier =
WebClient.
create("http://localhost:8888/XXXXXXXX/"+bid.getSupplierId())
.get()
.retrieve()
.bodyToMono(SupplierUserDTO.class)
.block();
TripInvoiceDetails tripInvoice = bidService.getInvoiceDetails(tripId).block();
parameters.put("load", shipperLoad);
parameters.put("bid", bid);
parameters.put("logo", getClass().getResourceAsStream(logo_path));
parameters.put("supplier", supplier);
parameters.put("invoice", tripInvoice);
return parameters;
}
私有映射参数(Bid-Bid、String-tripId){
最终映射参数=new HashMap();
ShipperLoad ShipperLoad=(ShipperLoad)bid.getLoad();
//正在从其他服务获取供应商数据。。
供应商用户到供应商=
网络客户端。
创建(”http://localhost:8888/XXXXXXXX/“+bid.getSupplierId())
.get()
.retrieve()
.bodytomino(SupplierUserDTO.class)
.block();
TripInvoiceDetails tripInvoice=bidService.getInvoiceDetails(tripId.block();
参数。放置(“装载”,shipperLoad);
参数。put(“投标”,投标);
parameters.put(“logo”,getClass().getResourceAsStream(logo_path));
参数。输入(“供应商”,供应商);
参数.put(“发票”,tripInvoice);
返回参数;
}
投标服务方式:
public Mono<TripInvoiceDetails> getInvoiceDetails(String tripId)
{
Mono<TripInvoiceDetails> invoice = tripInvoiceRepository.findByTripId(tripId);
return invoice;
}
公共Mono getInvoiceDetails(字符串tripId)
{
Mono invoice=tripInvoiceRepository.findByTripId(tripId);
退货发票;
}
存储库
public interface TripInvoiceRepository extends ReactiveMongoRepository<TripInvoiceDetails, String>{
Mono<TripInvoiceDetails> findByTripId(String tripId);
}
公共接口TripInvoiceRepository扩展了ReactiveMongoRepository{
Mono-findByTripId(字符串tripId);
}
控件在bidService.getInvoiceDetails(tripId.block()上丢失
TripInvoiceDetails.java
@资料
@单据(“发票”)
@诺尔格构装师
@AllArgsConstructor
公共类TripInvoiceDetails{
@身份证
字符串id;
字符串发票编号;
双倍发票金额;
双重发票金额GST;
ValueLabel packageType;
整数努弗尼茨;
值标签材料类型;
列出材料类型二级;
字符串hsnCode;
字符串收货人名称;
字符串地址;
串珠蛋白;
弦三角;
字符串传输ID;
字符串shipperName;
字符串loadId;
}
决心
try {
//pls don't remove futureData since. it is required to resolve futureData of Mono..
CompletableFuture<TripInvoiceDetails> futureData = tripInvoice.toFuture();
invoice = tripInvoice.toFuture().get();
} catch (Exception e) {
e.printStackTrace();
}
试试看{
//请不要删除futureData,因为它需要解析Mono的futureData。。
CompletableFutureData=tripInvoice.toFuture();
发票=tripInvoice.toFuture().get();
}捕获(例外e){
e、 printStackTrace();
}
谢谢大家宝贵的回复。最后,我得到了一个解决方案,我只是将.bock()方法分解成几个步骤,这意味着该方法执行了.block()方法的精确实现,而不是调用.block()。对我来说,这是可行的,可能前面案例中的块正在等待任何生产者,在本例中可能没有标记为生产者
try {
//pls don't remove futureData since. it is required to resolve futureData of Mono..
CompletableFuture<TripInvoiceDetails> futureData = tripInvoice.toFuture();
invoice = tripInvoice.toFuture().get();
} catch (Exception e) {
e.printStackTrace();
}
试试看{
//请不要删除futureData,因为它需要解析Mono的futureData。。
CompletableFutureData=tripInvoice.toFuture();
发票=tripInvoice.toFuture().get();
}捕获(例外e){
e、 printStackTrace();
}
您等了多久?可能默认超时很高。嗨,我让通话进行了1小时。在没有响应后,我强制完全终止它。我在这里添加屏幕截图。。没有控制台日志或错误记录在那里。请参阅添加的日志很多,问题解决,当我中断。block()语句插入,请参阅所附的代码段。。
try {
//pls don't remove futureData since. it is required to resolve futureData of Mono..
CompletableFuture<TripInvoiceDetails> futureData = tripInvoice.toFuture();
invoice = tripInvoice.toFuture().get();
} catch (Exception e) {
e.printStackTrace();
}