Джоэл говорит, что " все нетривиальные абстракции в некоторой степени протекают ". Я обнаружил, что это очень применимо к JavaEE. Учтите, что исключение JMS может быть чем-то временным, например, полной очередью. Это типичная проблема быстрого производителя / медленного потребителя, и в идеале производитель должен снизить скорость, чтобы соответствовать скорости потребителя. Но ошибка также может быть фатальной, например, ошибка авторизации. В первом случае повторные попытки в конечном итоге оказываются успешными (обычно), тогда как во втором случае никакие повторные попытки не помогут, пока люди не вмешаются, чтобы исправить ошибку авторизации.
Так что вы делаете в своей переносимой программе для решения этой проблемы? Один из подходов - рассматривать каждое исключение JMS как фатальное. Закройте все ваши объекты и переинициализируйте программу. Вроде как убийство мухи кувалдой, но очень портативно. Кроме того, вы можете проверить исключение JMS, чтобы увидеть, является ли это временной или фатальной ошибкой, и предпринять соответствующие действия. Это гораздо более эффективно, но, поскольку исключения JMS зависят от поставщика, его трудно переносить. Некоторые из моих клиентов использовали подход, заключающийся в написании специфических для поставщика графических оболочек, которые перехватывают исключения JMS и выполняют с ними соответствующие ему задачи, чтобы код мог быть «переносимым» (подумайте: программный эквивалент уровня аппаратной абстракции).
И, конечно, это просто обработка исключений. Подобные проблемы существуют по всем направлениям. Рассмотрим детали переподключения. Некоторые транспорты накапливают сбой соединения с приложением или контейнером. Некоторые скрывают это от мысли, что код не должен знать об этом. Но реальность такова, что практически все приложения для обмена сообщениями должны будут предоставлять предупреждение или запись в журнал, если сеть постоянно отключена. Вы бы не хотели, чтобы приложение зависало навсегда, если произошел сбой в сети, верно? Так что, в конечном счете, даже приложению, работающему на транспорте, которое обеспечивает прозрачное переподключение, необходимо кодировать при сбое соединения. Специфические особенности и поведение транспортного провайдера будут вытекать через абстракцию JMS.
За мои деньги JavaEE делает навыки переносимыми для всех транспортных провайдеров. Приложение должно быть достаточно осведомлено о базовом транспортном провайдере, чтобы иметь дело с абстракциями, которые всплывают на поверхность. Если вы можете избежать утечек, приложение переносимо, но не более того.