В настоящее время у нас есть архитектура развертывания, в которой набор сервисов, ориентированных на данные, предоставляется бизнес-сервисам через RMI. Оба типа (сервисы, ориентированные на данные, и бизнес-сервисы) являются сеансовыми компонентами без сохранения состояния. Каждый пакет интерфейса службы данных (содержащий удаленные интерфейсы) также имеет локатор, который выполняет поиск JNDI. Мы делаем это так, чтобы мы могли вызывать сервис, ориентированный на данные, из любой точки логики бизнес-сервиса.
Вот как выглядит локатор:
public final class OMRLocator {
private static final Logger LOG = Logger.getLogger( OMRLocator.class );
private static final String ORG_WILDFLY_INITIAL_CTX_FACTORY = "org.wildfly.naming.client.WildFlyInitialContextFactory";
private OMRLocator() {
}
@Produces
public static OrganisationsAndMandatesRegister locate() {
try {
Properties ctxProp = new Properties();
ctxProp.put( Context.INITIAL_CONTEXT_FACTORY, ORG_WILDFLY_INITIAL_CTX_FACTORY );
InitialContext ctx = new InitialContext( ctxProp );
return (OrganisationsAndMandatesRegister) ctx.lookup( OrganisationsAndMandatesConstants.REMOTE_NAME );
}
catch ( NamingException ex ) {
LOG.log( Level.WARN, "Cannot reach: " + OrganisationsAndMandatesConstants.REMOTE_NAME, ex );
return null;
}
}
}
Мы работали на JBOSS EAP6 и начали экспериментировать с CDI. Следовательно, мы добавили beans.xml
в bean-компоненты службы данных и @Produces
, чтобы сделать (в данном случае OrganisationAndMandatesRegister
CDI инжектируемым). Идея состоит в том, что в будущем мы могли бы переупаковать наше приложение и упаковать службы данных вместе с бизнес-службой. в одном корпоративном архиве.
В последнее время мы перешли на JBOSS EAP7.2 (Wildfly 8?) и вдруг увидели всевозможные непредвиденные задержки и проблемы с транзакциями.
Я подозреваю, что причиной этих проблем является то, как мы получаем бобы. Например: я предполагаю, что область действия зависит от жизненного цикла бизнес-компонента EJB, но для каждого вызова locate()
в бизнес-службе создается новый экземпляр службы данных.
Итак: как лучше всего создать удаленный компонент (через RMI) при использовании CDI? Должен ли я принимать во внимание область действия, учитывая, что оба типа служб не имеют состояния (или это делается автоматически)?