2016-08-31 10 views
1

イベントが公開されるコードは、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つで解雇されていないという問題です。ローカルの開発環境では一貫してうまく動作しますが、プロダクションでは一貫して動作しません。

誰かがこの問題に早期に直面しましたか?私が考えることができる解決策は、手動でアプリケーションイベントを発生させることです。

注:私は既存の同様の投稿をチェックしました。私のシナリオが既存の投稿と一致しません。

答えて

0

私はSpring's javadocから来ていると考えることができる唯一のこと:イベントは、管理 トランザクションの境界内で公開されていない場合fallbackExecution() フラグが明示的に設定されていない限り、

、イベントは破棄されます。トランザクションが実行されている場合、そのイベントはTransactionPhaseに従って処理された です。

トランザクションが実行されていない可能性がありますか?私は、あなたのコードサンプルが完全ではないと仮定します。そのため、イベントが発生したときや、それらの行に沿った何らかのトランザクションがロールバックされている可能性があります。

@TransactionalEventListener(fallbackExecution=true, phase=TransactionPhase.AFTER_COMMIT) 
+0

'' ':

いずれの場合で

、あなたは(私はあなたが生産ボックスを参照している知っているので、私は物事を試みることにあなたのオプションが何であるかわからないんだけど)以下と試みることができますupdateStatus''メソッドはコントローラによって呼び出されます。これは、 '' '' TransactionStatus'''メソッドが '' updateStatus'''メソッドに存在するため、 '' '' updateStatus'''が呼び出されたときに新しいトランザクションが作成されます。イベントはトランザクションの境界内で発生します。 –

+0

updateStatusメソッド全体を投稿できますか? – alexbt

+0

updateStatusメソッドのコードが追加されました。 –

関連する問題