1. 비동기 통신
우리가 이전에 접촉 한 RMI, Hessian 및 기타 기술은 모두 동기 통신 메커니즘입니다. 클라이언트가 원격 메소드를 호출하면 클라이언트는 계속 실행되기 전에 원격 메소드가 완료 될 때까지 기다려야합니다. 이 기간 동안 클라이언트가 차단됩니다 (이것은 매우 나쁜 사용자 경험을 유발합니다).
(동기 커뮤니케이션)
동기 커뮤니케이션이 프로그램 간 상호 작용하는 유일한 방법은 아닙니다. 비동기 통신 메커니즘에서 클라이언트는 서비스가 메시지를 처리 할 때까지 기다릴 필요가 없습니다.
(비동기 통신)
비동기 통신의 장점
기다릴 필요가 없습니다. 클라이언트는 메시지를 메시지 중개인에게만 보내야하며 기다리지 않고 다른 작업을 계속 수행 할 수 있으며 메시지가 해당 대상으로 전달 될 것이라고 확신합니다.
메시지 지향 및 분리. 클라이언트는 원격 서비스의 인터페이스 사양에 대해 걱정할 필요가 없으며 메시지를 메시지 대기열에 넣고 결과를 가져와야합니다.
2. JMS
1. 소개
JMS가 등장하기 전에 각 메시지 브로커는 다른 구현을 가졌으므로 다른 브로커들 사이의 메시지 코드가 보편적이기가 어렵게 만들었습니다. JMS (Java Message Service)는 메시지 브로커를 사용하는 일반적인 API를 정의하는 표준입니다. 즉, 사양을 준수하는 모든 구현은 데이터베이스 작업에 공통 인터페이스를 제공하는 JDBC와 유사한 공통 인터페이스를 사용합니다.
JMS의 몇 가지 중요한 요소 :
대상 : 메시지가 발신자로부터 전송되는 채널.
ConnectionFactory : 연결 공장, 연결된 객체를 만드는 데 사용됩니다.
연결 : 세션을 만드는 데 사용되는 연결 인터페이스.
세션 : 세션 인터페이스, 발신자, 메시지 수신자 및 메시지 객체 자체를 작성하는 데 사용됩니다.
MessageConsumer : 메시지의 소비자.
MessageProducer : 메시지 제작자.
XXXMESSAGE : 5 가지 유형을 포함한 다양한 유형의 메시지 객체 : ByTemessage, MapMessage, ObjectMessage, StreamMessage 및 TextMessage.
2. JMS 메시지 모델
다른 메시지 시스템마다 메시지 모델이 다릅니다. JMS는 큐 (Point-to-Point)와 주제 (게시/구독)의 두 가지 모델을 제공합니다.
JMS 큐 (Point-to-Point) 모델
피어 투 피어 모델에서 메시지 제작자는 메시지를 생성하여 큐로 보내고 메시지 소비자가 큐에서 꺼내어 메시지를 소비하지만 반복적으로 소비 할 수는 없습니다.
그림과 같이 :
발신자 1, 발신자 2 및 발신자 3은 각각 서버에 메시지를 보냅니다.
메시지 1, 2 및 3은 순서대로 큐를 형성하며 대기열의 메시지는 어떤 수신자가 소비할지 알지 못합니다.
수신기 1, 2 및 3은 각각 소비를 위해 대기열에서 메시지를 가져옵니다. 메시지를 가져올 때마다 큐가 메시지를 삭제하여 메시지가 반복적으로 소비되지 않도록합니다.
JMS 대기열 모델도 P2P (Point to Point) 모델이되었습니다.
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) 연결 팩토리 연결을 만듭니다.
(2) 연결 공장을 사용하여 연결을 만듭니다.
(3) 연결을 시작하십시오.
(4) 세션을 만듭니다.
(5) 메시지 보내기 대상을 만듭니다.
(6) 생산자를 만듭니다.
(7) 메시지 유형 및 메시지 내용을 만듭니다.
(8) 메시지 보내기;
소비자:
(1) 연결 팩토리 연결을 만듭니다.
(2) 연결 공장을 사용하여 연결을 만듭니다.
(3) 연결을 시작하십시오.
(4) 세션을 만듭니다.
(5) 메시지 보내기 대상을 만듭니다.
(6) 소비자 생성 (7) 메시지 유형을 만듭니다.
(8) 메시지 수신;
3. ActiveMQ 소개
ActiveMQ는 Apache가 제작 한 가장 인기있는 강력한 오픈 소스 메시지 버스입니다. ActiveMQ는 JMS1.1 및 J2EE 1.4 사양을 완전히 지원하는 JMS 제공 업체 구현입니다. JMS 사양은 오랫동안 도입되었지만 JMS는 오늘날 J2EE 응용 프로그램 중에서도 여전히 특별한 위치를 차지하고 있습니다.
ActiveMQ 주요 기능 :
여러 언어 및 프로토콜로 고객을 작성합니다. 언어 : Java, C, C ++, C#, Ruby, Perl, Python, Php. 응용 프로그램 프로토콜 :
OpenWire, Stomp REST, WS 알림, XMPP, AMQP
JMS1.1 및 J2EE 1.4 사양에 대한 완전한 지원 (Persistence, XA 메시지, 트랜잭션)
스프링 지원을 위해 Spring을 사용하여 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 및 저널을 통한 고속 메시지 지속성을 지원하여 고성능 클러스터, 클라이언트 서버 및 AJAX에 대한 지점 간 지원을 보장합니다.
Axis와의 통합을 지원하여 테스트를 위해 임베디드 JMS 제공 업체를 쉽게 호출하십시오.
4. ActiveMQ 실제 전투
ActiveMQ가 간단한 메시지 대기열을 구현하는 방법을 살펴 보겠습니다.
전통적인 JMS 프로그래밍 모델
1. JMS 큐 모델 코드 구현 :
생산자:
패키지 com.wgs.mq.queue; import org.apache.activemq.activemqconnectionfactory; import javax.jms.*;/*** 2017/10/19에 Genshenwang.nomico에 의해 생성되었습니다. */public class activemqproducer {private static final string url = "tcp : // localhost : 61616"; private static final string queue_name = "queue-name"; public static void main (string) jmsexception {// 1 생성 공동 연결 공장 ConnectionConnection ffactory = new Activecconnectionctory (url); 연결 팩토리 연결 연결을 사용한 연결 = ConnectionFactory.createConnection (); 3 연결 연결을 시작합니다. 연결을 시작합니다. session.createProducer (대상); // 7 메시지 textMessage textMessage = session.creatextMessage (); for (int i = 1; i <= 100; i ++) {// 8 메시지 내용 작성 textMessage.settext ( "+i);"+i); // 9 메시지 메시지 메시지 producer.send (textMessage);} system.out.println ( "Sections.Conusmer :
패키지 com.wgs.mq.queue; import org.apache.activemq.activemqconnectionfactory; import javax.jms.*;/*** 2017/10/19에 Genshenwang.nomico에 의해 생성되었습니다. */public class activemqconsumer {private static final string url = "tcp : // localhost : 61616"; private static final string queue_name = "queue-name"; public static void main (string) jmsexception {// 1은 연결 공장 연결을 만들어냅니다. 연결 팩토리 연결 연결을 사용하여 연결을 만듭니다. 연결 연결 = ConnectionFactory.createConnection (); 3 연결 연결을 시작합니다. 세션 .CreateConsumer (대상); MessageConsumer.setMessagelistener (new Messagelistener () {public void onMessage (메시지 메시지) {// 7 메시지 작성 textMessage textMessage = (TextMessage) 메시지; {// 7 wick message system.out.println ( "소비자 -1-" {e.printstacktrace ();}});}}2. JMS 주제 모델 코드 구현 :
생산자:
패키지 com.wgs.mq.topic; import org.apache.activemq.activemqconnectionfactory; import javax.jms.*;/*** genshenwang.nomico가 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)은 Jmsexception을 던졌습니다. 연결 팩토리 연결 = ConnectionFactory.CreateConnection (); 3 연결 연결을 시작합니다. session.createProducer (대상); // 7 메시지 작성 textMessage textMessage = session.creatextMessage (); for (int i = 1; i <= 100; i ++) {// 8 메시지 내용 작성 textMessage.settext ( "+i);"+i); // 9 메시지 메시지 메시지 producer.send (textMessage);} system.out.println ( "Sections.소비자:
패키지 com.wgs.mq.topic; import org.apache.activemq.activemqconnectionfactory; import javax.jms.*;/*** genshenwang.nomico가 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) jmsexception {// 1/1 생성 팩토리 연결 factoryconnection connectionnection = new ActiveConnection (URL); 연결 팩토리 연결 연결 = ConnectionFactory.CreateConnection (); // 3 Connection.Start (); // 4 세션 세션 생성 세션 세션 = Connection.Createsession (False, Session.Auto_ackNowledge); // 5 메시지 대상을 보내기위한 대상을 생성합니다. 세션 .CreateConsumer (대상); MessageConsumer.setMessAgelistener (new Messagelistener () {public void onMessage (메시지 메시지) {// 7 텍스트 메신저 TextMessage textMessage = (TextMessage) 메시지 작성 {// 7 수신 메시지 System.out.println ( "Consumer -1 -[" + TextMessage.gettextect () + ")). {e.printstacktrace ();}});}}스프링을 사용하는 JMS 템플릿
JMS는 JDBC와 같은 모든 메시지 브로커에 대해 통합 인터페이스를 제공하지만 연결, 문, 결과 세트 및 예외를 처리 할 때 복잡해 보일 수 있습니다. 그러나 Spring은 JMStemplate를 제공하여 중복 및 중복 JMS 코드를 제거합니다.
JMStemplate을 사용하여 메시지 대기열을 구현하는 방법을 살펴 보겠습니다.
1. JMS 큐 모델 코드 구현 :
구성 파일 :
Producer.xml :
<? xml 버전 = "1.0"alcoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans"xmlns : xsi = "http://ww.w.w3.org/2001/xmlschema-instance" xmlns : context = "http://www.springframework.org/schema/context"xsi : schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/schema/sprideans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd "> <context : annotation-config/> <!-annotation-config/> <! value = "tcp : // localhost : 61616"/> </bean> <!-spring spring에서 JMS 연결 팩토리를 activemq에서 제공 한 연결 기능에 연결하도록 구성하십시오-> <bean id = "connectionFactory"> <property name = "targetConnectionFactory"ref = "targetConnectionCactory"/>>-<bean jmstemplate 구성을 보내십시오. id = "jmstemplate"> <property name = "ConnectionFactory"ref = "ConnectionFactory"/> </bean> <!-큐 대상의 이름을 구성-> <bean id = "queuedestination"> <constructor-arg value = "queue-spring-name"/> </bean> <!-큐 대상의 이름을 구성 "> <생성자-arg 값 = "Topic-Spring-name"/> </bean> <bean id = "producerserviceimpl"/> </beans>
소비자 .xml :
<? xml 버전 = "1.0"alcoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans"xmlns : xsi = "http://ww.w.w3.org/2001/xmlschema-instance" xmlns : context = "http://www.springframework.org/schema/context"xsi : schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/schema/sprideans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd "> <context : annotation-config/> <!-annotation-config/> <! value = "tcp : // localhost : 61616"/> </bean> <!-activemq에서 제공하는 연결 기능에 연결하기 위해 스프링의 JMS 연결 공장을 구성합니다-> <bean id = "ConnectionFactory"> <property name = "targetConnectionFactory"ref = "TargetConnectionFactory"/> <!-queue 대상의 이름을 확인하십시오. id="queueDestination"> <constructor-arg value="queue-spring-name"/> </bean> <!-- Configure the message listener --> <bean id="consumerMessageListener"/> <!-- Configure the name of the queue destination --> <bean id="jmsContainer"> <property name="destination" ref="queueDestination"/> <property name="connectionFactory" ref = "ConnectionFactory"/> <속성 이름 = "MessageListener"ref = "ConsiderSeGelistener"/> </bean> <!-큐 대상의 이름을 구성-> <Bean id = "TopicDestination"> <Constructor-Arg value = "Topic-Spring-Name"/> </beans>
생산자:
(1) 먼저 인터페이스를 작성하십시오.
Package com.wgs.jms.producer;/*** 2017/10/20에 Genshenwang.nomico가 작성했습니다. */public interface activeMqProducersErvice {void sendMessage (최종 문자열 메시지);}(2) 인터페이스 구현 :
패키지 com.wgs.jms.producer; import org.springframework.bean.beans.core.annotation.autowired; import org.springframework.jms.core.jmstemplate; import org.springframework.jms.core.messagecreator; import javax.annot.resource; javax.jms*; 2017/10/20의 Genshenwang.nomico. */public class activeMqProduceServiceImpl은 activeMqProducerService {@autowired jmstemplate jmstemplate; @Resource (name = "queuedestination") 목적지 대상; 공개 void sendMessage (최종 문자열 메시지) {jmstemplate.send (대상, session jmsecreator (session) jmsecreator (session jmsegecece) {jmstemplate.send (public session) {jmstemplate.send (public session) {jmstemplate.send (public session). {TextMessage TextMessage = session.createTextMessage (메시지); return TextMessage;}}); System.out.println ( "Producer -1- 성공적으로 메시지 :" + 메시지);}}(3) 테스트 :
패키지 com.wgs.jms.producer; import org.springframework.context.support.classpathxmlapplicationcontext;/*** 2017/10/20에 Genshenwang.nomico에 의해 생성되었습니다. */public class activemqProduceRmain {public static void main (string [] args) {classPathXmlApplicationContext Context = new ClassPathXmlApplicationContext ( "Producer.xml"); activeMqProducerService Service = Context.getBean (activeMqPructionService.class); {service.SendMessage ( "테스트" + i);} context.close ();}} 소비자:
(1) 메시지 청취자 만들기 :
package com.wgs.jms.consumer; import javax.jms.jmsexception; import javax.jms.message; import javax.jms.messagelistener; import javax.jms.textmessage;/*** 2017/10/20에 Genshenwang.nomico가 생성했습니다. */Public Class ConsidEsAgelistener는 Messagelistener를 구현합니다. {public void onMessage (메시지 메시지) {try {textMessage textMessage = (TextMessage) 메시지; System.out.println ( "Consumer -1 -Receive 메시지 :" + TextMessage.getText ()) {e.printstacktrace (Jmseception e)}} {);(2) 테스트 :
패키지 com.wgs.jms.consumer; import org.springframework.context.support.classpathxmlapplicationContext;/*** 2017/10/20에 Genshenwang.nomico에 의해 생성되었습니다. */public class activemqconsumermain {public static void main (string [] args) {classPathXmlApplicationContext Context = new ClassPathXmlApplicationContext ( "Consumer.xml");}}2. JMS 주제 모델 코드 구현 :
위 코드에 나타나는 대기열을 주제화로 변경하십시오.
요약
위는 JMS의 소개 및 실제 ActiveMQ 코드에 대한이 기사의 모든 내용입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!