Отладка API службы сообщений Java (JMS) с помощью Lightrun

Отладка API службы сообщений Java (JMS) с помощью Lightrun

5 мая 2022 г.

API службы сообщений Java (JMS) был разработан Sun Microsystems во времена [Java EE] (https://en.wikipedia.org/wiki/Jakarta_EE). API JMS предоставляет нам простые абстракции обмена сообщениями, включая генератор сообщений, потребитель сообщений и т. д. API обмена сообщениями позволяют нам помещать сообщение в «очередь» и потреблять сообщения, помещенные в указанную очередь. Это чрезвычайно полезно для систем с высокой пропускной способностью — вместо того, чтобы тратить время пользователя на выполнение медленных операций в режиме реального времени, корпоративное приложение может отправлять сообщения. Этот неблокирующий подход обеспечивает чрезвычайно высокую пропускную способность при сохранении надежности в масштабе.


Сообщение содержит транзакционный контекст, который обеспечивает некоторые гарантии доставляемости и надежности. В результате мы можем опубликовать сообщение в методе, а затем просто вернуться, что обеспечивает такие же гарантии, как и при записи в базу данных ACID.


Мы можем думать об обмене сообщениями как о списке рассылки сообщества. Вы отправляете сообщение на адрес электронной почты, который представляет определенный список. Это сообщение получает каждый, кто подписывается на этот список. В этом случае тема сообщения представляет собой адрес списка рассылки сообщества. Вы можете опубликовать в нем сообщение, и обработчик службы сообщений Java может использовать прослушиватель сообщений для получения указанного события.


Важно отметить, что в JMS есть две модели обмена сообщениями: модель публикации и подписки (которую мы обсуждали здесь), а также двухточечный обмен сообщениями, который позволяет отправлять сообщения в определенное место назначения.


Давайте пробежимся по быстрой демонстрации.


Простая демонстрация


Для отладки вызовов службы сообщений Java я создал простое демонстрационное приложение, исходный код которого можно найти здесь (https://github.com/lightrun-platform/lightrun/tree/main/examples).


Эта демонстрация JMS представляет собой простой API журнала базы данных — это микросервис, который вы можете использовать для публикации записи журнала, которая затем асинхронно записывается в базу данных. Затем приложения RESTful могут использовать этот API журнала базы данных для добавления записи в журнал базы данных без дополнительных затрат на доступ к базе данных.


Этот код реализует основной веб-сервис:


```java


@RestController


@RequiredArgsConstructor


открытый класс EventRequest {


частный финал JmsTemplate jmsTemplate;


закрытый конечный EventService eventService;


частный финал Moshi moshi = new Moshi.Builder().build();


@PostMapping("/добавить")


событие public void(событие @RequestBody EventDTO) {


String json = moshi.adapter(EventDTO.class).toJson(event);


jmsTemplate.send («событие», сеанс ->


session.createTextMessage(json));


@GetMapping("/список")


публичный список listEvents() {


вернуть eventService.listEvents();


Обратите внимание на метод event(), который отправляет сообщение в тему события. Я не обсуждал тела сообщений раньше, чтобы упростить задачу, но обратите внимание, что в этом случае я просто передаю строку JSON в качестве тела. Хотя JMS поддерживает сериализацию объектов, использование этой возможности имеет свои сложности, и я хочу, чтобы код оставался простым.


Чтобы дополнить основной веб-сервис, нам нужно создать прослушиватель, который обрабатывает входящие сообщения:


```java


@Составная часть


@RequiredArgsConstructor


открытый класс EventListener {


закрытый конечный EventService eventService;


частный финал Moshi moshi = new Moshi.Builder().build();


@JmsListener (пункт назначения = «событие»)


public void handleMessage (String eventDTOJSON) выдает IOException {


eventService.storeEvent(moshi.adapter(EventDTO.class).fromJson(eventDTOJSON));


Прослушиватель вызывается со строкой JSON, которая отправляется прослушивателю, которую мы анализируем и отправляем в службу.


Отладка скрытого кода


Самое замечательное в абстракциях, таких как Spring и JMS, заключается в том, что вам не нужно писать много шаблонного кода. К сожалению, ориентированное на сообщения промежуточное программное обеспечение этого типа скрывает множество хрупких деталей реализации, которые могут дать сбой по пути.


Это особенно болезненно в производственном сценарии, когда трудно понять, возникла ли проблема из-за того, что сообщение не было отправлено должным образом. Тут на помощь приходит Лайтран.


Вы можете размещать действия Lightrun (снимки, журналы и т. д.) непосредственно в API-интерфейсах платформы и реализациях служб обмена сообщениями. Это позволяет нам определить, работают ли селекторы сообщений должным образом и действительно ли срабатывает прослушиватель сообщений.


С помощью Spring с поддержкой JMS, как показано выше, мы можем открыть JmsTemplate и добавить снимок в метод execute:



Как видите, действие вызывается при отправке в тему. Мы можем просмотреть фрейм стека, чтобы увидеть тему, которая получает сообщение, и использовать условия, чтобы сузить правильный обработчик для сообщений.


Мы можем поместить соответствующий снимок в источник сообщения, чтобы мы могли отслеживать поток. Например. снимок в EventRequest может дать нам некоторое представление. Мы можем копать и в другом направлении.


В приведенном выше стеке вы можете видеть, что метод execute вызывается методом send в строке 584. Метод execute оборачивает вызывающую программу, поэтому операция будет асинхронной. Мы можем пойти дальше по стеку, перейдя к замыканию и поместив туда снимок:



Обратите внимание, что здесь мы можем поставить условие по конкретной теме и сузить круг вопросов.


TL;DR


Мы выбираем системы обмена сообщениями, чтобы сделать наше приложение надежным. Однако корпоративные системы обмена сообщениями очень сложно отлаживать в производственной среде, что снижает их надежность. Мы можем видеть логи в таргете сообщений, но что произойдет, если мы до него не дошли?


С Lightrun мы можем размещать действия на всех уровнях приложений для обмена сообщениями. Это помогает нам сузить круг проблем независимо от стандарта обмена сообщениями или платформы. Вы можете выполнить все это, используя [бесплатный уровень] (https://lightrun.com/free).


Также опубликовано [Здесь] (https://talktotheduck.dev/debugging-the-java-message-service-jms-api-using-lightrun)



Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE