Портирование приложения JMS на MQ - PullRequest
4 голосов
/ 13 апреля 2011

Сегодня, если мы создадим приложение с использованием JMS API (используя MDB в качестве прослушивателей сообщений, разместим его, скажем, GlassFish или Weblogic 10), а завтра предположим, что трафик сходит с ума, можем ли мы портировать это приложение без изменений кода для какого-либо продукта? как Websphere MQ ... потому что теоретически MQ больше похож на выделенного JMS-провайдера ...

Ответы [ 4 ]

4 голосов
/ 13 апреля 2011

Да и нет. (Ответ на все лучшие вопросы всегда «зависит».)

Если приложение соответствует спецификации JMS, то оно должно работать без изменений на любом JMS-совместимом поставщике. Это хорошая новость.

Плохая новость заключается в том, что действительно важно, как провайдер внедрил JMS. Например, раздел 6.5 спецификации JMS 1.1 говорит об этом по темам:

Многие темы группы Pub / Sub провайдеров в иерархии и предоставляют различные варианты подписки на части иерархия. JMS места нет ограничения на то, что объект Тема представляет собой. Это может быть лист в иерархия тем, или это может быть большая часть иерархии (для подписавшись на общий класс информация).

Организация тем и гранулярность подписок на них является важной частью Pub / Sub архитектура приложения. JMS делает не указывать политику, как это должно быть сделано. Если приложение использует преимущества конкретного поставщика механизм группировки тем, он должен документ это. Если приложение установлен с использованием другого поставщика, работа администратора заключается в построить эквивалентную тему архитектура и создать эквивалент Предметы темы.

Это означает, что определенные части спецификации открыты для интерпретации провайдером JMS-транспорта. Владелец приложения сам определит способ сопоставления этих различий при переносе приложений.

Другим аспектом этого вопроса является то, что даже если за спецификацией строго следуют два транспортных провайдера, поведение API может отличаться. Примером этого является управление соединением. Некоторые провайдеры пропускают соединения прозрачно для клиента, другие просят клиента переустановить последовательность соединений после сбоя. Оба подхода могут быть на 100% совместимы с JMS, но оба требуют другой логики приложения.

Таким образом, ответ заключается в том, что соблюдение API-интерфейса JMS делает вас очень близкими к полностью переносимым, а требуемый объем переноса зависит от различий в том, как поставщик транспорта интерпретирует части спецификации и / или реализованные функции, которые неоднозначны в спецификации.

1 голос
/ 21 апреля 2011

Разработчикам очень легко испытать искушение (или иногда необходимость) использовать проприетарную функциональность вендора в приложении на основе JMS.За короткий период времени, потраченный на использование JMS, я заметил четыре причины, по которым разработчик может прибегнуть к использованию проприетарного API.

Во-первых, получение Destination и ConnectionFactory объектов из службы именования неудобно,особенно для разработчика, новичка в JMS, который не хочет тратить время на изучение команд администрирования JMS, прежде чем сможет написать приложение.Возможно, было бы удобнее использовать проприетарные функции производителя для непосредственного создания Destination и ConnectionFactory объектов.

Во-вторых, продукты JMS обычно предлагают качество обслуживания, превышающее те, которые определены в JMS.Спецификация.Если эти качества обслуживания связаны, скажем, с Session, Producer или Consumer, то для поставщика естественно обеспечить проприетарные set<Name>() операции с этими типами.Проще говоря, не все проприетарные качества обслуживания могут быть инкапсулированы в администрируемых объектах.

В-третьих, в случае сбоя операции, связанной с JMS, она выдает (подтип) JMSException.Разработчик приложения может пожелать обработать перехваченное исключение одним из нескольких способов, в зависимости от характера исключения.Однако в спецификации JMS говорится, что две из трех частей информации, предоставляемой JMSException, являются собственностью поставщика JMS.Из-за этого разработчику, возможно, придется полагаться на информацию, принадлежащую поставщику, содержащуюся в исключении, при принятии решения, как ее обрабатывать.

Наконец, JMS указывает, что сообщение состоит из трех частей: (1) поля заголовка, (2) произвольные свойства (то есть имя = значение пары) и (3) тело.Предполагаемое использование (2) - поддержка гибкого выбора сообщений в пользовательских приложениях.Например, приложение-производитель, работающее, скажем, в Лондоне, может добавить location = London к свойствам сообщения перед его отправкой.Затем приложение-потребитель может использовать селектор сообщений "(location = 'London')", чтобы убедиться, что оно получает только сообщения с этим значением свойства.Это звучит неплохо.Плохо то, что спецификация JMS резервирует имена свойств, начинающиеся с JMS_<vendor>, для использования поставщиками JMS, и некоторые поставщики используют такие свойства для указания собственного качества обслуживания для каждого сообщения.Разработчик, желающий использовать проприетарное качество обслуживания для каждого сообщения, должен будет изменить код приложения-производителя, чтобы он устанавливал проприетарное свойство перед отправкой сообщения.

Предупреждение T.Rob оИерархии тем - это еще одна проблема, о которой следует опасаться.

0 голосов
/ 18 апреля 2011

Поскольку JMS является относительно простым API (по сравнению с JDBC и т. Д.), Он остается достаточно переносимым между реализациями, при условии, что вы примете некоторые базовые меры, чтобы начать с .

Что касается повышения производительности от WebSphereMQ, я не уверен, что вы найдете это именно так. Если вы используете «точка-точка», возможно. Но если вы делаете Pub / Sub, это маловероятно. См. Этот бенчмарк , который, по общему признанию, опубликован конкурентом, но использует сторонний бенчмарк и на самом деле довольно щедр для некоторых участников с открытым исходным кодом.

0 голосов
/ 13 апреля 2011

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

IBM предоставляет набор библиотек Java, которые ссылаются только на пакет javax.jms, поэтому, пока вы не допустили каких-либо специфических для поставщика улучшений в своем коде, вы должны иметь возможность вставлять в библиотеки MQ, чтобы иметь MQ станьте вашим провайдером JMS. (Однако вам может потребоваться выполнить некоторое администрирование с помощью инструментария MQ для выполнения таких задач, как настройка подписок JMS, однако ... Я не использовал аспекты JMS в MQ, только основные библиотеки.)

Посетите эту страницу IBM , чтобы узнать подробнее о библиотеках MQ JMS.

Если вы использовали только WebSphere MQ в качестве примера, то да, возможно, вам все равно придется проверить соответствие поставщиков-кандидатов спецификации, но JMS уже давно и я думаю, что все предложения крупных игроков будут подходящий провайдер JMS.

...