В настоящее время у нас есть архитектура развертывания, в которой множество сервисов, ориентированных на данные, предоставляются через 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
к бинам data-service и @Produces
, чтобы сделать (в данном случае OrganisationAndMandatesRegister
CDI инъекционным. Идея состоит в том, что в будущем мы можем упаковать наше приложение и упаковать услуги данныхвместе с бизнес-сервисом в одном корпоративном архиве.
В последнее время мы перешли на JBOSS EAP7.2 (Wildfly 8?), и внезапно мы видим все виды неожиданных задержек и проблем с транзакциями.
Myесть подозрение, что способ, которым мы получаем бины, является фактором этих проблем. Например: я предполагаю, что область действия зависит от жизненного цикла бизнес-EJB, но для каждого вызова locate()
в бизнес-сервисе создается новый экземпляр данных.служба создается.
Итак: каков наилучший способ создания удаленного компонента (через RMI) при использовании CDI? Следует ли принимать во внимание область видимости, учитывая, что оба типа служб не имеют состояния (или это делается автоматически)