1. Komunikasi asinkron
RMI, Hessian dan teknologi lain yang telah kami hubungi sebelumnya adalah semua mekanisme komunikasi yang sinkron. Ketika klien memanggil metode jarak jauh, klien harus menunggu sampai metode jarak jauh selesai sebelum terus mengeksekusi. Klien akan diblokir selama periode ini (ini menyebabkan pengalaman pengguna yang sangat buruk).
(Komunikasi Sinkron)
Komunikasi sinkron bukan satu -satunya cara untuk berinteraksi antar program. Dalam mekanisme komunikasi asinkron, klien tidak perlu menunggu layanan untuk memproses pesan, dapat terus mengeksekusi, dan akhirnya menerima dan memproses pesan.
(Komunikasi asinkron)
Keuntungan Komunikasi Asinkron
Tidak perlu menunggu. Klien hanya perlu mengirim pesan ke broker pesan, dan dapat terus melakukan tugas -tugas lain tanpa menunggu, dan yakin bahwa pesan tersebut akan dikirimkan ke tujuan yang sesuai.
Berorientasi pada pesan dan decoupling. Klien tidak perlu khawatir tentang spesifikasi antarmuka dari layanan jarak jauh, ia hanya perlu memasukkan pesan ke dalam antrian pesan dan mendapatkan hasilnya.
2. JMS
1. Pendahuluan
Sebelum JMS muncul, setiap broker pesan memiliki implementasi yang berbeda, yang membuat kode pesan antara broker yang berbeda sulit menjadi universal. JMS (Java Message Service) adalah standar yang mendefinisikan API umum yang menggunakan broker pesan. Artinya, semua implementasi yang mematuhi spesifikasi menggunakan antarmuka umum, mirip dengan JDBC yang menyediakan antarmuka umum untuk operasi basis data.
Beberapa elemen penting JMS:
Tujuan: Saluran tempat pesan dikirim dari pengirim.
ConnectionFactory: Connection Factory, digunakan untuk membuat objek yang terhubung.
Koneksi: Antarmuka koneksi, digunakan untuk membuat sesi.
Sesi: Antarmuka sesi, digunakan untuk membuat pengirim, penerima pesan, dan objek pesan itu sendiri.
MessageConsumer: Konsumen pesan.
MessageProducer: Produser pesan.
XXXMessage: Berbagai jenis objek pesan, termasuk 5 jenis: bytemessage, mapMessage, objekmessage, streammessage dan textmessage.
2. Model pesan JMS
Sistem pesan yang berbeda memiliki model pesan yang berbeda. JMS menyediakan dua model: antrian (point-to-point) dan topik (publikasi/berlangganan).
Model antrian JMS (point-to-point)
Dalam model peer-to-peer, produser pesan menghasilkan pesan dan mengirimkannya ke antrian, dan konsumen pesan kemudian mengeluarkannya dari antrian dan mengkonsumsi pesan, tetapi tidak dapat dikonsumsi berulang kali.
Seperti yang ditunjukkan pada gambar:
Pengirim 1, pengirim 2, dan pengirim 3 masing -masing mengirim pesan ke server;
Pesan 1, 2, dan 3 akan membentuk antrian secara berurutan, dan pesan dalam antrian tidak tahu penerima mana yang akan dikonsumsi;
Penerima 1, 2, dan 3 masing -masing mengambil pesan dari antrian untuk dikonsumsi. Setiap kali pesan diambil, antrian akan menghapus pesan, yang memastikan bahwa pesan tidak akan dikonsumsi berulang kali.
Model antrian JMS juga telah menjadi model P2P (point to point).
Model JMS Topic (Publikasikan/Berlangganan)
Perbedaan terbesar antara model topik JMS dan model antrian JMS terletak pada bagian dari pesan yang diterima. Model topik mirip dengan akun resmi WeChat. Penerima yang berlangganan akun resmi dapat menerima pesan yang didorong oleh akun resmi.
Seperti yang ditunjukkan pada gambar:
Penerbit 1, 2, 3 masing -masing menerbitkan 3 topik 1, 2, 3;
Dengan cara ini, grup pengguna yang berlangganan topik 1: Pelanggan 1, 2, 3 dapat menerima Topik 1 pesan; Demikian pula, pelanggan 4, 5, 6 dapat menerima pesan topik 2, dan pelanggan 7, 8, 9 dapat menerima pesan topik 3.
Model topik JMS juga telah menjadi model PUS/Sub.
Perbandingan setiap elemen dalam dua mode:
3. Model Pemrograman JMS Tradisional
Produsen:
(1) Buat Connection Factory ConnectionFactory;
(2) membuat koneksi menggunakan pabrik koneksi;
(3) Mulai koneksi;
(4) membuat sesi;
(5) Buat tujuan pengiriman pesan;
(6) membuat produser;
(7) Buat jenis pesan dan konten pesan;
(8) Kirim pesan;
Konsumen:
(1) Buat Connection Factory ConnectionFactory;
(2) membuat koneksi menggunakan pabrik koneksi;
(3) Mulai koneksi;
(4) membuat sesi;
(5) Buat tujuan pengiriman pesan;
(6) Buat konsumen (7) Buat jenis pesan;
(8) menerima pesan;
3. Pengantar ActiveMQ
ActiveMQ adalah bus pesan open source paling populer dan kuat yang diproduksi oleh Apache. ActiveMQ adalah implementasi penyedia JMS yang sepenuhnya mendukung spesifikasi JMS1.1 dan J2EE 1.4. Meskipun spesifikasi JMS telah diperkenalkan sejak lama, JMS masih memainkan posisi khusus di antara aplikasi J2EE saat ini.
Fitur Utama ActiveMQ:
Menulis klien dalam berbagai bahasa dan protokol. Bahasa: Java, C, C ++, C#, Ruby, Perl, Python, PHP. Protokol Aplikasi:
OpenWire, Stomp Rest, WS Notification, XMPP, AMQP
Dukungan penuh untuk spesifikasi JMS1.1 dan J2EE 1.4 (Persistensi, Pesan XA, Transaksi)
Untuk dukungan pegas, ActiveMQ dapat dengan mudah tertanam ke dalam sistem menggunakan Spring, dan juga mendukung fitur Spring 2.0. Lulus tes server J2EE umum (seperti Geronimo, JBoss 4, Glassfish, WebLogic). Melalui konfigurasi adaptor sumber daya JCA 1.5, ActiveMQ dapat secara otomatis digunakan ke server komersial J2EE 1.4 yang kompatibel dan mendukung beberapa protokol transmisi: in-VM, TCP, SSL, NIO, UDP, JGroup, JXTA
Mendukung Persistensi Pesan Berkecepatan Tinggi melalui JDBC dan Journal, yang memastikan kluster berkinerja tinggi, server klien, dan dukungan point-to-point untuk AJAX
Dukung integrasi dengan sumbu untuk dengan mudah memanggil penyedia jms tertanam untuk pengujian
4. ActiveMQ Tempur aktual
Mari kita lihat bagaimana ActiveMQ mengimplementasikan antrian pesan sederhana.
Model Pemrograman JMS Tradisional
1. Implementasi kode model antrian JMS:
Produsen:
Paket com.wgs.mq.queue; impor org.apache.activemq.activemqConnectionFactory; import javax.jms.*;/*** dibuat oleh genshenwang.nomico pada 2017/10/19. */Kelas Publik ActiveMQProducer {private static final string url = "tcp: // localhost: 61616"; private static final string queue_name = "queue-name"; public static void main (string [] args) melempar jmsException {// 1 connection connection connectionFacoryFaktoryFaktorioryfacory ActiveMQConnectionFactory (url); // 2 Buat koneksi menggunakan koneksi koneksi koneksi = koneksiFactory.createConnection (); // 3 Mulai koneksi koneksi.start (); // 4 Sesi sesi sesi = Connection.createSession (false, Sesi. Produser MessageProducer MessageProducer = session.createProducer (tujuan); // 7 Buat pesan TextMessage TextMessage = session.createTextMessage (); for (int i = 1; i <= 100; i++) {//8 Create message content textMessage.setText("Sender- 1 -Send message: " + i);//9 Send message messageProducer.send(textMessage);}System.out.println("Message sent successfully");session.close();connection.close();}}Conusmer:
Paket com.wgs.mq.queue; impor org.apache.activemq.activemqConnectionFactory; import javax.jms.*;/*** dibuat oleh genshenwang.nomico pada 2017/10/19. */Kelas Publik ActiveMQConsumer {private static final string url = "tcp: // localhost: 61616"; private static final string queue_name = "queue-name"; public static void main (string [] args) melempar jmsException {// 1 connection connection connectionFaktoryFacoryFactory ActiveMQConnectionFactory (url); // 2 Buat koneksi menggunakan koneksi koneksi koneksi = koneksiFactory.createConnection (); // 3 Mulai koneksi koneksi.start (); // 4 Sesi sesi sesi = Connection.createSession (false, Sesi. konsumen messageconsumer messageConsumer = session.createConsumer (tujuan); MessageConsumer.setMessAgelistener (baru messagelistener () {public void onMessage (pesan pesan) {// 7 Buat pesan TextMessage TextMessage = (TextMessage) Pesan; coba {// Receat System.out.println ("Consumer- 1 - Terima pesan:" + TextMessage.oTMSEXT.grintln ("konsumen- 1 - menerima pesan: [" + textMessage.oTMSCEPT. {E.PrintStackTrace ();}}});}}2. Implementasi kode model topik JMS:
Produsen:
Paket com.wgs.mq.topic; impor org.apache.activemq.activemqConnectionFactory; import javax.jms.*;/*** Publikasikan mode berlangganan* dibuat oleh genshenwang.nomico pada 2017/10/19. */public class ActiveMQProducer {private static final String URL = "tcp://localhost:61616";private static final String TOPIC_NAME = "topic-name";public static void main(String[] args) throws JMSException {//1 Create a connection factory ConnectionFactoryConnectionFactory connectionFactory = new ActiveMqConnectionFactory (url); // 2 Buat koneksi menggunakan koneksi koneksi koneksi = koneksiFactory.createConnection (); // 3 Mulai koneksi koneksi.start (); // 4 Sesi sesi sesi = Connection. Produser MessageProducer MessageProducer = session.createProducer (tujuan); // 7 Buat pesan TextMessage textMessage = session.createTextMessage (); for (int i = 1; i <= 100; i++) {//8 Create message content textMessage.setText("Sender- 1 -Send message: " + i);//9 Send message messageProducer.send(textMessage);}System.out.println("Message sent successfully");session.close();connection.close();}}Konsumen:
Paket com.wgs.mq.topic; impor org.apache.activemq.activemqConnectionFactory; import javax.jms.*;/*** Publikasikan mode berlangganan* dibuat oleh genshenwang.nomico pada 2017/10/19. */public class ActiveMQConsumer {private static final String URL = "tcp://localhost:61616";private static final String TOPIC_NAME = "topic-name";public static void main(String[] args) throws JMSException {//1 Create a connection factory ConnectionFactoryConnectionFactory connectionFactory = new ActiveMQConnectionFactory (url); // 2 Buat koneksi menggunakan koneksi koneksi koneksi = koneksiFactory.createConnection (); // 3 Mulai koneksi.start (); // 4 Sesi sesi sesi = Connection.createSession (false, Sesi. MessageConsumer MessageConsumer = session.createConsumer (tujuan); MessageConsumer.SetMessAgelistener (baru messagelistener () {public void onMessage (pesan pesan) {// 7 Buat pesan TextMessage TextMessage = (TextMessage) Pesan; coba {// 7 Pesan System.out.println ("konsumen- 1 - menerima pesan: [" + textmessage.Ucping.out.println ("konsumen- 1 - menerima pesan: [" + textmessage.oTMSCEPT.OUTEXT ("Consumer- 1 - Terima pesan: [" + textMessage.oTMSSEGE. {E.PrintStackTrace ();}}});}}Templat JMS Menggunakan Spring
Meskipun JMS menyediakan antarmuka terpadu untuk semua broker pesan, seperti JDBC, itu bisa tampak rumit ketika menangani koneksi, pernyataan, set hasil, dan pengecualian. Namun, Spring memberi kami JMStemplate untuk menghilangkan kode JMS yang berlebihan dan duplikat.
Mari kita lihat cara menggunakan JMStemplate untuk menerapkan antrian pesan.
1. Implementasi kode model antrian JMS:
File Konfigurasi:
produser.xml:
<? XML Versi = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmls xmlns: context = "http://www.springframework.org/schema/context" xsi: schemalocation = "http://www.springframework.org/schema/beans http:/wwww.spramework.org http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd "> <konteks: annotation-config/<!-connectionfactory yang disediakan oleh activeMq-contactory> <nonponfig/<! name="brokerURL" value="tcp://localhost:61616"/> </bean> <!-- Configure the JMS connection factory in Spring to connect to the ConnectionFactory provided by ActiveMQ--> <bean id="connectionFactory"> <property name="targetConnectionFactory" ref = "targetConnectionFactory"/> </bean> <!-- Configure JmsTemplate to send messages --> <bean id="jmsTemplate"> <property name="connectionFactory" ref="connectionFactory"/> </bean> <!-- Configure the name of the queue destination --> <bean id="queueDestination"> <constructor-arg value="queue-spring-name"/> </bean> <!-- Configure the name of the queue destination --> <bean id = "TopicDestination"> <konstruktor-arg value = "topic-spring-name"/> </ bean> <bean id = "produserServiceImpl"/> </tean>
Consumer.xml:
<? XML Versi = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmls xmlns: context = "http://www.springframework.org/schema/context" xsi: schemalocation = "http://www.springframework.org/schema/beans http:/wwww.spramework.org http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd "> <konteks: annotation-config/<!-connectionfactory yang disediakan oleh activeMq-contactory> <nonponfig/<! name="brokerURL" value="tcp://localhost:61616"/> </bean> <!-- Configure the JMS connection factory in Spring to connect to the ConnectionFactory provided by ActiveMQ--> <bean id="connectionFactory"> <property name="targetConnectionFactory" ref = "targetConnectionFactory"/> </bean> <!-- Configure the name of the queue destination -> <bean id = "queuedestination"> <konstruktor-arg value = "antrian-name-name"/> </ bean> <!-Konfigurasikan pendengar pesan-> <bean id = "consummessageelistener"/> <!-mengkonfigurasi nama destination = <bean id = "jmscontain" <! name="connectionFactory" ref="connectionFactory"/> <property name="messageListener" ref="consumerMessageListener"/> </bean> <!-- Configure the name of the queue destination--> <bean id="topicDestination"> <constructor-arg value="topic-spring-name"/> </bean></beans>
Produsen:
(1) Tulis antarmuka terlebih dahulu:
Paket com.wgs.jms.producer;/*** Dibuat oleh genshenwang.nomico pada 2017/10/20. */Antarmuka Publik ActiveMQProducersERVICE {void SendMessage (Final String Message);}(2) Implementasi Antarmuka:
Paket com.wgs.jms.producer; impor org.springframework.beans.factory.annotation.Autowired; impor org.springframework.jms.core.jmstemplate; impor org. Dibuat oleh genshenwang.nomico pada 2017/10/20. */Kelas Publik ActiveMQProducerserViceImpl mengimplementasikan ActiveMQProducerserVice {@Autowired jmstemplate jmstemplate; @resource (name = "queuedestinate") Tujuan (Destination, Newsagecage (pesan string final) {jmstemplate. JMsException {TextMessage TextMessage = session.createTextMessage (pesan); return textMessage;}}); System.out.println ("Produser- 1 -sendatkan pesan berhasil:" + pesan);}}(3) Tes:
Paket com.wgs.jms.producer; impor org.springframework.context.support.classpathxmlapplicationContext;/*** Dibuat oleh genshenwang.nomico pada 2017/10/20. */kelas publik ActiveMQProdUcermain {public static void main (string [] args) {classpathxmlapplicationContext context = new classpathxmlapplicationContext ("produser.xml"); ActiveMqProducservice service = context.getBean (activeMqProducerser. {service.sendMessage ("test" + i);} context.close ();}} konsumen:
(1) Buat pendengar pesan:
Paket com.wgs.jms.consumer; import javax.jms.jmsexception; import javax.jms.message; import javax.jms.messagelistener; import javax.jms.textmessage;/*** dibuat oleh genshenwang.nomico pada 2017/10/20/20. */kelas publik ConsumReMessAgelistener mengimplementasikan MessageListener {public void onMessage (pesan pesan) {coba {textMessage textMessage = (TextMessage) pesan; System.out.println ("Consumer -1 -Receive Pesan:" + TextMessage.gettext ());}} {}} {}} {}} {} {}} {{JMSEXage {JMSEXage (JMSCEXICE (JMSCEXICE ();(2) Tes:
Paket com.wgs.jms.consumer; impor org.springframework.context.support.classpathxmlapplicationContext;/*** dibuat oleh genshenwang.nomico pada 2017/10/20. */kelas public ActiveMQConsumermain {public static void main (string [] args) {classpathxMlapplicationContext context = new ClassPathXMLapPlicationContext ("Consumer.xml");}}2. Implementasi kode model topik JMS:
Cukup ubah queuedestination yang muncul dalam kode di atas menjadi Topicdestination.
Meringkaskan
Di atas adalah semua konten artikel ini tentang pengenalan JMS dan kode ActiveMQ yang sebenarnya. Saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!