I did the following to make this issue gone. I am not quite certain that if every steps needed to be done or not.
1. I added a CountDownLatch in BlockingCommandBasedWSHumanTaskHandler and let my main thread to wait for it. In the GetCompletedTaskResponseHandler and GetResultContentResponseHandler handler I execute countDown based on the result to release the lock to ensure the response handler completed before I dispose the session in main thread.
2. I move the transaction scope to wrap my whole complete task logic.
3. I also find that it was triggering multiple callback to TaskCompletedHandler due to some reason. I partially fix that part.