Open naturallight opened 5 years ago
需要与 Reactive 框架的 执行 集成 TTL @naturallight
RxJava
的集成Reactor
的集成下面的Reactor
的集成:
Reactor
自己的Scheduler
是Work的。reactor-netty
所实现(应该主要是实现的Scheduler
),目前看起来不能被Reactor
的Schedulers.addExecutorServiceDecorator
Hook到。所以,虽然这个Demo
实现OK,但对于reactor-netty
不Work。
要确认Reactor
正确的Hook实现方式。
下面这个集成 是不对的,运行不对;要确认Reactor
正确的Hook实现方式。
看了示例,加入了Hooks这段逻辑后,运行用例会报这样的异常:
java.lang.ExceptionInInitializerError
at org.springframework.web.reactive.function.client.DefaultWebClientBuilder.build(DefaultWebClientBuilder.java:212)
at org.springframework.web.reactive.function.client.WebClient.create(WebClient.java:134)
at com.aksk.webfluxdemo.Log4j2Test.testLogWithWebClient(Log4j2Test.java:49)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: java.lang.ClassCastException: com.aksk.webfluxdemo.Log4j2Test$1 cannot be cast to reactor.core.publisher.Mono
at reactor.core.publisher.Mono.onAssembly(Mono.java:4282)
at reactor.core.publisher.Mono.error(Mono.java:261)
at org.springframework.web.reactive.function.client.DefaultWebClient.<clinit>(DefaultWebClient.java:70)
... 25 more
是的。 这个Hook
实现 不行(出异常),尝试探索中(Work In Process
) 😄 @naturallight
需要找到 像RxJava
的Hook方式:
把 传递入Flux
的Lambda
,通过统一的Runnable
方式 来 Wrap成 TtlRunnable
。
是的。 这个
Hook
实现 不行(出异常),尝试探索中(Work In Process
) 😄 @naturallight需要找到 像
RxJava
的Hook方式:把 传递入
Flux
的Lambda
,通过统一的Runnable
方式 来 Wrap成TtlRunnable
。
请教一下找到这种hook方式了么
TTL
最新版本2.12.6
中直接使用TtlWrappers#wrapConsumer
可以。我自己测试可以
WebClient.create().method(HttpMethod.POST)
.uri(URI.create("http://127.0.0.1:8013/api/flow/test/a"))
.accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON)
.retrieve().bodyToMono(Map.class)
.subscribe(TtlWrappers.wrapConsumer((map) -> {
try {
Thread.sleep(ThreadLocalRandom.current().nextInt(0,50));
} catch (InterruptedException e) {
e.printStackTrace();
}
if (!Objects.equals(SampleController.LOCAL.get(), num)) {
System.out.println("aaaaaaaaaaa");
}
}));
num
为SampleController
放置的threadLocal
值 @guyeu
样例代码如下:
log4j2.xml配置如下:
输出入下:
其中,reactor-http-nio-X应该是netty的线程,期望在第二次发请求时,记录的requestid为2。然而现状是,只有在主线程中记录了2,调用webclient后仍然记录的是第一次的requestid