目前我们有一个部署架构,即一堆面向数据的服务通过 RMI 暴露给业务服务。两种类型(面向数据的服务和业务服务)都是无状态会话 bean。每个数据服务接口包(包含远程接口)也有一个定位器,用于进行 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-beans 中添加了 a 和@Produces
以使(在这种情况下OrganisationAndMandatesRegister
CDI 可注入。想法是未来我们可能会重新打包我们的应用程序并将数据服务与业务服务一起打包在一个企业中档案。
最近我们迁移到 JBOSS EAP7.2(Wildfly 8?),突然间我们看到了各种意想不到的延迟和事务问题。
我怀疑我们获取 bean 的方式是造成这些问题的一个因素。例如:我想范围取决于业务 EJB 生命周期,但是对于locate()
业务服务中的每次调用,都会生成一个新的数据服务实例。
那么:使用 CDI 时(通过 RMI)生成远程 bean 的最佳方法是什么?鉴于两种类型的服务都是无状态的(或者这是自动完成的),我是否应该考虑范围界定?