Pengantar Rabbitmq
Rabbitmq adalah sistem pesan perusahaan yang lengkap dan dapat digunakan kembali berdasarkan AMQP
MQ adalah nama lengkap dari antrian pesan. Antrian pesan (MQ) adalah metode komunikasi antara aplikasi dan aplikasi. Aplikasi berkomunikasi dengan membaca dan menulis pesan antrian (data untuk aplikasi) tanpa koneksi khusus untuk menautkannya. Pengiriman pesan mengacu pada komunikasi antar program dengan mengirim data dalam pesan, bukan dengan saling menelepon secara langsung, panggilan langsung biasanya digunakan dalam teknik seperti panggilan prosedur jarak jauh. Antrian mengacu pada aplikasi yang berkomunikasi melalui antrian. Penggunaan antrian menghilangkan persyaratan bahwa aplikasi penerima dan pengiriman dieksekusi secara bersamaan.
AMQP adalah protokol, protokol komunikasi pesan abstraksi tingkat tinggi.
Meskipun ada banyak standar publik di dunia pesan sinkron (seperti Cobar IIOP, atau SOAP, dll.), Ini bukan kasus dalam pemrosesan pesan asinkron. Hanya perusahaan besar yang memiliki beberapa implementasi komersial (seperti MSMQ Microsoft, Websphere MQ IBM, dll.). Oleh karena itu, pada bulan Juni 2006, Cisco, Redhat, Imatix dan lainnya bersama -sama merumuskan standar publik untuk AMQP. Dengan kata lain, AMQP adalah protokol untuk komunikasi asinkron.
Skenario Penggunaan RabbitMQ
Dalam proyek tersebut, beberapa operasi yang memakan waktu yang tidak memerlukan pengembalian segera diekstraksi dan diproses secara tidak sinkron. Pemrosesan asinkron ini sangat menghemat waktu respons permintaan server, sehingga meningkatkan throughput sistem. Namun, kebanyakan dari mereka tidak hanya diharuskan untuk kembali secara instan, dan tidak masalah apakah eksekusi berhasil atau tidak. Jika Anda membutuhkan pengembalian instan, Anda dapat menggunakan Dubbo. Spring Boot Integrates dengan Dubbo, Anda dapat menonton Spring Boot Integration Dubbox
Ketergantungan RabbitMQ
RabbitMQ bukan paket JAR sederhana (Paket JAR hanya menyediakan beberapa fungsi komunikasi dasar dengan RabbitMQ itu sendiri). Mirip dengan Dubbo, RabbitMQ juga membutuhkan perangkat lunak lain untuk dijalankan. Berikut ini adalah perangkat lunak yang diperlukan untuk RabbitMQ untuk dijalankan.
1. Erlang
Karena perangkat lunak RabbitMQ itu sendiri dikembangkan berdasarkan Erlang, jika Anda ingin menjalankan Rabbitmq, Anda harus terlebih dahulu mengikuti Erlang
Situs web resmi Erlang
Alamat unduhan erlang
Rabbitmq
Rabbitmq adalah inti dari mengimplementasikan antrian pesan
Situs web resmi RabbitMQ
Unduh RabbitMQ
Mengkonfigurasi RabbitMQ
Setelah instalasi selesai, Anda perlu menyelesaikan beberapa konfigurasi sebelum menggunakan RabbitMQ. Anda dapat secara langsung menggunakan CMD ke direktori SBIN di bawah direktori instalasi RabbitMQ melalui konfigurasi perintah, atau Anda dapat secara langsung menemukan Command Prompt RabbitMQ (SBIN Dir) di menu Start untuk menjalankan SBIN langsung ke direktori instalasi RabbitMQ. Untuk kenyamanan, pertama-tama kami mengaktifkan plug-in manajemen dan menjalankan perintah.
rabbitmq-plugins.bat mengaktifkan rabbitmq_management
Benar, perhatikan bahwa ini ada di bawah Windows. Jika Linux, tidak ada akhiran kelelawar. Kemudian kami menambahkan pengguna, karena koneksi tidak dapat berhasil tanpa pengguna di lingkungan jaringan eksternal. Jalankan Perintah Tambah Pengguna
Rabbitmqctl.bat Add_user Springboot Kata Sandi
Springboot adalah nama pengguna dan kata sandi adalah kata sandi
Kemudian, untuk kenyamanan demonstrasi, kami memberikan Springboot izin administrator untuk memfasilitasi login ke halaman manajemen
rabbitmqctl.bat set_user_tags Administrator Springboot
Berikan izin akun
rabbitmqctl.bat set_permissions -p / springboot.*.*.*
Kemudian mulailah layanan RabbitMQ dan kunjungi halaman manajemen RabbitMQ http: // localhost: 15672 untuk melihat halaman login. Jika tidak ada pengguna yang dibuat, Anda dapat menggunakan tamu dan tamu untuk masuk. Jika ada pengguna yang dibuat, gunakan pengguna yang dibuat untuk masuk. Jika ada pengguna yang dibuat, gunakan pengguna yang dibuat untuk masuk.
Buat Proyek Springboot
Karena saya telah menyebutkan membuat proyek boot musim semi di artikel sebelumnya berkali -kali, saya tidak akan banyak bicara di sini
Tambahkan Ketergantungan Terkait RabbitMQ
<!-Rabbitmq-> <dependency> <GroupId> org.springframework.boot </groupid> <ArTifactId> Spring-boot-starter-AMQP </StifactId> </dependency>
Itu benar, hanya sedikit konfigurasi, tapi saya mungkin tidak mengerti seperti ini, jadi saya lebih baik memposting semua konfigurasi
<Project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: schemalocation = "http:/maven.romp.romp.romp. http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>wang.raye.rabbitmq</groupId> <artifactId>demo1</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name> demo1 </name> <rerl> http://maven.apache.org </rerl> <pro properties> <Project.build.sourceencoding> UTF-8 </project.build.sourceencoding> </Properties> <parent> <groupid> org.springfring. <ArTifactId> Spring-Boot-Starter-Parent </arttifactid> <version> 1.4.0.release </version> </tarent> <dependencies> <dependency> <groupid> JUNIT </groupid> <ArTifactid> Junit </ArtifactId> <version> 3.8.1 </Versi> <cipope> </scope </scope </scope> <version> 3.8.1 </Version> <scope> </Scope </Scope> <groupid> org.springframework.boot </sroupid> <ArtifactId> Spring-boot-starter-web </t Artifactid> </gandendency> <!-rabbitmq-> <tendensi> <Roupid> org. </dependencies> </jadi Project>
Karena tidak ada operasi lain yang dilakukan, proyek saat ini terutama bergantung pada dua modul, satu boot boot dan satu rabbitmq
Tambahkan kelas konfigurasi
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.context.annotation.bean; impor org.springframework.context.annotation.configuration;/*** Kelas Konfigurasi Rabbitmq* @author Raye* @since 12 Oktober 2016 10:57:44*/ @Konfigurasi Kelas Publik Rabbitmqconfig {/** Nama Pesan*/Publik Static String Final = My-My-My-My (My-My-My {/** Saklar Pesan*/Publik Static String Static = "My-My-My (My-My" " / ** antrian key1*/ string final statis public routingKey1 = "queue_one_key1"; / ** antrian Key2*/ string final statis public routingKey2 = "queue_one_key2"; / *** Informasi tautan konfigurasi* @return*/ @Bean ConnectionFactory ConnectionFactory () {CachingConnectionFactory ConnectionFactory = CachingConnectionFactory baru ("127.0.0.1", 5672); ConnectionFactory.SetUserName ("Springboot"); ConnectionFactory.SetPassword ("Kata Sandi"); 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); } / ** * Konfigurasikan antrian pesan 1 * Konfigurasi untuk konsumen * @return * / @bean antrian publik antrian () {return baru antrian ("queue_one", true); // Kuantitas persisten}/*** Bind pesan antrian 1 dengan sakelar* Konfigurasi untuk konsumen* @return*/@bean mengikat pengikatan publik () {return bindingBuilder.bind (queue ()). To (defaultexchange ()). Dengan (rabbitmqonfig.reutingkey1); } / ** * Konfigurasikan Antrian Pesan 2 * Konfigurasi untuk konsumen * @return * / @bean antrian publik antrian1 () {return baru antrian ("queue_one1", true); // Kegigihan Cepat}/*** Bind Pesan Antrian 2 Dengan sakelar* Konfigurasi untuk konsumen* @return*/@bean pengikatan pengikat publik1 () {return bindingBuilder.bind (queue1 ()). To (defaultexchange ()). Dengan (rabbitmqonfig.Routingkey2); } / *** Terima pesan mendengarkan, pendengar ini akan menerima pesan dari antrian pesan 1* Konfigurasi untuk konsumen* @return* / @bean Public SimpleMessAgelistenerContainer MessageConteNerer () {SimpleMessAgelistener Container = new SimplemessAgeListenererer (ConnectionFacCory ();); container.setqueues (antrian ()); container.setExposelistenerChannel (true); container.setmaxConcurrentConsumers (1); container.setConcurrentConsumers (1); container.setacknowledgeMode (AcnnowledGemode.Manual); // Setel mode konfirmasi secara manual konfirmasi container.setMessAgeListener (new channelAwareMessAgeListener () {public void onMessage (pesan pesan, com.rabbitmq.client.channel channel) melempar Exception {byte [] body = message.getbody (); System.out.println ("pesan yang diterima:" channel.basicack (message.getMessageProPerties (). getDeliveryTag (), false); wadah kembali; } / *** Terima pesan mendengarkan, pendengar ini akan menerima pesan dari antrian pesan 1* Konfigurasi untuk konsumen* @return* / @bean Public SimplemessAgelistenerContainer MessageContainer2 () {SimpleMessAgelistener Container = new SimplemessAgeListenerContainer (ConnectionFacorcory ()); container.setqueues (queue1 ()); 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 = message. channel.basicack (message.getMessageProPerties (). getDeliverytag (), false); wadah kembali; }}Perhatikan bahwa untuk lebih menunjukkan cara mengkonfigurasi, saya mengkonfigurasi dua antrian pesan. Kecuali untuk di mana konfigurasi tautan dikonfigurasi, seluruh kelas ini ditargetkan pada konsumen pesan. Tentu saja, konsumen pesan dan produsen pesan perlu mengonfigurasi informasi tautan. Untuk kenyamanan, konsumen pesan dan produsen proyek ini sama -sama dalam proyek ini. Secara umum, proyek yang sebenarnya tidak akan berada dalam proyek yang sama. Karena komentarnya sangat rinci, saya tidak akan banyak bicara.
Kirim pesan
Untuk memfasilitasi pengiriman pesan, saya langsung menulis pengontrol untuk memanggil metode pengiriman pesan dengan mengakses antarmuka. Tanpa basa -basi lagi, tambahkan kode
Paket wang.raye.rabbitmq.demo1; import java.util.uuid; impor org.springframework.amqp.rabbit.core.rabbittemplate; impor org.springframework.amqp.rabbit.support.correlationData; impor org.springframework.web.bind.annotation.requestmapping; Impor org.springframework.web.bind.annotation.RestController;/** * Uji pengontrol untuk Rabbitmq untuk mengirim pesan * @author raye * */ @restcontrollerPublic kelas Rabbittemlate rabbittemplate.confirmpleBleback {private rabbittempate rabbittempate rabbittempate; /*** Mengkonfigurasi Rabbittemplate untuk mengirim pesan. Karena ini adalah konstruktor, pegas akan secara otomatis disuntikkan tanpa anotasi (itu harus menjadi fitur dari versi baru) * @param rabbittemplate */ public sendcontroller (rabbittemplate rabbittemplate) {this.rabbittemplate = rabbittemplate; // atur callback konsumsi this.rabbittemplate.setConfirmCallback (ini); } / ** * Kirim pesan ke antrian pesan 1 * @param msg * @return * / @RequestMapping ("send1") public String Send1 (string msg) {string uuid = uuid.randomuuid (). ToString (); CorrelationData CorrespondenceID = CorrelationData baru (UUID); rabbittemplate.convertandsend (rabbitmqconfig.exchange, rabbitmqconfig.routingkey1, msg, correspondenceId); kembali nol; } / ** * Kirim pesan ke antrian pesan 2 * @param msg * @return * / @RequestMapping ("send2") public String Send2 (string msg) {string uuid = uuid.randomuuid (). ToString (); CorrelationData CorrelationID = CorrelationData baru (UUID); rabbittemplate.convertandsend (rabbitmqconfig.exchange, rabbitmqconfig.routingkey2, msg, correlationid); kembali nol; } / *** Callback Pesan, terutama mengimplementasikan antarmuka rabbittemplate.confirmCallback* Perhatikan bahwa panggilan balik pesan hanya dapat mewakili pesan yang berhasil yang dikirim ke server Rabbitmq, dan tidak dapat mewakili pesan yang berhasil diproses dan diterima* / public void (CorrelationData CorrelationData, Boolean Ack, string void. if (ack) {System.out.println ("Konsumsi pesan gagal:" + penyebab + "/n Resend"); }}}Perlu dicatat bahwa panggilan balik pesan hanya dapat mewakili pesan yang berhasil dikirim ke server RabbitMQ.
Kemudian kami memulai proyek dan mengunjungi http: // localhost: 8082/send1? Msg = aaaa dan Anda akan menemukan bahwa output konsol adalah
Pesan yang Diterima: AAAA
ID Callback: CorrelationData [ID = 37E6E913-835A-4ECA-98D1-807325C5900F]
Konsumsi berita yang berhasil
Tentu saja ID panggilan balik mungkin berbeda. Jika kami mengunjungi http: // localhost: 8082/send2? Msg = bbbb, outputnya akan
antrian1 Pesan yang Diterima: BBBB
ID Callback: CorrelationData [ID = 0CEC7500-3117-4AA2-9EA5-4790879812D4]
Konsumsi berita yang berhasil
Beberapa kata di akhir
Karena artikel ini terutama menjelaskan cara mengintegrasikan RabbitMQ dari nol ke springboot, tidak ada penjelasan untuk banyak informasi dan penggunaan RabbitMQ. Jika Anda tidak terbiasa dengan RabbitMQ itu sendiri, Anda dapat memeriksa artikel lain tentang RabbitMQ, dan melampirkan demo artikel ini.
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.