イベントが公開されるコードは、Spring @Transactional
注釈付きのメソッドで公開されています。@ TransactionalEventListenerメソッドが起動されない
@Override
@Transactional
public Task updateStatus(Integer taskId, ExecutionStatus newStatus) {
Task task = Task.builder().executionStatus(newStatus).build();
return updateStatusInternal(taskId, rteWithMetadata);
}
private TaskExecution updateStatusInternal(Integer taskId,
Task newStatus) {
Task task = taskService.findById(taskId);
TaskExecution te = task.getFirstExecution();
TaskExecution.ExecutionStatus oldStatus = te.getExecutionStatus();
TaskExecution.ExecutionStatus newStatus = newStatus.getExecutionStatus();
log.info(
"Task Execution status changed. Task id={}, from={}, to={}. Manual override : {}",
task.getId(), oldStatus, newStatus,
newStatus.isManualOverrideInitiated());
te.setExecutionStatus(newStatus);
if (te.getExecutionStatus() == ExecutionStatus.COMPLETED
|| te.getExecutionStatus() == ExecutionStatus.FAILED) {
te.setEndDate(DateTimeHelper.getUtcNow());
if (rte.isManualOverrideInitiated()) {
rte.setManualOverrideEndDate(DateTimeHelper.getUtcNow());
}
}
publisher.publishEvent(TaskStatusChanged.of(task, oldStatus, newStatus));
log.info("Published TaskStatusChanged event. task Id={}", task.getId());
// Send STOMP message
final Object payload = StompMessageHelper.getTaskExecutionUpdateMessage(task);
messageTemplate.convertAndSend(taskDestination(task), payload);
log.info("STOMP message for task status update sent. task Id={}",
task.getId());
return te;
}
@TransactionalEventListener
で注釈されたアプリケーションイベントのための対応するリスナーの方法があります。
@Async("changeEventExecutor")
@TransactionalEventListener(phase=TransactionPhase.AFTER_COMMIT)
public void taskStatusChanged(final TaskStatusChanged e) {
log.info("taskStatusChanged called");
}
問題はリスナーが私たちの生産ボックスの1つで解雇されていないという問題です。ローカルの開発環境では一貫してうまく動作しますが、プロダクションでは一貫して動作しません。
誰かがこの問題に早期に直面しましたか?私が考えることができる解決策は、手動でアプリケーションイベントを発生させることです。
注:私は既存の同様の投稿をチェックしました。私のシナリオが既存の投稿と一致しません。
'' ':
いずれの場合で、あなたは(私はあなたが生産ボックスを参照している知っているので、私は物事を試みることにあなたのオプションが何であるかわからないんだけど)以下と試みることができますupdateStatus''メソッドはコントローラによって呼び出されます。これは、 '' '' TransactionStatus'''メソッドが '' updateStatus'''メソッドに存在するため、 '' '' updateStatus'''が呼び出されたときに新しいトランザクションが作成されます。イベントはトランザクションの境界内で発生します。 –
updateStatusメソッド全体を投稿できますか? – alexbt
updateStatusメソッドのコードが追加されました。 –