Selama proses pengembangan, bug ditemui. Alasan bug adalah bahwa transaksi pegas mengirimkan pesan produksi lebih lambat dari antrian pesan, menghasilkan data yang salah yang diperoleh ketika antrian pesan mengkonsumsi pesan. Artikel ini memperkenalkan munculnya masalah dan proses resolusi langkah demi langkah.
1. Masalah yang timbul:
Skenario Restore: Suatu metode di antarmuka, pertama -tama ubah status pesanan, dan kemudian hasilkan pesan dari antrian pesan. Konsumen antrian pesan memperoleh status pesanan deteksi pesan dan menemukan bahwa status pesanan tidak berubah.
Kode:
@Service (OrderApi) Public Class OrderApIImpl mengimplementasikan OrderApi {@resource MQService MQService; @Orderdao orderdao; public void push (String orderId) {// Perbarui status pesanan, status sebelumnya adalah 1 updateStatus (orderId, 3); // menghasilkan pesan mqservice.produce (orderId); } public viod updateStatus (string orderId, status integer) {orderdao.updaSeStatus (orderId, status); }}Alasan untuk masalah: Semua metode dalam pesanan memiliki transaksi, dan tipe transaksi propagation_required, sehingga pengoperasian metode push pada data akan diserahkan setelah semua kode push dijalankan. Sebelum transaksi dikirimkan, pesan antrian pesan telah dihasilkan, sehingga status urutan yang dikonsumsi dalam kueri antrian pesan dari database mungkin 1. Untuk membuat bug lebih jelas, Anda dapat menambahkannya di akhir metode push:
Coba {thread.sleep (10000);} catch (InterruptedException e) {// TODO Auto-Exhanerated Catch Block E.PrintStackTrace ();}Dengan cara ini, Anda akan menemukan bahwa status pesanan tidak boleh dimodifikasi ketika pesan konsumsi dikonsumsi.
2. Solusi untuk masalah:
Solusi: Saat memperbarui data, buat hal baru untuk memastikan bahwa setelah kode pembaruan dijalankan, transaksi yang memperbarui database telah dilakukan. (Pastikan operasi database telah dikirimkan sebelum pesan dihasilkan)
Menurut skema di atas, hal pertama yang saya pikirkan adalah secara langsung memodifikasi jenis transaksi dari metode UpdateStatus; Saya mengubah jenis transaksi dari metode ini menjadi propagation_requires_new (buat transaksi baru, jika transaksi saat ini ada, tangguhkan transaksi saat ini).
Tetapi ada dua hal yang tidak pantas untuk dilakukan:
1. Modifikasi paksa tipe transaksi Updatestaus dapat memengaruhi proses lain.
2. Tidak berfungsi, tidak ada transaksi baru yang dibuat dalam metode Updatestaus.
Penjelasan tentang Poin Kedua: Spring menambahkan transaksi melalui beannameautoproxycreator, yang hanya menambahkan transaksi ke objek kacang. Sekarang memanggil metode di dalam kelas tidak akan memicu penciptaan hal -hal baru.
Jadi setelah mencoba hal di atas, saya membuat kelas baru:
@Service ("orderextapi") kelas publik orderextapiImpl {@resource orderapi orderapi; public void updateStatusNewPropagation (String orderId) {ordePi.upDatestatus (orderId); }}dan tambahkan transaksi propagation_requires_new untuk metode updateStatusNewPropagation
Kelas ini hanya untuk membuat transaksi baru untuk metode UpdateStausus di OrderApi.
Oke, sejauh ini bug telah diselesaikan.
Namun, masih ada masalah dalam kode: pengoperasian database telah diserahkan, dan jika ada pengecualian dalam pesan produksi, itu masih salah untuk logika bisnis. Oleh karena itu, perlu untuk mendeteksi apakah pembuatan pesan selesai.
Kode dalam pesanan akhir adalah sebagai berikut:
@Service (OrderApi) Public Class OrderApIImpl mengimplementasikan OrderApi {@resource MQService MQService; @Resource orderdao orderdao; @Resource orderextapiImpl orderextapi; public void push (String orderId) {// Perbarui status pesanan, status sebelumnya adalah 1 orderextapi.updatestatusNewPropagation (orderId, 3); // Hasilkan pesan -Produce akan mendeteksi apakah terjadi pengecualian. Ketika 1 dikembalikan, itu berarti bahwa pesan produksi berhasil. Respons respons = mqservice.produce (orderId); if (response.getCode ()! = 1) {log.info ("Pengecualian pesan produksi antrian pesan:" + response.getErrormSg ()) // Pengecualian Pesan Produksi, Setel ulang status dan tunggu orderextapi. }} public viod updateStatus (string orderId, status integer) {orddao.updaSeStatus (orderId, status); }}Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.