1. Асинхронное общение
RMI, Hessian и другие технологии, с которыми мы вступили в контакт, представляют собой все синхронные механизмы связи. Когда клиент вызывает удаленный метод, клиент должен подождать, пока удаленный метод не будет завершен, прежде чем продолжить выполнять. Клиент будет заблокирован в течение этого периода (это вызывает очень плохой пользовательский опыт).
(Синхронная связь)
Синхронная связь - не единственный способ взаимодействия между программами. В асинхронном механизме связи клиенту не нужно ждать, пока служба будет обрабатывать сообщение, может продолжать выполнять и, наконец, получать и обработать сообщение.
(Асинхронное общение)
Преимущества асинхронного общения
Не нужно ждать. Клиент должен только отправить сообщение в брокер сообщений и может продолжать выполнять другие задачи, не ожидая, и он уверен, что сообщение будет доставлено в соответствующий пункт назначения.
Ориентированный на сообщения и развязка. Клиенту не нужно беспокоиться о спецификациях интерфейса удаленной службы, ему нужно только поместить сообщение в очередь сообщения и получить результаты.
2. JMS
1. Введение
Прежде чем JMS появился, у каждого брокера сообщения была другая реализация, которая затрудняла код сообщения между разными брокерами, чтобы быть универсальными. JMS (служба сообщений Java) - это стандарт, который определяет общий API, который использует брокеры сообщений. То есть во всех реализациях, которые соответствуют спецификациям, используют общий интерфейс, аналогичный JDBC, обеспечивающим общий интерфейс для операций базы данных.
Несколько важных элементов JMS:
Пункт назначения: канал, на который отправляется сообщение от отправителя.
ConnectionFactory: Factory Connection, используемая для создания подключенных объектов.
Подключение: интерфейс соединения, используемый для создания сеанса.
Сеанс: Интерфейс сеанса, используемый для создания отправителя, получателя сообщения и самого объекта сообщения.
MessageConsumer: потребитель сообщения.
ProductProducer: производитель сообщения.
Xxxmessage: различные типы объектов сообщений, включая 5 типов: Bytemessage, MapMessage, ObjectMessage, StreamMessage и TextMessage.
2. Модель сообщений JMS
Разные системы сообщений имеют разные модели сообщений. JMS предоставляет две модели: очередь (точка-точка) и тема (опубликовать/подписаться).
Модель QUEUE (точка-точка)
В одноранговой модели производитель сообщений дает сообщение и отправляет его в очередь, и затем потребитель сообщения выводит его из очереди и потребляет сообщение, но не может быть употреблен неоднократно.
Как показано на картинке:
Отправитель 1, отправитель 2 и отправитель 3 каждый отправляет сообщение на сервер;
Сообщения 1, 2 и 3 будут сформировать очередь по порядку, а сообщения в очереди не знают, какой получатель будет потреблять;
Приемники 1, 2 и 3 соответственно приносят сообщение из очереди для потребления. Каждый раз, когда сообщение будет получено, очередь удаляет сообщение, которое гарантирует, что сообщение не будет употребляться неоднократно.
Модель очереди JMS также стала моделью P2P (точка к точке).
Модель JMS Topic (Publish/Price)
Самая большая разница между тематической моделью JMS и моделью очереди JMS заключается в части полученного сообщения. Тематическая модель аналогична официальной учетной записи WeChat. Получатели, которые подписываются на официальную учетную запись, могут получать сообщения, выдвинутые официальной учетной записью.
Как показано на картинке:
Издатели 1, 2, 3 опубликовать 3 темы 1, 2, 3 соответственно;
Таким образом, группа пользователей, которая подписывается на тему 1: подписчики 1, 2, 3 могут получать тема 1 сообщения; Аналогичным образом, подписчики 4, 5, 6 могут получать темы 2 сообщения, а подписчики 7, 8, 9 могут получать темы 3 сообщения.
Тематическая модель JMS также стала моделью PUS/SUB.
Сравнение каждого элемента в двух режимах:
3. Традиционная модель программирования JMS
Продюсер:
(1) Создать заводскую подключение ConnectionFactory;
(2) создать соединение, используя завод по соединению;
(3) запустить соединение;
(4) создать сеанс;
(5) Создайте пункт назначения для отправки сообщения;
(6) создать продюсера;
(7) создать тип сообщения и содержимое сообщения;
(8) отправить сообщение;
Потребитель:
(1) Создать заводскую подключение 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, а также поддерживает функции 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
Интеграция поддержки с оси, чтобы легко вызвать встроенного поставщика JMS для тестирования
4. ActiveMQ Фактический бой
Давайте посмотрим, как ActiveMQ реализует простую очередь сообщения.
Традиционная модель программирования JMS
1. Реализация кода модели jms queue queue:
Продюсер:
пакет com.wgs.mq.queue; import org.apache.activemq.activemqconnectionFactory; импорт javax.jms.*;/*** Создан genshenwang.nomico на 2017/10/19. */public class ActiveMQProducer {private static final String URL = "tcp://localhost:61616";private static final String QUEUE_NAME = "queue-name";public static void main(String[] args) throws JMSException {//1 Create a connection factory ConnectionFactoryConnectionFactory connectionFactory = new ActiveMQConnectionFactory(URL);//2 Создайте соединение, используя подключение Connection Connection = ConnectionFactory.CreateConnection (); // 3 Запустить соединение Connection.Start (); // 4 Создать сеанс сеанса = connection.createssession (false, session.auto_acknowledge); // 5 Создать назначение для отправки назначения сообщения = session.createqueue (Queue_name); session.createproducer (destination); // 7 Создать сообщение Textmessage textmessage = session.createTextMessage (); для (int i = 1; i <= 100; i ++) {// 8 Создать содержимое сообщения textmessage.settext ("Sender- 1 -Send Сообщение:"+i); // 9 Отправить сообщение сообщения producer.send (textmessage);} system.out.println ("Сообщение Sentecly");Conusmer:
пакет com.wgs.mq.queue; import org.apache.activemq.activemqconnectionFactory; импорт javax.jms.*;/*** Создан genshenwang.nomico на 2017/10/19. */public class ActiveMQConsumer {private static final String URL = "tcp://localhost:61616";private static final String QUEUE_NAME = "queue-name";public static void main(String[] args) throws JMSException {//1 Create a connection factory ConnectionFactoryConnectionFactory connectionFactory = new ActiveMQConnectionFactory(URL);//2 Создать соединение с использованием подключения Connection Connection = connectionFactory.createConnection (); // 3 Запустить соединение Connection.Start (); // 4 Создать сеанс сеанса = connection.createssession (false, session.auto_acknowledge); // 5 Создать назначение для отправки назначения сообщения = session.createqueue (Queue_name); session.createconsumer (назначение); MessageConsumer.setMessageListener (new MessageListener () {public void onMessage (сообщение сообщения) {// 7 Создать сообщение TextMessage TextMessage = (TextMessage); try {// 7 Принять систему сообщений.out.println ("Consumer- 1 - Получение сообщения: [ + textmessage.gettext ()"] ") {e.printstacktrace ();}}});}}2. Реализация кода модели JMS Topic:
Продюсер:
пакет 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) throws JMSException {//1 Create a connection factory ConnectionFactoryConnectionFactory connectionFactory = new ActiveMQConnectionFactory(URL);//2 Create a connection using Подключение соединения подключения Connection = ConnectionFactory.createConnection (); // 3 Запустить соединение Connection.Start (); // 4 Создать сеанс сеанса = connection.createssession (false, session.auto_acknowledge); // 5 Создать назначение для отправки сообщений с темой назначения = session.createTopic (tepan_name); // Create Message ProvectProducer messageProducer = producer voldrucer = vescremer = vescremer = voldrucer = voldrucrecer = create producer messageRecer = session.createproducer (destination); // 7 Создать сообщение TextMessage TextMessage = session.createTextMessage (); для (int i = 1; i <= 100; i ++) {// 8 Создать содержимое сообщения textmessage.settext ("Sender- 1 -Send Сообщение:"+i); // 9 Отправить сообщение сообщения producer.send (textmessage);} system.out.println ("Сообщение Sentecly");Потребитель:
пакет 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) throws JMSException {//1 Create a connection factory ConnectionFactoryConnectionFactory connectionFactory = new ActiveMQConnectionFactory(URL);//2 Create a connection using a connection factory Connection connection = connectionFactory.createConnection();//3 Start the connection.start();//4 Create a session Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);//5 Create the destination for sending the message Destination destination = session.createTopic(TOPIC_NAME);//6 Create a consumer MessageConsumer messageConsumer = session.createconsumer (назначение); MessageConsumer.setMessageListener (new MessageListener () {public void onMessage (сообщение сообщения) {// 7 Создать сообщение TextMessage TextMessage = (TextMessage); try {// 7 получение системы сообщений.out.println ("consumer- 1 - получение сообщения: [" + textmessage.gettext () "]") {e.printstacktrace ();}}});}}Шаблоны JMS с использованием пружины
Хотя JMS предоставляет унифицированный интерфейс для всех брокеров сообщений, таких как JDBC, он может показаться сложным при обработке соединений, операторов, наборов результатов и исключений. Тем не менее, Spring предоставляет нам JMStemplate для устранения избыточного и дублирования кода JMS.
Давайте посмотрим, как использовать JMStemplate для реализации очередей сообщений.
1. Реализация кода модели jms queue queue:
Файл конфигурации:
продюсер.xml:
<? xml version = "1.0" Encoding = "UTF-8"?> <Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: context = "http://www.springframework.org/schema/context" xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.spramework.org/schema/beans/springbeans.s.xsspring.s.s.xspring.s.xspring.s.spring.s.spring.s.s.spring.s.spring.s.spring.s.spers.s.spring.s.spring.s.spers.s.spers.s.spring.s.spers.s.spers.s.spersbembembems. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd "> <xtrenew: annotation-config/> <!-ConnectionFator value = "tcp: // localhost: 61616"/> </bean> <!-Настройка фабрики соединения JMS в пружине, чтобы подключиться к ConnectionFactory, предоставленному ActiveMQ-> <Bean Id = "ConnectionFactory"> <свойство = "TargetConnectionFactActory" ref = "targetContocory"/> </bean> <! id = "jmstemplate"> <name = "connectionFactory" ref = "connectionFactory"/> </bean> <!-Настройте имя назначения очереди-> <bean id = "queuedestination"> <Конструктор-arg value = "queue-spring-name"/> </bean> <!-Конфигурирование названия назначения Queue-> </> </> </> </bean> <! <constructor-arg value = "topic-spring-name"/> </bean> <bean id = "Производство serviceImpl"/> </beans>
Consumer.xml:
<? xml version = "1.0" Encoding = "UTF-8"?> <Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: context = "http://www.springframework.org/schema/context" xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.spramework.org/schema/beans/springbeans.s.xsspring.s.s.xspring.s.xspring.s.spring.s.spring.s.s.spring.s.spring.s.spring.s.spers.s.spring.s.spring.s.spers.s.spers.s.spring.s.spers.s.spers.s.spersbembembems. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd "> <xtrenew: annotation-config/> <!-ConnectionFator value = "tcp: // localhost: 61616"/> </bean> <!-Настройка фабрики соединения JMS в пружине, чтобы подключиться к ConnectionFactory, предоставленному ActiveMQ-> <Bean ID = "ConnectionFactory"> <Свойство = "TargetConnectionFactfact" ref = "targetContocory"/> </bean> <! id = "queuedestination"> <constructor-arg value = "queue-spring-name"/> </bean> <!-Настройка слушателя сообщения-> <bean id = "consumerseSsageListener"/> <!-Настройте имя назначения в Queue queueDeTection "/> <bean id =" jmscontainer " name = "connectionFactory" ref = "connectionFactory"/> <name = "messageListener" ref = "consumpermessagelistener"/> </bean> <!-Настройте имя назначения очереди-> <bean id = "topendestination"> <constructor-arg value = "tope-spring-name"/> </bean> </beans> </beans> </beans> </bean
Продюсер:
(1) Сначала напишите интерфейс:
Пакет com.wgs.jms.producer;/*** Создан Genshenwang.nomico 2017/10/20. */public interface ActiveMqProducerService {void sendmessage (final String Message);}(2) Реализация интерфейса:
пакет com.wgs.jms.producer; import org.springframework.beans.factory.annotation.autowired; import org.springframework.jms.core.jmstemptat Genshenwang.nomico 2017/10/20. */открытый класс ActiveMQProducerServiceImpl реализует ActiveMQProducerService {@Autowired JMStemplate JMStemplate; @Resource (name = "queuedestination") пункт назначения; public void sendmessage (final строка {TextMessage TextMessage = session.createTextMessage (message); return TextMessage;}}); System.out.println ("Производитель - 1 -Send Message успешно:" + Message);}}(3) Тест:
пакет com.wgs.jms.producer; import org.springframework.context.support.classpathxmlapplicationContext;/*** Создан genshenwang.nomico на 2017/10/20. */public Class ActiveMQProducerMain {public static void main (string [] args) {classpathxmlapplication context = new classpathxmlapplicationcontext ("Производитель.xml"); ActiveMQProducerService service = get.getbean (ActiveMQProducerService.class); {service.sendmessage ("test" + 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. */открытый класс ConsumperMessageListener реализует MessageListener {public void onMessage (сообщение сообщением) {try {textMessage TextMessage = (TextMessage) Сообщение; System.out.println ("Consumer -1 -Receive Сообщение:" + TextMessage.getText ());} Catch (JMsexception e) {e.printStage.getText ());} catch (jmsexception e) {e.print quctack);(2) Тест:
пакет com.wgs.jms.consumer; import org.springframework.context.support.classpathxmlapplicationContext;/*** Создан genshenwang.nomico на 2017/10/20. */public Class ActiveMqconsumerMain {public static void main (string [] args) {classPathxMlApplicationContext context = new ClassPathxMlapplicationContext ("consumer.xml");}}2. Реализация кода модели JMS Topic:
Просто измените очередь, которое появляется в приведенном выше коде на тематическую проверку.
Суммировать
Выше приведено все содержание этой статьи о введении JMS и фактическом кодексе ActiveMQ. Я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!