JPAを新しいスレッドで使用してデータベースにデータを保存する簡単なソリューションはありますか?別のスレッド(実行可能)からトランザクションメソッドを呼び出す
My SpringベースのWebアプリケーションを使用すると、スケジュールされたタスクを管理できます。実行時に、事前定義されたタスクの新しいインスタンスを作成して開始することができます。私は春のTaskSchedulerを使用しており、すべてがうまくいきます。
しかし、私は、データベースにすべての火力タスクのブール結果を保存する必要があります。これどうやってするの?
EDIT: 私は私の質問を一般化する必要があります。私は仕事から私の@Serviceクラスのメソッドを呼び出す必要があります。データベースに保存する前にタスクの結果を "処理"する必要があるためです。
EDIT 2: 私の問題のあるコードの簡易版はここです。スケジューラーからsaveTaskResult()を呼び出すと、メッセージは出力されますが、dbには何も保存されません。しかし、コントローラからsaveTaskResult()を呼び出すたびに、レコードはデータベースに正しく保存されます。
@Service
public class DemoService {
@Autowired
private TaskResultDao taskResultDao;
@Autowired
private TaskScheduler scheduler;
public void scheduleNewTask() {
scheduler.scheduleWithFixedDelay(new Runnable() {
public void run() {
// do some action here
saveTaskResult(new TaskResult("result"));
}
}, 1000L);
}
@Transactional
public void saveTaskResult(TaskResult result) {
System.out.println("saving task result");
taskResultDao.persist(result);
}
}
問題はなんですか?あなたはスレッドを開始し、スレッドを開始していない場合と全く同じようにSpringサービスを呼び出しますが、すべてがOKである必要があります。 –
ターゲットビジネスメソッドが@Transactionalであるという問題があります。 run()でこのメソッドを呼び出すと、データは保持されません。 (私は質問タイトルを更新しました) –
トランザクションインターセプタは、メソッドを呼び出すスレッドがサーブレットコンテナによって作成されたスレッドか、あなたによって作成されたスレッドかどうかは気にしません。それは動作するはずです。いくつかのコードを見せてください。 –