Внедрение @Stateful или @Stateless в @Singleton EJB

У меня есть @Singleton EJB, в который я вставляю другой EJB, который не Singleton (это либо @Stateless, либо @Statefull). Например.

@Singleton
public class MySingleton {
    @EJB
    MyStatefulBean statefulBean;//this is stateful!

    public void doSomething() {
        statefulBean.something();
    }
}

Мой вопрос: будет ли statefulBean всегда одна и та же ссылка или она будет как-то отличаться при каждом вызове doSomething()? Поскольку у нас есть синглтон, логично, что statefulBean всегда имеет одну и ту же ссылку. Тем не менее, я спрашиваю, так как я новичок в EJB и хочу быть уверенным. Спасибо!


person amihaiemil    schedule 13.06.2016    source источник


Ответы (2)


Каждый раз, когда вызывается doSomething - вы получаете statefulBean, связанный с текущим сеансом, который отвечает за этот одноэлементный вызов. Во время выполнения метода ваш Singleton ejb заблокирован, и никакой другой метод этого Singleton ejb не может быть вызван, кроме объектов, которые имеют прямую ссылку на этот ejb, обычно сам объект ejb, потому что другие объекты получают ссылку на прокси-объект. Более того, во время выполнения метода никакие другие объекты не могут быть вставлены в этот ejb. Это возможно, потому что синглтон был разработан для одновременного доступа, а параметры параллелизма по умолчанию для ejb синглтона равны ConcurrencyManagementType.CONTAINER и LockType.WRITE. Вы можете изменить это поведение, но имейте в виду, что тогда ваш Singleton ejb может вызываться из нескольких потоков одновременно, и вы можете получить неожиданные результаты, особенно если вы внедрите объект с полным состоянием. Подробнее об управлении параллелизмом одноэлементных ejb-файлов вы можете прочитать здесь.

person Sergej Samsonow    schedule 14.06.2016

Мой вопрос: будет ли statefulBean всегда иметь одну и ту же ссылку или она будет как-то отличаться при каждом вызове doSomething ()?

Вот что об этом говорится в спецификации EJB:

3.4.7.1 Сессионные компоненты состояния

Объект сеанса с отслеживанием состояния имеет уникальный идентификатор, который назначается контейнером во время создания объекта. Клиент бизнес-интерфейса сессионного компонента с сохранением состояния может определить, ссылаются ли две ссылки бизнес-интерфейса или представления без интерфейса на один и тот же объект сеанса, используя метод equals.

Например,

@EJB Cart cart1;

@EJB Cart cart2;

...

if (cart1.equals(cart1)) { // this test must return true
    ...  
}
...

if (cart1.equals(cart2)) { // this test must return false
    ...
}

Все ссылки сеансового компонента с сохранением состояния на один и тот же бизнес-интерфейс для одного и того же экземпляра сеансового компонента с сохранением состояния будут равны. Все ссылки на представление без интерфейса одного и того же экземпляра сессионного компонента с отслеживанием состояния будут равны. Ссылки сеансового компонента с сохранением состояния на разные типы интерфейса или между типом интерфейса и представлением без интерфейса, или на разные экземпляры сеансового компонента не будут иметь одинаковых идентификаторов.

Это означает, что как только клиент получил ссылку на сеансовый компонент с отслеживанием состояния, этот компонент привязывается к клиенту. Клиент может устанавливать и читать состояния bean-компонента. Когда клиент завершает работу, он должен сообщить серверу, что компонент должен быть уничтожен путем вызова метода, аннотированного аннотацией @Remove.

person ujulu    schedule 13.06.2016