侦探TraceId在Spring State Machine中丢失

时间:2020-06-24 12:46:31

标签: spring-boot spring-cloud-sleuth spring-statemachine

我正在努力解决有关Spring State Machine和Spring Cloud Sleuth的问题。发出事件以更改状态机的状态后,我再也看不到traceId。 traceId会迷路。

例如,我有一个只有三个状态的简单状态机:

@Configuration @EnableStateMachine
public class StateMachineConfiguration extends EnumStateMachineConfigurerAdapter<State, Event> {

    @Override
    public void configure(StateMachineStateConfigurer<State, Event> states) throws Exception {
        states
            .withStates()
            .initial(State.STARTED)
            .end(State.FINISHED)
            .states(EnumSet.allOf(State.class));
    }

    @Override
    public void configure(StateMachineTransitionConfigurer<State, Event> transitions) throws Exception {
        transitions
            .withExternal()
            .source(State.STARTED).target(State.PROCESSING)
            .event(Event.ANALYZE)
            .and()
            .withExternal()
            .source(State.PROCESSING).target(State.FINISHED)
            .event(Event.ANALYZE)
        ;
    }
}

以及带有日志的控制器方法以查看状态:

@RestController
public class StateMachineController {

    @Autowired
    private StateMachine<State, Event> stateMachine;

    @GetMapping
    public void stateMachineTest() {

        log.info("Invoking state machine.");

        stateMachine.start();
        log.info(" --- {} / traceId = {}", stateMachine.getUuid(), MDC.get("X-B3-TraceId"));

        stateMachine.sendEvent(Event.ANALYZE);
        log.info(" --- {} / traceId = {}", stateMachine.getUuid(), MDC.get("X-B3-TraceId"));

        stateMachine.sendEvent(Event.ANALYZE);
        log.info(" --- {} / traceId = {}", stateMachine.getUuid(), MDC.get("X-B3-TraceId"));
    }
}

访问此方法的结果是:

2020-06-24 17:54:49.212  INFO [spring-sm,c98b3d6a7a0eb04f,c98b3d6a7a0eb04f,false] 4156 --- [nio-8082-exec-1] b.c.l.pf.spring.sm.SpringSmApplication   : Invoking state machine.
2020-06-24 17:54:49.238  INFO [spring-sm,c98b3d6a7a0eb04f,c98b3d6a7a0eb04f,false] 4156 --- [nio-8082-exec-1] b.c.l.pf.spring.sm.SpringSmApplication   :  --- 41ac020d-5c25-4acd-b757-262c4491fcb7 / traceId = c98b3d6a7a0eb04f
2020-06-24 17:54:49.260  INFO [spring-sm,,,] 4156 --- [nio-8082-exec-1] b.c.l.pf.spring.sm.SpringSmApplication   :  --- 41ac020d-5c25-4acd-b757-262c4491fcb7 / traceId = null
2020-06-24 17:54:49.262  INFO [spring-sm,,,] 4156 --- [nio-8082-exec-1] b.c.l.pf.spring.sm.SpringSmApplication   :  --- 41ac020d-5c25-4acd-b757-262c4491fcb7 / traceId = null

我们可以看到在更改状态的第一个事件后traceId丢失了,我不知道发生了什么。我当前正在使用以下版本:

  • Spring Boot 1.5.21.RELEASE
  • Spring State Machine 2.2.0.RELEASE
  • Spring Cloud依赖关系 Edgware.RELEASE

对此有任何想法/建议吗?


几分钟前,我注意到 Spring Boot 2.2.2.RELEASE Spring Cloud Dependencies << strong> Hoxton.RELEASE 。上面的示例结果如下:

2020-06-24 09:38:52.781  INFO [spring-sm,e96c38b34cd805bd,e96c38b34cd805bd,false] 7008 --- [nio-8082-exec-1] b.c.l.pf.spring.sm.SpringSmApplication   : Invoking state machine.
2020-06-24 09:38:52.803  INFO [spring-sm,e96c38b34cd805bd,e96c38b34cd805bd,false] 7008 --- [nio-8082-exec-1] b.c.l.pf.spring.sm.SpringSmApplication   :  --- 69de87f9-738e-429a-8e07-8e465260301c started
2020-06-24 09:38:52.815  INFO [spring-sm,e96c38b34cd805bd,e96c38b34cd805bd,false] 7008 --- [nio-8082-exec-1] b.c.l.pf.spring.sm.SpringSmApplication   :  --- 69de87f9-738e-429a-8e07-8e465260301c in processing
2020-06-24 09:38:52.818  INFO [spring-sm,e96c38b34cd805bd,e96c38b34cd805bd,false] 7008 --- [nio-8082-exec-1] b.c.l.pf.spring.sm.SpringSmApplication   :  --- 69de87f9-738e-429a-8e07-8e465260301c finished

这里最大的问题是我现在无法将我的“真实项目”更新为Spring Boot 2。

任何想法或建议将不胜感激。预先感谢。

0 个答案:

没有答案