Pemandangan
Tugas waktunya sering dibutuhkan dalam pengembangan. Untuk mal, tugas -tugas waktunya sangat banyak, seperti kupon kedaluwarsa waktu, penutupan waktu pemesanan, pembayaran WeChat selama 2 jam tanpa membayar untuk menutup pesanan, dll., Yang semuanya memerlukan tugas -tugas waktunya. Namun, ada masalah dengan tugas waktu itu sendiri. Secara umum, kami menanyakan database melalui jajak pendapat yang tepat waktu untuk menentukan apakah ada tugas yang akan dieksekusi. Artinya, apa pun yang terjadi, kita perlu meminta database terlebih dahulu. Beberapa tugas memiliki persyaratan tinggi untuk akurasi waktu dan perlu diminta sekali. Tidak masalah jika sistemnya kecil. Jika sistem itu sendiri besar dan ada banyak data, ini tidak terlalu realistis, sehingga metode lain diperlukan. Tentu saja, ada banyak cara untuk mengimplementasikannya, seperti antrian waktu implementasi REDIS, antrian penundaan JDK berdasarkan antrian prioritas, putaran waktu, dll. Karena kami menggunakan RabbitMQ dalam proyek kami, berdasarkan prinsip pengembangan dan pemeliharaan yang mudah, kami menggunakan antrian penundaan RabbitMQ untuk mengimplementasikan tugas waktu. Jika Anda tidak tahu apa itu RabbitMQ atau bagaimana Springboot mengintegrasikan RabbitMQ, Anda dapat memeriksa artikel saya sebelumnya Spring Boot Rabbitmq
Rabbitmq menunda antrian
RabbitMQ sendiri tidak memiliki antrian penundaan, dan hanya dapat diimplementasikan melalui karakteristik antrian RabbitMQ. Jika RabbitMQ ingin menerapkan antrian keterlambatan, Anda perlu menggunakan sakelar dead-letter Rabbitmq (pertukaran) dan waktu bertahan hidup TTL (waktu untuk hidup)
Sakelar huruf mati
Pesan akan memasukkan sakelar surat mati jika kondisi berikut dipenuhi. Ingatlah bahwa ini adalah sakelar, bukan antrian. Sakelar dapat sesuai dengan banyak antrian.
Sakelar surat mati adalah sakelar biasa, tetapi karena kami membuang pesan yang kadaluwarsa, itu disebut sakelar huruf mati. Itu tidak berarti bahwa sakelar huruf mati adalah sakelar tertentu.
Pesan TTL (Waktu Kelangsungan Hidup Pesan)
TTL pesan adalah waktu bertahan hidup dari pesan. RabbitMQ dapat mengatur TTL untuk antrian dan pesan secara terpisah. Pengaturan antrian berarti bahwa antrian tidak memiliki waktu retensi yang terhubung ke konsumen, dan Anda juga dapat membuat pengaturan terpisah untuk setiap pesan individu. Setelah waktu ini, kami berpikir bahwa berita itu sudah mati, dan itu disebut surat kematian. Jika antrian diatur dan pesan diatur, maka yang kecil akan diambil. Jadi jika sebuah pesan dialihkan ke antrian yang berbeda, waktu kematian pesan ini mungkin berbeda (pengaturan antrian yang berbeda). Di sini kita berbicara tentang TTL dari satu pesan, karena itu adalah kunci untuk menerapkan tugas yang tertunda.
byte [] MessageBodyBytes = "Halo, Dunia!". GetBytes (); AMQP.BasicProperties Properties = AMQP.BasicProperties baru (); properties.setExpiration ("60000"); channel.basicpublish ("My-Exchange", "Queue-Key", Properties, MessageBodyBytes);Anda dapat mengatur waktu dengan mengatur bidang kedaluwarsa pesan atau properti X-Message-TTL, yang keduanya memiliki efek yang sama. Hanya saja bidang kedaluwarsa adalah parameter string, jadi Anda perlu menulis string int-type: ketika pesan di atas dilemparkan ke dalam antrian, 60 detik berlalu, jika tidak dikonsumsi, itu akan mati. Tidak akan dikonsumsi oleh konsumen. Berita di balik berita ini tidak "mati" dan dikonsumsi oleh konsumen. Surat mati tidak akan dihapus dan dirilis dalam antrian, mereka akan dihitung ke dalam jumlah pesan dalam antrian.
Bagan Aliran Proses
Buat sakelar dan antrian
Buat sakelar huruf mati
Seperti yang ditunjukkan pada gambar, ini adalah untuk membuat sakelar biasa. Demi perbedaan yang mudah, nama sakelar adalah penundaan
Buat antrian pesan kedaluwarsa otomatis
Fungsi utama dari antrian ini adalah membuat pesan kedaluwarsa secara teratur. Misalnya, jika kita perlu menutup pesanan dalam 2 jam, kita perlu memasukkan pesan ke dalam antrian ini dan mengatur waktu kedaluwarsa pesan menjadi 2 jam
Buat antrian kedaluwarsa secara otomatis bernama Delay_queue1. Tentu saja, parameter dalam gambar tidak akan secara otomatis kedaluwarsa pesan, karena kami tidak mengatur parameter X-Message-TTL. Jika pesan di seluruh antrian sama, Anda dapat mengaturnya. Untuk fleksibilitas, itu tidak diatur. Dua parameter lainnya X-Dead-Letter-Exchange mewakili sakelar yang akan dimasukkan pesan setelah pesan berakhir. Konfigurasi di sini adalah penundaan, yaitu sakelar huruf mati. X-Dead-Letter-Routing-Key adalah untuk mengkonfigurasi routing-key dari sakelar huruf mati setelah pesan berakhir. Hal yang sama berlaku untuk mengirim kunci perutean pesan. Menurut kunci ini, pesan akan ditempatkan dalam antrian yang berbeda.
Buat antrian pemrosesan pesan
Antrian ini adalah antrian yang benar -benar memproses pesan, dan semua pesan yang memasuki antrian ini akan diproses
Nama antrian pesan adalah delay_queue2
Antrian pesan terikat untuk beralih
Masukkan halaman Detail Switch dan ikat dua antrian yang dibuat (tunda antrian1 dan tunda antrian2) ke sakelar.
Kunci perutean antrian pesan kedaluwarsa otomatis diatur untuk menunda
Bind Delay Queue2
Kunci penundaan antrian2 harus diatur untuk membuat parameter kunci-rute-ruting-ruting antrian yang sudah kadaluwarsa secara otomatis, sehingga ketika pesan berakhir, pesan dapat secara otomatis ditempatkan dalam antrian DLACLE_QUEUE2.
Halaman manajemen terikat seperti yang ditunjukkan pada gambar:
Tentu saja, ikatan ini juga dapat diimplementasikan menggunakan kode, hanya untuk ekspresi intuitif, sehingga platform manajemen yang digunakan dalam artikel ini digunakan untuk beroperasi
Kirim pesan
String msg = "hello word"; MessageProPerties MessageProPerties = New MessageProPerties (); MessageProPerties.SetExpiration ("6000"); MessageProPerties.setCorrelationId (uuid.randomuuid (). Tostring (). getBytes ()); Pesan pesan = pesan baru (msg.getbytes (), messageProPerties); rabbittemplate.convertandsend ("tunda", "tunda", pesan);Kode utamanya adalah
MessageProPerties.SetExpiration ("6000");Atur pesan ke kedaluwarsa setelah 6 detik
Catatan: Karena pesannya harus secara otomatis kedaluwarsa, Anda tidak boleh mengatur mendengarkan Delay_Queue1, dan pesan dalam antrian ini tidak dapat diterima. Kalau tidak, setelah pesan dikonsumsi, tidak akan ada kedaluwarsa.
Menerima pesan
Cukup konfigurasikan delay_queue2 untuk mendengarkan pesan menerima
Paket wang.raye.rabbitmq.demo1; impor org.springframework.amqp.core.acknowledgemode; impor org.springframework.amqp.core.binding; impor org.springframework.amqp.core.binding; impor org.springframework.amqp.core.bindingbuilder; impor org.springframework.amqp.core.directexchange; impor org.springframework.amqp.core.message; impor org.springframework.amqp.core.queue; impor org.springframework.amqp.rabbit.connection.cachingConnectionFactory; impor org.springframework.amqp.rabbit.connection.connectionFactory; impor org.springframework.amqp.rabbit.core.channelawaremessageListener; impor org.springframework.amqp.rabbit.listener.simplemessageelistenercontainer; impor org.springframework.beans.factory.annotation.Autowired; impor org.springframework.context.annotation.bean; Impor org.springframework.context.annotation.configuration; @configurationPublic class delayqueuee { / ** Nama sakelar pesan* / public static final exchange = "delay"; / ** antrian Key1*/ Public Static Final String RoutingKey1 = "Delay"; / ** antrian Key2*/ Public Static Final String RoutingKey2 = "Delay_key"; / *** Informasi tautan konfigurasi* @return*/ @bean ConnectionFactory ConnectionFactory () {CachingConnectionFactory ConnectionFactory = CachingConnectionFactory baru ("120.76.237.8", 5672); ConnectionFactory.SetUserName ("KBERP"); ConnectionFactory.SetPassword ("KBERP"); ConnectionFactory.SetVirtualHost ("/"); ConnectionFactory.SetPublishersonfirmasi (true); // return ConnectionFactory harus diatur; } /** * Configure message switch* Configure FanoutExchange for consumers: Distribute messages to all bound queues, without the concept of routingkey HeadersExchange: match DirectExchange by adding attribute key-value: Distribute to the specified queue according to routingkey TopicExchange: Multi-key matching */ @Bean public DirectExchange defaultExchange() { return new DirectExchange(EXCHANGE, true, PALSU); } / ** * Mengkonfigurasi Antrian Pesan 2 * Mengkonfigurasi * / @Bean Antrian Publik Antrian () {return baru antrian ("delay_queue2, true); // Kutipan persisten}/*** BIND Pesan Antrian 2 Dengan sakelar* Konfigurasi untuk konsumen* @return*/@bean @Autowired public binding binding () {return bindingBuilder.bind (antrian ()). Ke (defaultExchange ()). Dengan (delayqueue.routingkey2); } /** * Accept the listener of the message, this listener will accept the message from message queue 1* Configure for consumers* @return */ @Bean @Autowired public SimpleMessageListenerContainer messageContainer2(ConnectionFactory connectionFactory) { SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory()); container.setqueues (antrian ()); container.setExposelistenerChannel (true); container.setmaxConcurrentConsumers (1); container.setConcurrentConsumers (1); container.setacknowledgeMode (AcnnowledGemode.Manual); // Atur mode konfirmasi secara manual mengkonfirmasi container.setMessAgelistener (new channelAwareMessAgelistener () {public void onMessage (pesan pesan, com.rabbitmq.client.channel channel) melempar pengecualian {byte [] body = pesan.getbody (); System.out.println ("delayte_queue2; channel.basicack (message.getMessageProPerties (). getDeliverytag (), false); wadah kembali; }}Tangani saja tugas yang perlu diproses secara teratur selama mendengarkan pesan. Karena RabbitMQ dapat mengirim pesan, Anda dapat mengirim kode fitur tugas, seperti menutup pesanan dan mengirim ID pesanan, yang menghindari kebutuhan untuk menanyakan pesanan yang perlu ditutup dan meningkatkan beban pada MySQL. Lagi pula, begitu volume pesanan besar, kueri itu sendiri juga merupakan hal yang sangat mahal.
Meringkaskan
Menerapkan tugas waktu berdasarkan RabbitMQ adalah untuk mengatur waktu kedaluwarsa untuk pesan tersebut, memasukkannya ke dalam antrian yang tidak dibaca, sehingga pesan tersebut secara otomatis akan ditransfer ke antrian lain setelah kedaluwarsa, dan memantau pendengar pesan antrian ini untuk menangani operasi spesifik dari tugas waktu.
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.