Jakarta ee Wildfly 8:ejb远程代理线程安全吗?

Jakarta ee Wildfly 8:ejb远程代理线程安全吗?,jakarta-ee,wildfly-8,java-ee-7,Jakarta Ee,Wildfly 8,Java Ee 7,我有以下情况,在客户端ear应用程序中有CDI@ApplicationScopedbean,它在@PostConstruct回调上执行远程SLSB查找,并缓存获得的代理: @ApplicationScoped @Typed({ ServiceInterface.class }) public class RemoteServiceProxy implements ServiceInterface { /** * Remote service. */ priva

我有以下情况,在客户端ear应用程序中有CDI
@ApplicationScoped
bean,它在
@PostConstruct
回调上执行远程SLSB查找,并缓存获得的代理:

@ApplicationScoped
@Typed({ ServiceInterface.class })
public class RemoteServiceProxy implements ServiceInterface
{
    /**
     * Remote service.
     */
    private RemoteService remoteService;

    /**
     * Default constructor.
     */
    public RemoteServiceProxy()
    {
        super();
    }

    /**
     * PostConstruct callback.
     *
     * @throws RuntimeException
     *             Error while looking up remote proxy
     */
    @PostConstruct
    protected void onPostConstruct()
    {
        try
        {
            remoteService = serviceLocator.lookup(ActivityRemoteEntityService.class);

            Properties jndiProps = new Properties();
            jndiProps.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
            jndiProps.put(Context.PROVIDER_URL, "http-remoting://localhost:8080");
            jndiProps.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
            jndiProps.put("jboss.naming.client.ejb.context", "true");

            Context context = new InitialContext(jndiProps);

            remoteService = (RemoteService) context.lookup(
                "application.backend/application.backend-service//RemoteServiceImpl!com.application.remote.RemoteService");
        } catch (NamingException e)
        {
            throw new RuntimeException(e);
        }
    }

    ... 

}
我想知道字段
remoteService
中缓存的代理是否是线程安全的,因此
RemoteServiceProxy
可以使用
@ApplicationScoped
进行注释,或者我必须为每次调用执行新的代理查找?还是最好使用
@无状态


提前感谢

EJB 3.2规范有以下内容:

3.4.9对会话Bean引用的并发访问

允许获取会话bean引用并尝试从多个线程并发调用同一引用对象。但是,每个线程上产生的客户端行为取决于目标bean的并发语义。有关会话bean并发行为的详细信息,请参见第4.3.13节和第4.8.5节

§4.3.13基本上说,对会话bean的并发调用将由容器序列化

§4.8.5描述了单例会话bean并发访问的语义

因此,为了兼容,远程代理需要本质上是线程安全的,因为它必须遵循“会话bean引用”所需的语义


也就是说,如果您将这样一个引用存储在
@Singleton
EJB中,那么这个引用一次只能并发处理一个方法调用(因为这样的调用是“序列化的”)。这可能会导致您的应用程序出现不希望出现的瓶颈。

感谢您的回答,我的疑问是,将wildfly代理引用存储在单例bean(CDI ApplicationScoped)中是否安全,该bean可同时访问,换句话说,wildfly代理实现是线程安全的吗?控制并发的不是@Singleton,而是会话bean。一个会话bean引用(您的代理)=>一个会话bean实例