Синглтон с JBoss SEAM

#synchronization #seam

#синхронизация #seam

Вопрос:

У меня есть следующий код:

 @Name("myService")
@Scope(ScopeType.APPLICATION)
@Stateless
public class MyService {
  private Service service;

  private Service getService() {
    if (service == null) {
      service = Service.create(url, new QName("URL",
        "Envelope"));
    }

    return service;
  }    

  public synchronized Port getPort() {
    return getService().getPort();
  }
}
  

И метод getPort вызывается из разных потоков. «Service.create» занимает много времени, и я обнаружил, что на самом деле он вызывается более одного раза. Похоже, что создано более одного экземпляра класса MyService, и именно поэтому synchronized не помогает.

Я изменил аннотации на:

 @AutoCreate
@Startup
@Name("myService")
@Scope(ScopeType.APPLICATION)
  

И теперь, похоже, все работает нормально: создается только один экземпляр и синхронизируется доступ к методу getPort().

Кто-нибудь может объяснить, почему первый случай не работает так, как ожидалось?

Ответ №1:

Привязка @Stateless к области приложения является оксюмороном

вы просите Java EE предоставить компонент, у которого нет состояния, для работы в области приложения, совместно используемой всеми пользователями

Когда вы удалили аннотацию @Stateless, seam обработал экземпляр компонента и поместил его в область приложения, он также создал его при запуске, следовательно, имея синглтон