Мы переносим бин 1.1 StartUp, который ранее использовал интерфейсы IBM:
<session id="StartUp">
<ejb-name>StartUp</ejb-name>
<home>com.ibm.websphere.startupservice.AppStartUpHome</home>
<remote>com.ibm.websphere.startupservice.AppStartUp</remote>
<ejb-class>org.bean.StartUpBean</ejb-class>
<session-type>Stateful</session-type>
<transaction-type>Container</transaction-type>
</session>
в стандарт EJB 3.1.До сих пор мы писали код для bean-компонента без использования собственной реализации IBM:
@Startup
@Singleton
public class StartUpBean{
@PostConstruct
public void start() {
...
helper.runHelper(); // in new class
}
}
Сначала у нас были проблемы с порядком развертывания, потому что StartupBean запускался сразу после модуля.Мы решили это, используя другой порядок в application.xml.Однако одна проблема все еще остается.
В вспомогательном методе, вызываемом из метода start этого компонента, у нас есть некоторый код, который ищет компонент 1.1 без сохранения состояния с использованием имени JNDI.Этот компонент создает новый объектный компонент (1.1), вызывая метод create в новой транзакции (используя reguires_new в xml-дескрипторе).Затем он должен зафиксировать эту транзакцию, чтобы сохранить эту сущность, и вызвать функцию поиска, которая ищет эту запись в базе данных.Это выглядит так:
void runHelper(){
...
oldRemote = Server.lookup(OldBean.JNDI, OldBean.class);
oldBean.prepareApp(); //prepareApp has requires new transaction attribute
findThatNewEntity(key); // FinderException (not in database)
}
И в старом bean-компоненте без сохранения состояния 1.1
void prepareApp(){
entityHome = Server.lookup(JNDI_NAME, Data.class);
entityHome.create(key, value, value2);
}
Я на 100% уверен, что в предыдущей версии bean-компонента StartUp, который использовал интерфейсы IBM, был создан объекти хранится.Теперь это не так.Я боюсь, что транзакции в какой-то степени не поддерживаются в момент запуска приложения.Это так?Или есть какой-нибудь способ заставить использовать транзакции или какой-то обходной путь?Спасибо.