2016-05-10 3 views
2

Я довольно новичок в Java, и в настоящее время я пишу веб-приложение, используя ряд микросервисов на основе Dropwizard и Java8 SE. Теперь я хочу интегрировать очередь сообщений для связи Async между службами и начать с использования облачной очереди, такой как Amazon SQS. Однако я не хочу блокировать себя в конкретном провайдере облачных вычислений, поэтому мне бы хотелось перейти к другому провайдеру или позже использовать что-то вроде RabbitMQ или ActiveMQ. Итак, мой вопрос: существует ли в Java инфраструктура, которая позволяет это? Например, с Hibernate я могу переключаться между базами данных с простым изменением конфигурации, есть ли эквивалент для очередей сообщений?Java Message Queue Abstraction

Я потратил немало времени на изучение этого, но не смог найти окончательного ответа в любом месте, до сих пор нашел;

  • JMS, который немного похож на то, что я после того, как выглядит, но только будет доступен в издании Java EE и может потребовать и сервер приложений? Это верно?
  • AMQP, который выглядит как протокол низкого уровня для совместимости очереди сообщений. Существует также Apache Qpid Proton, который выглядит как чистая библиотека сообщений AMQP, но все документы и примеры для Java, похоже, используют JMS.
  • Все обучающие программы, которые я могу найти для определенных MQ (Rabbit и т. Д.), Используют эти клиентские библиотеки определенных очередей.
  • Очевидно, я мог бы добавить свой собственный уровень абстракции, но не хочу изобретать колесо, и я подозреваю, что я не первый разработчик, который хочет сделать что-то подобное.

ответ

1

Так же, как Hibernate или просто JDBC, в этом случае вы можете переключаться между разными поставщиками баз данных, JMS API позволяет вам переключаться между брокерскими сообщениями или провайдерами сообщений по своему усмотрению, не нарушая ваш код, если вы не используете какие-либо конкретные расширения поставщика в ваш код.

JMS - это всего лишь API, нет JMS-протокола только API, который реализует различные вендоры и предоставляет вам клиента для использования с поставщиком сообщений. Вы можете использовать JMS API из своего кода Java 8 просто отлично, вам просто нужно затянуть банку JMS API, используя любой инструмент управления построением, который вы выбрали вместе с клиентским банком от поставщика, которого вы, случается, использовали в то время , Чтобы узнать, как захватить лицензионную версию JMS API с лицензией Apache, см. Ответ на этот вопрос question.

Из того, что я вижу, Amazon действительно предлагает реализацию JMS, документация here, похоже, хорошо ее охватывает.

Когда вы решите переключиться на другой продукт обмена сообщениями, такой как ActiveMQ или RabbitMQ, есть предложения JMS, предлагаемые каждым, которые позволяют вам заменять клиента и не нужно изменять какой-либо существующий код (опять же, если вы не используя любые расширения поставщика). Если вы переключитесь на решение для обмена сообщениями, которое предлагает поддержку AMQP 1.0, то есть реализация JMS поверх AMQP 1.0, предлагаемая проектом Apache Qpid here.

Я думаю, вам нужно потратить некоторое время на ознакомление с спецификацией JMS и некоторыми учебниками, чтобы получить представление о том, что такое JMS и как использовать JMS и JNDI для создания агностического кода провайдера.

1

JMS в мире java - один из самых распространенных API для создания/завершения сообщений по очередям. При использовании JMS вы можете использовать любой JMS-провайдер (activeMQ, rabbitMQ ...), и если вы не совершаете прямого вызова вашему провайдеру (только для вызова JMS API), вы можете легко переключаться между собой.

Для того, чтобы сообщение отправлялось от производителя, потребителю нужен брокер (программное обеспечение, которое будет обрабатывать их). Брокеры могут размещаться на выделенных серверах или внедряться в ваше приложение (я бы не рекомендовал второй вариант).

AMQP - это более современный протокол и является проводным. Некоторые брокеры могут обрабатывать как AMQP, так и JMS.

Оба AMQP и JMS могут предоставить вам достойную абстракцию. Однако оба они имеют свои пределы. С одной стороны, с JMS может возникнуть соблазн использовать некоторую настройку функции/тонкой настройки, а затем вы можете стать зависимой от реализации из-за определенного набора действий. С другой стороны, AMPQ, учитывая выбранную версию AMQP (0,9 или 1,0+), вы можете выбрать только нескольких брокеров, потому что эти версии сильно отличаются, и в настоящий момент большинство брокеров поддерживает только один из них.

+0

Спасибо за это, так же как JMS доступен только в Java EE? Есть ли какие-либо возможности использовать его в Java SE. Моя проблема заключается в том, что Java EE доступен только для Java 7, и я уже использовал множество функций Java 8 в своем коде, поэтому переход на Java 7 потребует много повторного факторинга! –

+0

Уверенный, что вы можете использовать его с помощью Java SE, просто включите в свой проект дорожки, такие как javax.jms. Вы можете сделать это напрямую или с помощью таких инструментов, как maven. – Vaaith

0

Проверьте ваш провайдер, если вы ищете JMS 2.0, некоторые - то есть ActiveMQ - поддерживают только JMS 1.1.