2015-11-18 5 views
1

Message-Driven Bean Classметод финализации в MessageDrivenBean

требования к управляемым сообщениям класса бин:

It must not define the finalize method. 

Что является причиной вышеуказанного требования?

+1

Хороший вопрос, я нашел связанный jsr (19), но больше нет подробно https://www.jcp.org/en/jsr/detail?id=19#3 – HRgiger

ответ

1

Если вы посмотрите в спецификации EJB, вы увидите, что это требование для всех типов EJB.

http://download.oracle.com/otndocs/jcp/ejb-3.1-pfd-oth-JSpec/

Я не могу найти однозначный ответ, но, глядя на различных форумах Java в течение последних 13 лет, вы можете увидеть ответы последовательно говорят, что, поскольку контейнер будет определять жизненный цикл EJB, финализация никогда не может быть вызвана (или вызвана, когда вы не ожидаете), и было бы опасно ее использовать.

https://community.oracle.com/thread/1582366

1

Причина в том, что жизненный цикл боб управляется контейнером (или EJB, CDI или разными), поэтому вы должны использовать методы аннотированные с @PreDestroy, чтобы сделать вашу очистку, когда боб собирается быть утилизированы , Помните, что вызов finalize во время удаления объекта не гарантируется JVM, поэтому вы никогда не должны использовать его даже в среде Java SE (у Java нет концепции деструкторов, как на C++).

0

MDB не собирает мусор, если только он не сработает с количеством раз, настроенным на сервере. Таким образом, этот метод никогда не может быть вызван вообще, поскольку MDB объединяются в пул MDB и просто повторно используются по мере необходимости. Поскольку метод finalize вызывается GC, тогда разумно, что вы не должны определять его в своем MDB, поскольку весь его жизненный цикл управляется контейнером EJB. Вы не получите никакого исключения, если вы переопределили метод, поскольку он уже унаследован от класса Object, но он непредсказуем, когда будет вызван код внутри него. Кроме того, будет слишком поздно для доступа к любым ресурсам в MDB, так как контейнер EJB уже выполнил очистку для закрытия соединений и т. Д.