МИНОБРНАУКИ РОССИИ САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ «ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА) Кафедра ВТ
ОТЧЕТ по лабораторной работе №4
по дисциплине «Распределенные системы» Тема: JAVA MESSAGE SERVICE
Студенты гр. 8308 |
|
Треско М.Ю. |
|
|
Сергеев В.С. |
Преподаватель |
|
Бекенева Я.А. |
Санкт-Петербург
2022
Цель работы
Познакомиться с технологией JMS.
Основные теоретические положения:
Java Message Service - стандарт промежуточного ПО для рассылки сообщений, позволяющий приложениям, выполненным на платформе Java EE, создавать, посылать, получать и читать сообщения.
Коммуникация между компонентами, использующими JMS, асинхронна (процедура не дожидается ответа на своё сообщение) и независима от исполнения компонентов.
JMS поддерживает две модели обмена сообщениями: «от пункта к пункту» (объект Queue) и «издатель-подписчик» (объект Topic).
Модель «от пункта к пункту» характеризуется следующим:
1.Каждое сообщение имеет только одного адресата
2.Сообщение попадает в «почтовый ящик», или «очередь» адресата и может быть прочитано когда угодно. Если адресат не работал в момент отсылки сообщения, сообщение не пропадёт.
3.После получения сообщения адресат посылает извещение.
Модель «издатель-подписчик» характеризуется следующим:
1.Подписчик подписывается на определённую «тему»
2.Издатель публикует своё сообщение. Его получают все подписчики этой
темы
3.Получатель должен работать и быть подписан в момент отправки сообщения
Задание на лабораторную работу
Cоздать приложение, отправляющее сообщение в queue, и message-driven bean, читающий отправленное в queue сообщение.
2
Код программы
Таблица 1 - Исходный код
Application.java
/*
*Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
*Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
*/
package hello;
import javax.jms.ConnectionFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jms.DefaultJmsListenerContainerFactoryConfigurer; import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean; import org.springframework.jms.annotation.EnableJms;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory; import org.springframework.jms.config.JmsListenerContainerFactory; import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.support.converter.MappingJackson2MessageConverter; import org.springframework.jms.support.converter.MessageConverter;
import org.springframework.jms.support.converter.MessageType;
@SpringBootApplication
@EnableJms
public class Application {
3
@Bean
public JmsListenerContainerFactory<?> myFactory(ConnectionFactory connectionFactory,
DefaultJmsListenerContainerFactoryConfigurer configurer) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
//This provides all boot's default to this factory, including the message converter configurer.configure(factory, connectionFactory);
//You could still override some of Boot's default if necessary.
return factory;
}
@Bean // Serialize message content to json using TextMessage public MessageConverter jacksonJmsMessageConverter() {
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter(); converter.setTargetType(MessageType.TEXT);
converter.setTypeIdPropertyName("_type"); return converter;
}
public static void main(String[] args) { // Launch the application
ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
JmsTemplate jmsTemplate = context.getBean(JmsTemplate.class);
// Send a message with a POJO - the template reuse the message converter System.out.println();
System.out.print("Receiver: ");
String To = System.console().readLine();
4
System.out.print("Message: ");
String Msg = System.console().readLine();
System.out.println("Sending message to " + To + "...");
jmsTemplate.convertAndSend("message_queue", new Message(To, Msg));
}
}
Message.java
/*
*Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this
license
*Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
*/
package hello;
public class Message { private String receiver;
private String body;
public Message() {
}
public Message(String receiver, String body) { this.receiver = receiver;
this.body = body;
}
public String getReceiver() { return receiver;
5
}
public void setReceiver(String to) { this.receiver = to;
}
public String getBody() { return body;
}
public void setBody(String body) { this.body = body;
}
}
Receiver.java
/*
*Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this
license
*Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
*/
package hello;
import org.springframework.jms.annotation.JmsListener; import org.springframework.stereotype.Component;
@Component
public class Receiver {
@JmsListener(destination = "message_queue", containerFactory = "myFactory")
6
public void receiveMessage(Message message) {
System.out.println("Received message for " + message.getReceiver() + ": " + message.getBody());
}
}
Пример работы
Рисунок 1 - Ввод сообщения
7
Рисунок 2 - Сообщение доставлено
Вывод
В ходе выполнения лабораторной работы были получены навыки написания приложений, использующих механизм обмена сообщениями JMS.
8