1. การสื่อสารแบบอะซิงโครนัส
RMI, Hessian และเทคโนโลยีอื่น ๆ ที่เราได้สัมผัสกับก่อนหน้านี้เป็นกลไกการสื่อสารแบบซิงโครนัสทั้งหมด เมื่อไคลเอนต์เรียกใช้วิธีระยะไกลลูกค้าจะต้องรอจนกว่าวิธีการระยะไกลจะเสร็จสมบูรณ์ก่อนที่จะดำเนินการต่อ ไคลเอนต์จะถูกบล็อกในช่วงเวลานี้ (ซึ่งเป็นสาเหตุของประสบการณ์การใช้งานที่แย่มาก)
(การสื่อสารแบบซิงโครนัส)
การสื่อสารแบบซิงโครนัสไม่ใช่วิธีเดียวที่จะโต้ตอบระหว่างโปรแกรม ในกลไกการสื่อสารแบบอะซิงโครนัสลูกค้าไม่จำเป็นต้องรอให้บริการประมวลผลข้อความสามารถดำเนินการต่อไปและในที่สุดก็รับและประมวลผลข้อความ
(การสื่อสารแบบอะซิงโครนัส)
ข้อดีของการสื่อสารแบบอะซิงโครนัส
ไม่จำเป็นต้องรอ ลูกค้าต้องส่งข้อความไปยังนายหน้าข้อความเท่านั้นและสามารถดำเนินการต่อไปได้โดยไม่ต้องรอและมั่นใจว่าข้อความจะถูกส่งไปยังปลายทางที่เกี่ยวข้อง
ข้อความที่มุ่งเน้นและ decoupling ไคลเอนต์ไม่จำเป็นต้องกังวลเกี่ยวกับข้อกำหนดของอินเทอร์เฟซของบริการระยะไกล แต่ต้องใส่ข้อความลงในคิวข้อความและรับผลลัพธ์เท่านั้น
2. JMS
1. บทนำ
ก่อนที่ JMS จะเกิดขึ้นนายหน้าข้อความแต่ละคนมีการใช้งานที่แตกต่างกันซึ่งทำให้รหัสข้อความระหว่างโบรกเกอร์ที่แตกต่างกันยากที่จะเป็นสากล JMS (บริการข้อความ Java) เป็นมาตรฐานที่กำหนด API ทั่วไปที่ใช้โบรกเกอร์ข้อความ นั่นคือการใช้งานทั้งหมดที่สอดคล้องกับข้อมูลจำเพาะใช้อินเทอร์เฟซทั่วไปคล้ายกับ JDBC ที่ให้อินเทอร์เฟซทั่วไปสำหรับการดำเนินการฐานข้อมูล
องค์ประกอบสำคัญหลายประการของ JMS:
ปลายทาง: ช่องที่ส่งข้อความจากผู้ส่ง
ConnectionFactory: โรงงานเชื่อมต่อใช้เพื่อสร้างวัตถุที่เชื่อมต่อ
การเชื่อมต่อ: อินเทอร์เฟซการเชื่อมต่อใช้เพื่อสร้างเซสชัน
เซสชัน: อินเทอร์เฟซเซสชันใช้เพื่อสร้างผู้ส่งผู้รับข้อความและวัตถุข้อความเอง
MessageConsumer: ผู้บริโภคข้อความ
MessageProducer: ผู้ผลิตข้อความ
xxxmessage: วัตถุประเภทต่าง ๆ รวมถึง 5 ประเภท: bytemessage, MapMessage, ObjectMessage, StreamMessage และ TextMessage
2. โมเดลข้อความ JMS
ระบบข้อความที่แตกต่างกันมีโมเดลข้อความที่แตกต่างกัน JMS มีสองรุ่น: คิว (จุดต่อจุด) และหัวข้อ (เผยแพร่/สมัครสมาชิก)
รุ่น JMS คิว (จุดต่อจุด)
ในรูปแบบเพียร์ทูเพียร์ผู้ผลิตข้อความจะสร้างข้อความและส่งไปยังคิวและจากนั้นผู้บริโภคข้อความจะนำออกจากคิวและบริโภคข้อความ แต่ไม่สามารถบริโภคได้ซ้ำ ๆ
ดังที่แสดงในภาพ:
ผู้ส่ง 1 ผู้ส่ง 2 และผู้ส่ง 3 แต่ละคนส่งข้อความไปยังเซิร์ฟเวอร์
ข้อความ 1, 2 และ 3 จะสร้างคิวตามลำดับและข้อความในคิวไม่ทราบว่าผู้รับรายใดจะถูกบริโภคโดย;
ตัวรับสัญญาณ 1, 2 และ 3 ตามลำดับดึงข้อความจากคิวเพื่อการบริโภค ทุกครั้งที่มีการดึงข้อความคิวจะลบข้อความซึ่งทำให้มั่นใจได้ว่าข้อความจะไม่ถูกใช้ซ้ำ ๆ
โมเดลคิว JMS ได้กลายเป็นโมเดล P2P (จุดต่อจุด)
หัวข้อ JMS (เผยแพร่/สมัครสมาชิก) รุ่น
ความแตกต่างที่ใหญ่ที่สุดระหว่างโมเดลหัวข้อ JMS และโมเดลคิว JMS อยู่ในส่วนของข้อความที่ได้รับ รูปแบบหัวข้อคล้ายกับบัญชีอย่างเป็นทางการของ WeChat ผู้รับที่สมัครรับบัญชีอย่างเป็นทางการสามารถรับข้อความที่ถูกผลักโดยบัญชีอย่างเป็นทางการ
ดังที่แสดงในภาพ:
สำนักพิมพ์ 1, 2, 3 เผยแพร่ 3 หัวข้อ 1, 2, 3 ตามลำดับ;
ด้วยวิธีนี้กลุ่มผู้ใช้ที่สมัครรับหัวข้อ 1: สมาชิก 1, 2, 3 สามารถรับหัวข้อ 1 ข้อความ; ในทำนองเดียวกันสมาชิก 4, 5, 6 สามารถรับหัวข้อ 2 ข้อความและสมาชิก 7, 8, 9 สามารถรับหัวข้อ 3 ข้อความได้
โมเดลหัวข้อ JMS ได้กลายเป็นรูปแบบหนอง/ย่อย
การเปรียบเทียบแต่ละองค์ประกอบในสองโหมด:
3. รูปแบบการเขียนโปรแกรม JMS แบบดั้งเดิม
ผู้ผลิต:
(1) สร้าง Connection Factory ConnectionFactory;
(2) สร้างการเชื่อมต่อโดยใช้โรงงานเชื่อมต่อ
(3) เริ่มการเชื่อมต่อ
(4) สร้างเซสชัน
(5) สร้างปลายทางสำหรับการส่งข้อความ
(6) สร้างผู้ผลิต
(7) สร้างประเภทข้อความและเนื้อหาข้อความ
(8) ส่งข้อความ
ผู้บริโภค:
(1) สร้าง Connection Factory ConnectionFactory;
(2) สร้างการเชื่อมต่อโดยใช้โรงงานเชื่อมต่อ
(3) เริ่มการเชื่อมต่อ
(4) สร้างเซสชัน
(5) สร้างปลายทางสำหรับการส่งข้อความ
(6) สร้างผู้บริโภค (7) สร้างประเภทข้อความ
(8) รับข้อความ
3. บทนำสู่ ActiveMQ
ActiveMQ เป็นรถบัสโอเพนซอร์สที่ได้รับความนิยมมากที่สุดที่ผลิตโดย Apache ActiveMQ เป็นการใช้งานผู้ให้บริการ JMS ที่รองรับข้อมูลจำเพาะ JMS1.1 และ J2EE 1.4 อย่างเต็มที่ แม้ว่าข้อมูลจำเพาะของ JMS ได้รับการแนะนำมาเป็นเวลานาน แต่ JMS ยังคงเล่นเป็นตำแหน่งพิเศษในแอปพลิเคชัน J2EE ของวันนี้
คุณสมบัติหลักของ Activemq:
การเขียนลูกค้าในหลายภาษาและโปรโตคอล ภาษา: Java, C, C ++, C#, Ruby, Perl, Python, PHP โปรโตคอลแอปพลิเคชัน:
OpenWire, Stomp Rest, WS การแจ้งเตือน, XMPP, AMQP
สนับสนุนข้อมูลจำเพาะ JMS1.1 และ J2EE 1.4 อย่างเต็มที่ (การคงอยู่, ข้อความ XA, ธุรกรรม)
สำหรับการสนับสนุนฤดูใบไม้ผลิ ActiveMQ สามารถฝังลงในระบบได้อย่างง่ายดายโดยใช้สปริงและยังรองรับคุณสมบัติ Spring 2.0 ผ่านการทดสอบของเซิร์ฟเวอร์ J2EE ทั่วไป (เช่น Geronimo, JBoss 4, Glassfish, WebLogic) ผ่านการกำหนดค่าของอะแดปเตอร์ทรัพยากร JCA 1.5 ActiveMQ สามารถปรับใช้กับเซิร์ฟเวอร์ J2EE 1.4 เชิงพาณิชย์ที่เข้ากันได้โดยอัตโนมัติและรองรับโปรโตคอลการส่งสัญญาณหลายรายการ: In-VM, TCP, SSL, NIO, UDP, JGroups, JXTA
รองรับการคงอยู่ของข้อความความเร็วสูงผ่าน JDBC และ Journal ซึ่งทำให้มั่นใจได้ว่ากลุ่มที่มีประสิทธิภาพสูงเซิร์ฟเวอร์ไคลเอนต์และการสนับสนุนแบบจุดต่อจุดสำหรับ AJAX
สนับสนุนการรวมกับแกนเพื่อโทรหาผู้ให้บริการ JMS แบบฝังตัวสำหรับการทดสอบได้อย่างง่ายดาย
4. Activemq การต่อสู้จริง
ลองมาดูกันว่า ActiveMQ ใช้คิวข้อความอย่างง่าย
รูปแบบการเขียนโปรแกรม JMS แบบดั้งเดิม
1. การใช้รหัสโมเดลคิวคิว JMS:
ผู้ผลิต:
แพ็คเกจ com.wgs.mq.queue; นำเข้า org.apache.activemq.activemqconnectionfactory; นำเข้า Javax.jms.*;/*** สร้างโดย genshenwang.nomico เมื่อปี 2017/10/19 */คลาสสาธารณะ activemqproducer {สตริงคงสุดท้ายส่วนตัว url = "tcp: // localhost: 61616"; สตริงคงสุดท้ายส่วนตัว queue_name = "queue-name"; โมฆะคงที่สาธารณะ (สตริง [] args) โยน jmsexception สร้างการเชื่อมต่อโดยใช้การเชื่อมต่อการเชื่อมต่อการเชื่อมต่อโรงงาน = connectionFactory.createConnection (); // 3 เริ่มการเชื่อมต่อการเชื่อมต่อ start (); // 4 สร้างเซสชันเซสชัน = การเชื่อมต่อการสร้าง (เท็จ, session.auto_acknowledge); // 5 สร้างปลายทางสำหรับการส่งปลายทาง Session.createProducer (ปลายทาง); // 7 สร้างข้อความข้อความข้อความข้อความ = เซสชัน. createTextMessage (); สำหรับ (int i = 1; i <= 100; i ++) {// 8 สร้างข้อความเนื้อหาข้อความข้อความ. settext ("ผู้ส่ง - 1 -Send Message:"+i); // 9 ส่งข้อความ MessageProducer.Send (TextMessage);} system.out.println (Conusmer:
แพ็คเกจ com.wgs.mq.queue; นำเข้า org.apache.activemq.activemqconnectionfactory; นำเข้า Javax.jms.*;/*** สร้างโดย genshenwang.nomico เมื่อปี 2017/10/19 */คลาสสาธารณะ activemqconsumer {สตริงคงสุดท้ายส่วนตัว url = "tcp: // localhost: 61616"; สตริงคงสุดท้ายส่วนตัว queue_name = "queue-name"; โมฆะคงที่สาธารณะ (สตริง [] args) โยน jmsexception สร้างการเชื่อมต่อโดยใช้การเชื่อมต่อการเชื่อมต่อการเชื่อมต่อโรงงานการเชื่อมต่อ = connectionFactory.createConnection (); // 3 เริ่มการเชื่อมต่อการเชื่อมต่อ start (); // 4 สร้างเซสชันเซสชัน = การเชื่อมต่อการสร้าง (เท็จ, session.auto_acknowledge); // 5 สร้างปลายทางสำหรับการส่งปลายทาง Session.createConsumer (ปลายทาง); MessageConsumer.setMessageListener (New MessageListener () {โมฆะสาธารณะ onMessage (ข้อความข้อความ) {// 7 สร้างข้อความข้อความข้อความข้อความ = (textMessage) ข้อความลอง {// 7 รับข้อความ {E.PrintStackTrace ();}}});}}2. JMS หัวข้อการใช้รหัสโมเดล:
ผู้ผลิต:
แพ็คเกจ com.wgs.mq.topic; นำเข้า org.apache.activemq.activemqconnectionfactory; นำเข้า Javax.jms.*;/*** เผยแพร่โหมดการสมัครสมาชิก* สร้างโดย genshenwang.nomico เมื่อปี 2017/10/19 */คลาสสาธารณะ activemqproducer {สตริงคงสุดท้ายแบบคงที่ url = "tcp: // localhost: 61616"; สตริงสุดท้ายคงที่ส่วนตัว topic_name = "หัวข้อ-ชื่อ"; โมฆะคงที่สาธารณะ (สตริง [] args) โยน jmsexception การเชื่อมต่อการเชื่อมต่อการเชื่อมต่อโรงงาน = connectionFactory.createConnection (); // 3 เริ่มการเชื่อมต่อการเชื่อมต่อ start (); // 4 สร้างเซสชันเซสชันเซสชัน = การเชื่อมต่อการสร้าง (เท็จ (เท็จ, เซสชั่น AUTO_ACKNOWLEDGE); // 5 สร้างปลายทางสำหรับการส่งข้อความ session.createProducer (ปลายทาง); // 7 สร้างข้อความข้อความข้อความข้อความ = เซสชัน. createTextMessage (); สำหรับ (int i = 1; i <= 100; i ++) {// 8 สร้างข้อความเนื้อหาข้อความข้อความ. settext ("ผู้ส่ง - 1 -Send Message:"+i); // 9 ส่งข้อความ MessageProducer.Send (TextMessage);} system.out.println (ผู้บริโภค:
แพ็คเกจ com.wgs.mq.topic; นำเข้า org.apache.activemq.activemqconnectionfactory; นำเข้า Javax.jms.*;/*** เผยแพร่โหมดการสมัครสมาชิก* สร้างโดย genshenwang.nomico เมื่อปี 2017/10/19 */คลาสสาธารณะ activemqconsumer {สตริงคงสุดท้ายส่วนตัว url = "tcp: // localhost: 61616"; สตริงสุดท้ายคงที่ส่วนตัว topic_name = "topic-name"; โมฆะคงที่สาธารณะ (สตริง [] args) โยน jmsexception การเชื่อมต่อการเชื่อมต่อการเชื่อมต่อโรงงาน = connectionFactory.createConnection (); // 3 เริ่มการเชื่อมต่อ start (); // 4 สร้างเซสชันเซสชันเซสชัน = การเชื่อมต่อการสร้าง (เท็จ, เซสชัน AUTO_ACKNOWLEDGE); // 5 สร้างปลายทางสำหรับการส่งปลายทาง Session.createConsumer (ปลายทาง); MessageConsumer.setMessageListener (New MessageListener () {โมฆะสาธารณะ onMessage (ข้อความข้อความ) {// 7 สร้างข้อความข้อความข้อความข้อความ = (textMessage) ข้อความลอง {// 7 รับข้อความ {E.PrintStackTrace ();}}});}}เทมเพลต JMS โดยใช้สปริง
แม้ว่า JMS จะจัดให้มีอินเทอร์เฟซแบบครบวงจรสำหรับโบรกเกอร์ข้อความทั้งหมดเช่น JDBC แต่ก็สามารถปรากฏได้อย่างซับซ้อนเมื่อจัดการการเชื่อมต่อคำสั่งชุดผลลัพธ์และข้อยกเว้น อย่างไรก็ตามฤดูใบไม้ผลิให้เรามี JMSTEMPLET เพื่อกำจัดรหัส JMS ซ้ำซ้อนและซ้ำซ้อน
ลองมาดูวิธีใช้ JMSTEMPLET เพื่อใช้คิวข้อความ
1. การใช้รหัสโมเดลคิวคิว JMS:
ไฟล์กำหนดค่า:
producer.xml:
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://ww.w3.org/2001/xml xmlns: context = "http://www.springframework.org/schema/context" XSI: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd "> <บริบท: Annotation-configFigFirative/> <! value = "tcp: // localhost: 61616"/> </ebean> <!-กำหนดค่าโรงงานการเชื่อมต่อ JMS ในฤดูใบไม้ผลิเพื่อเชื่อมต่อกับ connectionFactory ที่จัดทำโดย Activemq-> <bean id = "connectionFactory"> <property name = "targetConnectionFactory" ref = "targetConnection id = "jmstemplate"> <property name = "connectionFactory" ref = "connectionFactory"/> </ebean> <!-กำหนดค่าชื่อของปลายทางคิว-> <bean id = "queuedestination"> <constructor-arg value = "queue-spring-name"/> <constructor-arg value = "topic-spring-name"/> </ebean> <bean id = "Producerserviceimpl"/> </epeans>
consumer.xml:
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://ww.w3.org/2001/xml xmlns: context = "http://www.springframework.org/schema/context" XSI: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd "> <บริบท: Annotation-configFigFirative/> <! value = "tcp: // localhost: 61616"/> </ebean> <!-กำหนดค่าโรงงานการเชื่อมต่อ JMS ในฤดูใบไม้ผลิเพื่อเชื่อมต่อกับ connectionFactory ที่จัดทำโดย Activemq-> <bean id = "connectionFactory"> <property name = "targetConnectionFactory" ref = "เป้าหมาย id = "queuedestination"> <constructor-arg value = "queue-spring-name"/> </ebean> <!-กำหนดค่าผู้ฟังข้อความ-> <bean id = "cumperermessageListener"/> <! name = "connectionFactory" ref = "connectionFactory"/> <property name = "MessageListener" ref = "CumpererMessAgelistener"/> </ebean> <!-กำหนดค่าชื่อของปลายทางคิว-> <bean id = "topicDestination"> <constructor-arg value = "หัวข้อ"
ผู้ผลิต:
(1) เขียนอินเทอร์เฟซก่อน:
แพ็คเกจ com.wgs.jms.producer;/*** สร้างโดย genshenwang.nomico เมื่อ 2017/10/20 */อินเตอร์เฟสสาธารณะ activeMqProducerservice {void sendMessage (ข้อความสตริงสุดท้าย);}(2) การใช้งานส่วนต่อประสาน:
แพ็คเกจ com.wgs.jms.producer; นำเข้า org.springframework.beans.factory.annotation.autoWired; นำเข้า org.springframework.jms.core.jmstemplate; นำเข้า org.springframework.jms.core.messagecreator; สร้างโดย Genshenwang.Nomico เมื่อวันที่ 2017/10/20 */คลาสสาธารณะ activeMqProducerserViceImpl ใช้ activeMqProducerservice {@autowired JMSTEMPLET JMSTEMPLETE; @Resource (name = "queuedestination") ปลายทางปลายทาง; โมฆะสาธารณะ sendMessage (ข้อความสตริงสุดท้าย) {JMSTEMPLATE {textMessage textMessage = session.createtextMessage (ข้อความ); return textMessage;}}); system.out.println ("ผู้ผลิต - 1 -Send ข้อความสำเร็จ:" + ข้อความ);}}(3) การทดสอบ:
แพ็คเกจ com.wgs.jms.producer; นำเข้า org.springframework.context.support.classpathxmlapplicationContext;/*** สร้างโดย genshenwang.nomico เมื่อ 2017/10/20 */คลาสสาธารณะ activeMqProducermain {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {classpathxmlapplicationContext บริบท = ใหม่ classPathxMlapplicationContext ("producer.xml"); ActiveMqProducerservice service = context.getBean {service.sendMessage ("ทดสอบ" + i);} context.close ();}} ผู้บริโภค:
(1) สร้างผู้ฟังข้อความ:
แพ็คเกจ com.wgs.jms.consumer; นำเข้า javax.jms.jmsexception; นำเข้า Javax.jms.message; นำเข้า Javax.jms.messagelistener; นำเข้า Javax.jms.TextMessage;/*** สร้างโดย Genshenwang.nomico ในปี 2017/10/20 */คลาสสาธารณะ consumermessageListener ใช้ messageListener {โมฆะสาธารณะ onMessage (ข้อความข้อความ) {ลอง {textMessage textMessage = (textMessage) ข้อความ; system.out.println ("consumer -1 -receive message:" + textMessage.getText ();(2) การทดสอบ:
แพ็คเกจ com.wgs.jms.consumer; นำเข้า org.springframework.context.support.classpathxmlapplicationContext;/*** สร้างโดย genshenwang.nomico เมื่อ 2017/10/20 */คลาสสาธารณะ activeMqConsumermain {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {classpathxmlapplicationcontex2. JMS หัวข้อการใช้รหัสโมเดล:
เพียงแค่เปลี่ยนการคิวที่ปรากฏในรหัสข้างต้นเป็นหัวข้อการกำหนด
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้เกี่ยวกับการแนะนำ JMS และรหัสจริงของ Activemq ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!