Синглтон с JBoss SEAM - PullRequest
       0

Синглтон с JBoss SEAM

0 голосов
/ 23 мая 2011

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

@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 Ответ

4 голосов
/ 24 мая 2011

@Stateless, связанный с областью приложения, - оксюморон

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

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

...