Каков наилучший способ обработки исключений в Java MDB? - PullRequest
1 голос
/ 28 января 2011

Я получил этот вариант использования:

Эта диаграмма представляет модель предприятия.Технология Java EE в Weblogic 10.3 с использованием пружинного фреймворка для IoC и AOP, JPA для постоянного использования с пружинным jpatemplate, интеграция пружин для фрейма взаимодействия.Как вы можете видеть, между службой и шлюзом нет никакой связи, поскольку интеграция с пружиной добавляет весь необходимый волшебный сахар.

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

Таким образом, единственное проверенное исключение, которое я обрабатываю, находится на MDB

@Override
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void onMessage(Message message) {
        try {
            TextMessage textMessage = (TextMessage) message;
            String stringMessage = textMessage.getText();

            OnlineEventMessage<? extends Serializable> event = eventMessageParser.parse(stringMessage);

            legacyEventMessageService.handle(event);
        } catch (JMSException e) {
            logger.error("si e' verificato un errore JMS nel processamento dell'evento {}", message, e);
        }
    }

Я заметил, что если я получаю NPE, например, для какого-либо компонента цепочки, сообщение откатываетсяОчередь JMS и процесс зацикливается обратно.

Каков наилучший способ обработки исключений в этом сценарии?Поймать все исключения времени выполнения в MDB?

С уважением, Массимо

1 Ответ

1 голос
/ 29 января 2011

Каков наилучший способ обработки исключений в этом сценарии? Поймать все исключения runtimeException в MDB?

Это зависит от того, чего вы хотите достичь. Если вы считаете, что хотите предотвратить откат сообщения. Это верно?

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

Короче говоря, вы хотите, чтобы ваш MDB вообще был транзакционным?

Также обратите внимание, что контекст транзакции от отправителя не распространяется на MDB.

Немного не по теме, но вы действительно уверены, что вам нужен jpatemplate? Кажется, почти все согласились с тем, что JPA API сам по себе хорош и не нуждается в каких-либо «улучшениях» от Spring, включая сами SpringSource.

...