|
| 1 | +usingDtmcli.DtmImp; |
| 2 | +usingDtmCommon; |
| 3 | +usingDtmSample.Dtos; |
| 4 | +usingDtmworkflow; |
| 5 | +usingMicrosoft.AspNetCore.Mvc; |
| 6 | +usingMicrosoft.Extensions.Logging; |
| 7 | +usingMicrosoft.Extensions.Options; |
| 8 | +usingSystem; |
| 9 | +usingSystem.Net.Http; |
| 10 | +usingSystem.Net.Http.Headers; |
| 11 | +usingSystem.Text; |
| 12 | +usingSystem.Text.Json; |
| 13 | +usingSystem.Threading; |
| 14 | +usingSystem.Threading.Tasks; |
| 15 | + |
| 16 | +namespaceDtmSample.Controllers |
| 17 | +{ |
| 18 | +[ApiController] |
| 19 | +[Route("/api")] |
| 20 | +publicclassWfTestController:ControllerBase |
| 21 | +{ |
| 22 | + |
| 23 | +privatereadonlyILogger<WfTestController>_logger; |
| 24 | +privatereadonlyWorlflowGlobalTransaction_globalTransaction; |
| 25 | +privatereadonlyAppSettings_settings; |
| 26 | + |
| 27 | +publicWfTestController(ILogger<WfTestController>logger,IOptions<AppSettings>optionsAccs,WorlflowGlobalTransactiontransaction) |
| 28 | +{ |
| 29 | +_logger=logger; |
| 30 | +_settings=optionsAccs.Value; |
| 31 | +_globalTransaction=transaction; |
| 32 | +} |
| 33 | + |
| 34 | +[HttpPost("wf-simple")] |
| 35 | +publicasyncTask<IActionResult>Simple(CancellationTokencancellationToken) |
| 36 | +{ |
| 37 | +try |
| 38 | +{ |
| 39 | +varwfName=$"wf-simple-{Guid.NewGuid():N}"; |
| 40 | + |
| 41 | +_globalTransaction.Register(wfName,async(wf,data)=> |
| 42 | +{ |
| 43 | +varcontent=newByteArrayContent(data); |
| 44 | +content.Headers.ContentType=newMediaTypeHeaderValue("application/json"); |
| 45 | + |
| 46 | +varoutClient=wf.NewBranch().NewRequest(); |
| 47 | +awaitoutClient.PostAsync(_settings.BusiUrl+"/TransOut",content); |
| 48 | + |
| 49 | +varinClient=wf.NewBranch().NewRequest(); |
| 50 | +awaitinClient.PostAsync(_settings.BusiUrl+"/TransIn",content); |
| 51 | + |
| 52 | +returnnull; |
| 53 | +}); |
| 54 | + |
| 55 | +varreq=JsonSerializer.Serialize(newTransRequest("1",-30)); |
| 56 | + |
| 57 | +await_globalTransaction.Execute(wfName,Guid.NewGuid().ToString("N"),Encoding.UTF8.GetBytes(req),true); |
| 58 | + |
| 59 | +returnOk(TransResponse.BuildSucceedResponse()); |
| 60 | +} |
| 61 | +catch(Exceptionex) |
| 62 | +{ |
| 63 | +_logger.LogError(ex,"Workflow Error"); |
| 64 | +returnOk(TransResponse.BuildFailureResponse()); |
| 65 | +} |
| 66 | +} |
| 67 | + |
| 68 | +[HttpPost("wf-saga")] |
| 69 | +publicasyncTask<IActionResult>Saga(CancellationTokencancellationToken) |
| 70 | +{ |
| 71 | +try |
| 72 | +{ |
| 73 | +varwfName=$"wf-saga-{Guid.NewGuid():N}"; |
| 74 | + |
| 75 | +_globalTransaction.Register(wfName,async(wf,data)=> |
| 76 | +{ |
| 77 | +varcontent=newByteArrayContent(data); |
| 78 | +content.Headers.ContentType=newMediaTypeHeaderValue("application/json"); |
| 79 | + |
| 80 | +WfPhase2FuncoutRbFunc=async bb=> |
| 81 | +{ |
| 82 | +varrbClient=wf.NewRequest(); |
| 83 | +awaitrbClient.PostAsync(_settings.BusiUrl+"/TransOutRevert",content); |
| 84 | +}; |
| 85 | +varoutClient=wf.NewBranch().OnRollback(outRbFunc).NewRequest(); |
| 86 | +awaitoutClient.PostAsync(_settings.BusiUrl+"/TransOut",content); |
| 87 | + |
| 88 | +WfPhase2FuncinRbFunc=async bb=> |
| 89 | +{ |
| 90 | +varrbClient=wf.NewRequest(); |
| 91 | +awaitrbClient.PostAsync(_settings.BusiUrl+"/TransInRevert",content); |
| 92 | +}; |
| 93 | +varinClient=wf.NewBranch().OnRollback(inRbFunc).NewRequest(); |
| 94 | +awaitinClient.PostAsync(_settings.BusiUrl+"/TransIn",content); |
| 95 | + |
| 96 | +returnnull; |
| 97 | +}); |
| 98 | + |
| 99 | +varreq=JsonSerializer.Serialize(newTransRequest("1",-30)); |
| 100 | + |
| 101 | +await_globalTransaction.Execute(wfName,Guid.NewGuid().ToString("N"),Encoding.UTF8.GetBytes(req),true); |
| 102 | + |
| 103 | +returnOk(TransResponse.BuildSucceedResponse()); |
| 104 | +} |
| 105 | +catch(Exceptionex) |
| 106 | +{ |
| 107 | +_logger.LogError(ex,"Workflow Saga Error"); |
| 108 | +returnOk(TransResponse.BuildFailureResponse()); |
| 109 | +} |
| 110 | +} |
| 111 | + |
| 112 | +[HttpPost("wf-saga-rollback")] |
| 113 | +publicasyncTask<IActionResult>SagaRollBack(CancellationTokencancellationToken) |
| 114 | +{ |
| 115 | +try |
| 116 | +{ |
| 117 | +varwfName=$"wf-saga-rollback-{Guid.NewGuid():N}"; |
| 118 | + |
| 119 | +_globalTransaction.Register(wfName,async(wf,data)=> |
| 120 | +{ |
| 121 | +varcontent=newByteArrayContent(data); |
| 122 | +content.Headers.ContentType=newMediaTypeHeaderValue("application/json"); |
| 123 | + |
| 124 | +WfPhase2FuncoutRbFunc=async bb=> |
| 125 | +{ |
| 126 | +varrbClient=wf.NewRequest(); |
| 127 | +awaitrbClient.PostAsync(_settings.BusiUrl+"/TransOutRevert",content); |
| 128 | +}; |
| 129 | +varoutClient=wf.NewBranch().OnRollback(outRbFunc).NewRequest(); |
| 130 | +varresp=awaitoutClient.PostAsync(_settings.BusiUrl+"/TransOutError",content); |
| 131 | + |
| 132 | +varex=awaitUtils.RespAsErrorCompatible(resp); |
| 133 | +if(ex!=null)throwex; |
| 134 | + |
| 135 | +returnnull; |
| 136 | +}); |
| 137 | + |
| 138 | +varreq=JsonSerializer.Serialize(newTransRequest("1",-30)); |
| 139 | + |
| 140 | +await_globalTransaction.Execute(wfName,Guid.NewGuid().ToString("N"),Encoding.UTF8.GetBytes(req),true); |
| 141 | + |
| 142 | +returnOk(TransResponse.BuildSucceedResponse()); |
| 143 | +} |
| 144 | +catch(Exceptionex) |
| 145 | +{ |
| 146 | +_logger.LogError(ex,"Workflow Saga Error"); |
| 147 | +returnOk(TransResponse.BuildFailureResponse()); |
| 148 | +} |
| 149 | +} |
| 150 | + |
| 151 | +[HttpPost("wf-tcc")] |
| 152 | +publicasyncTask<IActionResult>Tcc(CancellationTokencancellationToken) |
| 153 | +{ |
| 154 | +try |
| 155 | +{ |
| 156 | +varwfName=$"wf-tcc-{Guid.NewGuid():N}"; |
| 157 | + |
| 158 | +_globalTransaction.Register(wfName,async(wf,data)=> |
| 159 | +{ |
| 160 | +varcontent=newByteArrayContent(data); |
| 161 | +content.Headers.ContentType=newMediaTypeHeaderValue("application/json"); |
| 162 | + |
| 163 | +WfPhase2FuncoutRbFunc=async bb=> |
| 164 | +{ |
| 165 | +varclient=wf.NewRequest(); |
| 166 | +awaitclient.PostAsync(_settings.BusiUrl+"/TransOutCancel",content); |
| 167 | +}; |
| 168 | + |
| 169 | +WfPhase2FuncoutCmFunc=async bb=> |
| 170 | +{ |
| 171 | +varclient=wf.NewRequest(); |
| 172 | +awaitclient.PostAsync(_settings.BusiUrl+"/TransOutConfirm",content); |
| 173 | +}; |
| 174 | + |
| 175 | +varoutClient=wf.NewBranch().OnRollback(outRbFunc).OnCommit(outCmFunc).NewRequest(); |
| 176 | +awaitoutClient.PostAsync(_settings.BusiUrl+"/TransOutTry",content); |
| 177 | + |
| 178 | +WfPhase2FuncinRbFunc=async bb=> |
| 179 | +{ |
| 180 | +varclient=wf.NewRequest(); |
| 181 | +awaitclient.PostAsync(_settings.BusiUrl+"/TransInCancel",content); |
| 182 | +}; |
| 183 | + |
| 184 | +WfPhase2FuncinCmFunc=async bb=> |
| 185 | +{ |
| 186 | +varclient=wf.NewRequest(); |
| 187 | +awaitclient.PostAsync(_settings.BusiUrl+"/TransInConfirm",content); |
| 188 | +}; |
| 189 | + |
| 190 | +varinClient=wf.NewBranch().OnRollback(inRbFunc).OnCommit(inCmFunc).NewRequest(); |
| 191 | +awaitinClient.PostAsync(_settings.BusiUrl+"/TransInTry",content); |
| 192 | + |
| 193 | +returnnull; |
| 194 | +}); |
| 195 | + |
| 196 | +varreq=JsonSerializer.Serialize(newTransRequest("1",-30)); |
| 197 | + |
| 198 | +await_globalTransaction.Execute(wfName,Guid.NewGuid().ToString("N"),Encoding.UTF8.GetBytes(req),true); |
| 199 | + |
| 200 | +returnOk(TransResponse.BuildSucceedResponse()); |
| 201 | +} |
| 202 | +catch(Exceptionex) |
| 203 | +{ |
| 204 | +_logger.LogError(ex,"Workflow Tcc Error"); |
| 205 | +returnOk(TransResponse.BuildFailureResponse()); |
| 206 | +} |
| 207 | +} |
| 208 | + |
| 209 | +[HttpPost("wf-tcc-rollback")] |
| 210 | +publicasyncTask<IActionResult>TccRollBack(CancellationTokencancellationToken) |
| 211 | +{ |
| 212 | +try |
| 213 | +{ |
| 214 | +varwfName=$"wf-tcc-rollback-{Guid.NewGuid():N}"; |
| 215 | + |
| 216 | +_globalTransaction.Register(wfName,async(wf,data)=> |
| 217 | +{ |
| 218 | +varcontent=newByteArrayContent(data); |
| 219 | +content.Headers.ContentType=newMediaTypeHeaderValue("application/json"); |
| 220 | + |
| 221 | +WfPhase2FuncoutRbFunc=async bb=> |
| 222 | +{ |
| 223 | +varclient=wf.NewRequest(); |
| 224 | +awaitclient.PostAsync(_settings.BusiUrl+"/TransOutCancel",content); |
| 225 | +}; |
| 226 | + |
| 227 | +WfPhase2FuncoutCmFunc=async bb=> |
| 228 | +{ |
| 229 | +varclient=wf.NewRequest(); |
| 230 | +awaitclient.PostAsync(_settings.BusiUrl+"/TransOutConfirm",content); |
| 231 | +}; |
| 232 | + |
| 233 | +varoutClient=wf.NewBranch().OnRollback(outRbFunc).OnCommit(outCmFunc).NewRequest(); |
| 234 | +varresp=awaitoutClient.PostAsync(_settings.BusiUrl+"/TransOutTryError",content); |
| 235 | + |
| 236 | +if((int)resp.StatusCode>=400) |
| 237 | +{ |
| 238 | +thrownewDtmFailureException(); |
| 239 | +} |
| 240 | + |
| 241 | +returnnull; |
| 242 | +}); |
| 243 | + |
| 244 | +varreq=JsonSerializer.Serialize(newTransRequest("1",-30)); |
| 245 | + |
| 246 | +await_globalTransaction.Execute(wfName,Guid.NewGuid().ToString("N"),Encoding.UTF8.GetBytes(req),true); |
| 247 | + |
| 248 | +returnOk(TransResponse.BuildSucceedResponse()); |
| 249 | +} |
| 250 | +catch(Exceptionex) |
| 251 | +{ |
| 252 | +_logger.LogError(ex,"Workflow Tcc Error"); |
| 253 | +returnOk(TransResponse.BuildFailureResponse()); |
| 254 | +} |
| 255 | +} |
| 256 | +} |
| 257 | +} |