2016-11-17 4 views
2

У меня есть следующие ситуации, в приложении клиента уха есть CDI @ApplicationScoped боб, который выполняет удаленный поиск SLSB на @PostConstruct обратного вызова и кэширует полученный прокси:Wildfly 8: безопасна ли прокси-сервер ejb?

@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, или мне нужно выполнить новый прокси-поиск для каждого вызова? Или лучше использовать @Stateless?

Заранее спасибо

ответ

1

EJB-3,2 Технические характеристики имеет следующие сказать:

3.4.9 Параллельное Доступ к Session Bean Ссылки

Допустимо получить ссылку сессионного компонента и попытаться одновременно вызвать один и тот же ссылочный объект из нескольких потоков. Однако возникающее поведение клиента в каждом потоке зависит от семантики параллелизма целевого компонента. См. Раздел 4.3.13 и раздел 4.8.5 для подробного описания поведения параллелизма для сессионных компонентов.

В §4.3.13 в основном говорится, что параллельные вызовы сессионных компонентов будут сериализованы контейнером.

§4.8.5 описывает семантику вокруг одновременного доступа к сеансовым компонентам Singleton.

Поэтому, чтобы быть совместимым, удаленный прокси-сервер должен был быть по существу безопасным потоком, поскольку он должен следовать семантике, требуемой для «ссылки на сессионный компонент».

При этом, если вы храните такую ​​ссылку в EJB @Singleton, эта ссылка будет когда-либо позволять одновременно обрабатывать один вызов метода за раз (поскольку такие вызовы «сериализованы»). Это, вероятно, приведет к нежелательному узкому месту в вашем приложении.

+0

Спасибо за ответ, я сомневаюсь в том, что безопасно хранить ссылку прокси-сервера wildfly в одноэлементном компоненте (CDI ApplicationScoped), к которому одновременно обращаются, другими словами, реализация прокси-сервера wildfly поточно-безопасна? – landal79

+0

Я добавил дополнительную информацию в ответ –

+0

Это не @Singleton, который контролирует параллелизм, это сеансовый компонент. Одна ссылка на сеанс (ваш прокси) => Один экземпляр компонента сеанса –