Ho fatto alcuni test in un'app con cui sono stato coinvolto per un po 'di tempo, e sembra che parte del codice che abbiamo scritto stia causando una race condition.
Quello che sta succedendo è qualcosa di simile a questo:
//We make this call which resolves a task in a BPM service
//causing a process instance to flow to the next person/task
ServiceRemoteAPI.completeTask(taskId);
//We then make this call which depends on the complete resolution of the
//original call.
Tasks userTasks = ServiceRemoteAPI.tasksUserHasAvailable(nextUser);
//And we use those tasks to send an e-mail
for(Task task : userTasks){
if(task == rightTask){
sendEmail();
}
}
Il problema è che in alcuni casi la chiamata API remota originale non si sta risolvendo completamente prima di eseguire la seconda, e ciò sta causando un comportamento irregolare. Quindi stavo pensando di fare qualcosa del genere:
ServiceRemoteAPI.completeTask(taskId);
**Thread.sleep(5000);**
Tasks userTasks = ServiceRemoteAPI.tasksUserHasAvailable(nextUser);
for(Task task : userTasks){
if(task == rightTask){
sendEmail();
}
}
La domanda è, però, che non ho fatto molte discussioni prima, e sulla base delle mie ricerche questo sembra essere l'uso appropriato di Thread.sleep (), ma mi chiedo se ci sia qualcosa che mi manca, o se c'è un modo più robusto per realizzare ciò che mi piacerebbe ottenere qui.