1. Pendahuluan
Ada 2 konsep penting dalam middleware pesan: broker pesan dan tujuan. Ketika pengirim pesan mengirim pesan, pesan diambil alih oleh broker pesan, yang memastikan bahwa pesan dikirim ke tujuan yang ditentukan.
Pialang pesan kami yang umum digunakan termasuk spesifikasi JMS dan AMQP. Sejalan dengan itu, implementasi umum mereka adalah ActiveMQ dan RabbitMQ.
2. Integrasikan ActiveMQ
2.1 Tambahkan dependensi
<dependency> <GroupId> org.springframework.boot </groupid> <ArtifactId> Spring-boot-starter-activemq </artifactid> </dependency> <!-Jika Anda perlu mengkonfigurasi kumpulan koneksi, ARTICID> <Arpendency> <groupid> org.apacheq </ctivemq <poolcy> <sgroupid> <groupid> org.apacheq </ctivemq <peol> <sgroupid> <sgroupid> <groupid> org.apacheq </ctivemq <peol> </dependency>
2.2 Tambahkan Konfigurasi
# ActiveMQ Mengkonfigurasi spring.activemq.broker-url = tcp: //192.168.2.12: 61616spring.activemq.user = adminspring.activeMq.password = adminspring.activemq.pool.enabled = falspring.activemq. Konfigurasi perlu diatur ke truespring.jms.pub-ub-domain = false
Di sini spring.activemq.pool.enabled = false berarti menutup kumpulan koneksi.
2.3 Pengkodean
Kelas Konfigurasi:
@ConfigurationPublic kelas JMSConfirGuration {public static final string queue_name = "activeMq_queue"; string final public static topic_name = "activeMq_topic"; @Bean Public Queue Queue () {return new ActiveMQQueue (Queue_name); } @Bean Topic Topic () {return new ActiveMQtopic (topic_name); }}Bertanggung jawab untuk membuat antrian dan topik.
Produser Pesan:
@ComponentPublic Class JMSSender {@Autowired Private Queue Antrian; @Autowired Private Topic Topic; @Autowired Private JMSMessagingTemplate JMStemplate; public void sendbyqueue (pesan string) {this.jmstemplate.convertandsend (antrian, pesan); } public void sendBytopic (pesan string) {this.jmstemplate.convertandsend (topik, pesan); }}Pesan Konsumen:
@ComponentPublic kelas JMSReceiver {@jmslistener (Destination = jmsconfirGuration.queue_name) public void recequentbyqueue (pesan string) {System.out.println ("Terima pesan antrian:" + pesan); } @Jmslistener (tujuan = jmsconfirGuration.topic_name) public void recestbytopic (pesan string) {System.out.println ("Terima Topik Pesan:" + pesan); }}Pesan konsumen mendengarkan pesan menggunakan anotasi @jmslistener.
2.4 Tes
@Runwith (springrunner.class) @springboottestpublic kelas jmstest {@autowired private JMSSender pengirim; @Test public void testsendbyqueue () {for (int i = 1; i <6; i ++) {this.sender.sendbyqueue ("Hello ActiveMQ Queue"+i); }} @Test public void testsendbytopic () {for (int i = 1; i <6; i ++) {this.sender.sendbytopic ("Hello ActiveMQ Topic"+i); }}}Hasil Cetak:
Terima Pesan Antrian: Halo ActiveMQ Antrian 1
Terima Pesan Antrian: Halo ActiveMQ Antrian 2
Terima Pesan Antrian: Halo ActiveMQ Antrian 3
Terima Pesan Antrian: Halo ActiveMQ Antrian 4
Terima Pesan Antrian: Halo ActiveMQ Antrian 5
Setel spring.jms.pub-sub-domain = true saat menguji Mode Publikasikan/Berlangganan
Terima Pesan Topik: Halo ActiveMQ Topic 1
Terima Pesan Topik: Halo ActiveMQ Topic 2
Terima Pesan Topik: Halo ActiveMQ Topic 3
Terima Pesan Topik: Halo ActiveMQ Topic 4
Terima Pesan Topik: Halo ActiveMQ Topic 5
3. Mengintegrasikan RabbitMQ
3.1 Tambahkan dependensi
<dependency> <GroupId> org.springframework.boot </groupId> <ArTifactId> Spring-boot-starter-AMQP </RiTtifacTID> </dependency>
3.2 Tambahkan Konfigurasi
spring.rabbitmq.host = 192.168.2.30spring.rabbitmq.port = 5672spring.rabbitmq.username = lightspring.rabbitmq.password = lightspring.rabbitmq.virtual-host =/uji
3.3 Pengkodean
Kelas Konfigurasi:
@ConfigurationPublic kelas AMQPConfirGuration {// ================================================= String final statis public Simple_queue = "Simple_Queue"; @Bean Public Queue Queue () {return baru antrian (Simple_queue, true); } // ================== Public static final string ps_queue_1 = "ps_queue_1"; string akhir public static ps_queue_2 = "ps_queue_2"; string final public static fanout_exchange = "fanout_exchange"; @Bean Public Queue PSQueue1 () {return baru antrian (ps_queue_1, true); } @Bean Public Queue PSQueue2 () {return baru antrian (ps_queue_2, true); } @Bean fanoutexchange fanoutexchange () {return fanoutexchange baru (fanout_exchange); } @Bean Public Binding fanoutBinding1 () {return bindingBuilder.bind (psqueue1 ()). To (fanoutexchange ()); } @Bean Public Binding fanoutBinding2 () {return bindingBuilder.bind (psqueue2 ()). To (fanoutexchange ()); } // ========================== String final statis public routing_queue_1 = "routing_queue_1"; string final public static routing_queue_2 = "routing_queue_2"; string final public static Direct_exchange = "Direct_exchange"; @Bean Public Queue RoutingQueue1 () {return baru antrian (routing_queue_1, true); } @Bean Public Queue RoutingQueue2 () {return baru antrian (routing_queue_2, true); } @Bean Public DirectExchange DirectExchange () {return new DirectExchange (Direct_exchange); } @Bean Public Binding DirectBinding1 () {return bindingBuilder.bind (routingqueue1 ()). To (DirectExchange ()). Dengan ("user"); } @Bean Public Binding DirectBINDING2 () {return bindingBuilder.bind (routingqueue2 ()). To (DirectExchange ()). Dengan ("order"); } // =============== Mode tema ====================== Public static final string topic_queue_1 = "topic_queue_1"; string final statis public topic_queue_2 = "topic_queue_2"; string final statis public topic_exchange = "topic_exchange"; @Bean Public Queue Topicqueue1 () {return baru antrian (topic_queue_1, true); } @Bean Public Queue Topicqueue2 () {return baru antrian (topic_queue_2, true); } @Bean Public TopicexChange TopicexChange () {return TopicexChange baru (topic_exchange); } @Bean Public Binding TopicBinding1 () {return bindingBuilder.bind (topicqueue1 ()). To (topicexchange ()). Dengan ("user.add"); } @Bean Public Binding TopicBinding2 () {return bindingBuilder.bind (topicqueue2 ()). To (topicexchange ()). Dengan ("user.#"); }}RabbitMQ memiliki beberapa mode kerja, jadi ada banyak konfigurasi. Pembaca yang ingin tahu tentang konten yang relevan dapat memeriksa "Pengantar Mode Kerja RabbitMQ" atau informasi terkait Baidu sendiri.
Produser Pesan:
@ComponentPublic kelas amqpsender {@autowired private amqptemplate amqptemplate; / ** * Mode Sederhana Kirim * * @param Message */ public void SimpleSend (pesan string) {this.amqPtemplate.convertandSend (AMQPConfirGuration.simple_queue, pesan); }/** * Mode Publikasikan/Berlangganan Kirim * * @param Message */public void pssend (pesan string) {this.amqptemplate.convertandSend (amqpconfirGuration.fanout_exchange, "", pesan); } / ** * Kirim dalam mode routing * * @param pesan * / public void routingsEnd (String routingKey, string pesan) {this.amqPtemplate.convertandSend (AMQPConfirGuration.Direct_exchange, RoutingKey, pesan); } / ** * Kirim dalam mode tema * * @param routingkey * @param pesan * / public void topicsend (string routingKey, string pesan) {this.amqptemplate.convertandSend (amqpconfirGuration.topic_exchange, routingkey, pesan); }}Pesan Konsumen:
@ComponentPublic kelas amqPreceiver { / ** * Penerimaan mode sederhana * * @param pesan * / @rabbitlistener (queuees = amqpconfirGuration.simple_queue) public void Simplereceive (pesan string) {System.println ("Terima pesan:" + pesan); }/** * Publikasikan/berlangganan Mode Penerimaan * * @param Pesan */@rabbitListener (queues = AMQPConfirGuration.ps_queue_1) public void psReceive1 (pesan string) {System.out.println (AmqpConfirGuration.ps_queue_1 + "Recequed Message:" } @RabbitListener (queues = amqpconfirGuration.ps_queue_2) public void psreceive2 (string pesan) {System.out.println (AMQPConfirGuration.ps_queue_2 + "Terima pesan:" + pesan); } / ** * Penerimaan mode routing * * @param pesan * / @rabbitlistener (queues = AMQPConfirGuration.Routing_Queue_1) public void routingReceive1 (pesan string) {System.out.println (amqpConfirGuration.routing_queue_11 +11 +11 +11 +11 +11 +11 +11 +11 +11 +11 +11 } @RabbitListener (queuees = amqpconfirGuration.routing_queue_2) public void routingReceive2 (pesan string) {System.out.println (AMQPConfirGuration.Routing_Queue_2 + "Terima pesan:" + pesan); } / ** * Penerimaan Mode Topik * * @param Message * / @rabbitListener (queues = AMQPConfirGuration.topic_queue_1) public void TopicReceive1 (string message) {System.out.println (amqpConfirGuration.topic_queue_1 + "Recequed pesan:" } @RabbitListener (queuees = amqpconfirGuration.topic_queue_2) public void TopicReceive2 (String Message) {System.out.println (AMQPConfirGuration.topic_Queue_2 + "Terima pesan:" + pesan); }}Pesan konsumen mendengarkan pesan menggunakan anotasi @rabbitlistener.
3.4 Tes
@Runwith (springrunner.class) @springboottestpublic kelas amqptest {@autowired private AMQPSENDER SENDER; @Test public void testsimplesEnd () {for (int i = 1; i <6; i ++) {this.sender.simplepsEnd ("test SimpleSend"+i); }} @Test public void testpssend () {for (int i = 1; i <6; i ++) {this.sender.pssend ("test pssend"+i); }} @Test public void testpssend () {for (int i = 1; i <6; i ++) {this.sender.pssend ("test pssend"+i); }} @Test public void testRoutingsEnd () {for (int i = 1; i <6; i ++) {this.sender.RoutingsEnd ("order", "test routingsend"+i); }} @Test public void testtopicsEnd () {for (int i = 1; i <6; i ++) {this.sender.topicsend ("user.add", "test topicsend"+i); }}}Hasil tes dilewati. . .
Pengingat 1: Login Access_Refused ditolak menggunakan Mekanisme Otentikasi Polos
Larutan:
1) Harap pastikan bahwa nama pengguna dan kata sandi sudah benar. Penting untuk dicatat apakah nilai nama pengguna dan kata sandi berisi spasi atau tab (penulis mengujinya karena kata sandi memiliki satu karakter tab lagi, yang menyebabkan kegagalan otentikasi).
2) Jika akun uji menggunakan tamu, Anda perlu memodifikasi file rabbitmq.conf. Tambahkan konfigurasi "loopback_users = tidak ada" ke file.
Tidak dapat menyiapkan antrian untuk pendengar. Entah antrian tidak ada atau broker tidak akan mengizinkan kami menggunakannya
Larutan:
Kita dapat masuk ke antarmuka manajemen RabbitMQ dan secara manual menambahkan antrian yang sesuai dalam opsi antrian.
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.