问题描述
我需要在整个应用程序的日志中显示上下文值。 我尝试通过以下方法进行操作:“ searchStudents”,但未成功。似乎当执行“ .doOnComplete()”步骤时,subscriberContext丢失了,我需要替代方法。 有有人建议我吗?
控制器
@GetMapping(value = "{userId}/searchStudents")
public Flux<Student> searchStudents(
@modelattribute(USER_CONTEXT_REQUEST_ATTRIBUTE) Context userContext,@PathVariable String userId,@RequestParam String lang,@RequestParam String studentName) {
return coursesProvider.searchStudents(userId,lang,studentName).subscriberContext(userContext);
logUtils
public class LogUtils {
public static <T> Consumer<Signal<T>> logonNext(Consumer<T> logStatement) {
return signal -> {
if (!signal.isOnNext())
return;
Optional<String> teacherIdMaybe = signal.getContext().getorEmpty("TEACHER_ID");
if (teacherIdMaybe.isPresent()) {
try (MDC.MDccloseable teacherIdMdccloseable = MDC.putCloseable("TEACHER_ID",teacherIdMaybe.get())) {
logStatement.accept(signal.get());
}
} else {
logStatement.accept(signal.get());
};
};
}
}
服务
@Override
public Flux<Student> searchStudents(String userId,String lang,String studentName) {
AtomicInteger counter = new AtomicInteger();
return Mono.just(String.format(">>> Searching student named: %s. <<<",studentName))
.doOnEach(logonNext(LOGGER::info)) // well logged
.thenMany(webClient.get()
.uri(uriBuilder -> uriBuilder
.path("/v1/users/{userId}/courses/searchStudents/{lang}/{studentName}")
.build(userId,studentName))
.accept(APPLICATION_JSON)
.retrieve()
.bodyToFlux(Student.class)
.filter(Student::isEligible)
.doOnNext(p -> counter.incrementAndGet())
// this is the ligne that I need to change
.doOnComplete(() -> LOGGER.info("{} students found",counter.get()))
);
}
我的尝试:
- 返回字符串通量
.then(Mono.just(String.format(“找到%s个学生”,counter.get())) .doOnEach(logonNext(LOGGER :: info)))
- 没有日志
.doOnComplete(() -> Mono.just(String.format("%s students found",counter.get())) .doOnEach(logonNext(LOGGER::info)) .then() // no log .subscribe() // log without MDC )
- 每个计数都记录下来,我想要最终计数
.doOnEach(logonNext( x -> LOGGER.info("{} students found",counter.get()))
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)