Saga branch rollback retry in tm will cause null NullPointerException because StateMachineEngineHolder can not get getStateMachineEngine
- [x] I have searched the issues of this repository and believe that this is not a duplicate.
Ⅰ. Issue Description
I use spring-seata-saga in seata-sample repo, when saga transaction begin to retry, tm receive branchRollback request. StateMachineEngineHolder.getStateMachineEngine() will return null
Ⅱ. Describe what happened
If there is an exception, please attach the exception trace:
2025-01-13 21:57:11.729 [rpcDispatch_RMROLE_1_3_40] ERROR io.seata.saga.rm.SagaResourceManager - StateMachine forward failed, xid: 169.254.134.222:8091:72665187015102548
java.lang.NullPointerException: null
at io.seata.saga.rm.SagaResourceManager.branchCommit(SagaResourceManager.java:89)
at org.apache.seata.rm.AbstractRMHandler.doBranchCommit(AbstractRMHandler.java:98)
at org.apache.seata.rm.AbstractRMHandler$1.execute(AbstractRMHandler.java:54)
at org.apache.seata.rm.AbstractRMHandler$1.execute(AbstractRMHandler.java:50)
at org.apache.seata.core.exception.AbstractExceptionHandler.exceptionHandleTemplate(AbstractExceptionHandler.java:127)
at org.apache.seata.rm.AbstractRMHandler.handle(AbstractRMHandler.java:50)
at org.apache.seata.rm.DefaultRMHandler.handle(DefaultRMHandler.java:61)
at org.apache.seata.core.protocol.transaction.BranchCommitRequest.handle(BranchCommitRequest.java:35)
at org.apache.seata.rm.AbstractRMHandler.onRequest(AbstractRMHandler.java:150)
at org.apache.seata.core.rpc.processor.client.RmBranchCommitProcessor.handleBranchCommit(RmBranchCommitProcessor.java:63)
at org.apache.seata.core.rpc.processor.client.RmBranchCommitProcessor.process(RmBranchCommitProcessor.java:58)
at org.apache.seata.core.rpc.netty.AbstractNettyRemoting.lambda$processMessage$2(AbstractNettyRemoting.java:280)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:834)
Ⅲ. Describe what you expected to happen
tm retry success
Ⅳ. How to reproduce it (as minimally and precisely as possible)
- make spring-seata-saga retry fail (compensate fail)
Ⅴ. Anything else we need to know?
Ⅵ. Environment:
- JDK 11
- Seata client/server version: 2.4 (use 2.x branch)
history saga-spring decoupling cause not incompatible.because spring needs to be decoupled, spring-based injection is not desirable.
should use StateMachineEngineHolder.setStateMachineEngine(stateMachineEngine); instead it .
the same question
java.lang.NullPointerException: Cannot invoke "io.seata.saga.engine.StateMachineEngine.reloadStateMachineInstance(String)" because the return value of "io.seata.saga.rm.StateMachineEngineHolder.getStateMachineEngine()" is null
at io.seata.saga.rm.SagaResourceManager.branchRollback(SagaResourceManager.java:135) ~[seata-all-2.5.0.jar:2.5.0]
at org.apache.seata.rm.AbstractRMHandler.doBranchRollback(AbstractRMHandler.java:131) ~[seata-all-2.5.0.jar:2.5.0]
at org.apache.seata.rm.AbstractRMHandler$2.execute(AbstractRMHandler.java:71) ~[seata-all-2.5.0.jar:2.5.0]
beacause the org.apache.seata.rm.AbstractRMHandler.doBranchRollback called io.seata.saga.rm.SagaResourceManager.branchRollback the package is different
some pics when debug:
the class in org.apache.seata is covered by the class in io.seata.saga