Странный баг JBoss+EJB3+SEAM+MyFaces
От: Denis Tsyplakov Россия  
Дата: 13.06.07 09:11
Оценка:
Привет!

Имею в проекте такую связку

JBoss+EJB3+SEAM+MyFaces

Периодически причем совершенно асинхронно, вылетает такой вот баг

org.hibernate.AssertionFailure: Exception releasing cache locks
at org.jboss.ejb3.tx.Ejb3TxPolicy.handleInCallerTx(Ejb3TxPolicy.java:93)
at org.jboss.aspects.tx.TxPolicy.invokeInCallerTx(TxPolicy.java:130)
...
Caused by: org.hibernate.AssertionFailure: Exception releasing cache locks
at org.hibernate.engine.ActionQueue.afterTransactionCompletion(ActionQueue.java:183)
at org.hibernate.impl.SessionImpl.afterTransactionCompletion(SessionImpl.java:424)
...
Caused by: java.lang.IndexOutOfBoundsException: Index: 2, Size: 0
at java.util.ArrayList.RangeCheck(ArrayList.java:546)
at java.util.ArrayList.get(ArrayList.java:321)
at org.hibernate.engine.ActionQueue.afterTransactionCompletion(ActionQueue.java:168)
... 142 more


SEAM конечно та еще банка с червяками, отвуда баг не пойму в упор. Единственно предположение каким-то образом сказывается использование

@PersistenceContext(type = PersistenceContextType.EXTENDED)

Ну или вторая версия — использование

@javax.persistence.Version
Long lockVersion;

Хотя второе кажется маловероятным.

Я понимаю, что то, что написано малопригодно для диагностики, но что еще написать не знаю. Может мне кто вопросов позадает хотя бы.
Re: Странный баг JBoss+EJB3+SEAM+MyFaces
От: Blazkowicz Россия  
Дата: 13.06.07 10:19
Оценка:
Здравствуйте, Denis Tsyplakov, Вы писали:

DT>Caused by: java.lang.IndexOutOfBoundsException: Index: 2, Size: 0

DT> at java.util.ArrayList.RangeCheck(ArrayList.java:546)
DT> at java.util.ArrayList.get(ArrayList.java:321)
DT> at org.hibernate.engine.ActionQueue.afterTransactionCompletion(ActionQueue.java:168)
DT> ... 142 more

Кто-то что-то не правильно в многопоточности шарит, потому как

    public void afterTransactionCompletion(boolean success) {
        int size = executions.size();
        final boolean invalidateQueryCache = session.getFactory().getSettings().isQueryCacheEnabled();
        for ( int i = 0; i < size; i++ ) {
            try {
                Executable exec = ( Executable ) executions.get(i);


Выходит между получением размера и 3й итерацией executions очищаются другим потоком. Сессия точно между потоками не шарится?
Re[2]: Странный баг JBoss+EJB3+SEAM+MyFaces
От: Denis Tsyplakov Россия  
Дата: 13.06.07 11:32
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, Denis Tsyplakov, Вы писали:


DT>>Caused by: java.lang.IndexOutOfBoundsException: Index: 2, Size: 0

DT>> at java.util.ArrayList.RangeCheck(ArrayList.java:546)
DT>> at java.util.ArrayList.get(ArrayList.java:321)
DT>> at org.hibernate.engine.ActionQueue.afterTransactionCompletion(ActionQueue.java:168)
DT>> ... 142 more

B>Кто-то что-то не правильно в многопоточности шарит, потому как


B>
B>    public void afterTransactionCompletion(boolean success) {
B>        int size = executions.size();
B>        final boolean invalidateQueryCache = session.getFactory().getSettings().isQueryCacheEnabled();
B>        for ( int i = 0; i < size; i++ ) {
B>            try {
B>                Executable exec = ( Executable ) executions.get(i);
B>


B>Выходит между получением размера и 3й итерацией executions очищаются другим потоком. Сессия точно между потоками не шарится?


Огромное спасибо. По уму я должен был сам туда долезть. Сессия между потоками не шарится. Собственно потоков то и нету. Есть только то, что запускает сам сервер приложений.

А раз потоков (ну в смысле руками создаваемых) нет, то наверное виноват может быть Ajax4JSF который я забыл упомянуть.

Или я что-то не так понимаю?
Re[3]: Странный баг JBoss+EJB3+SEAM+MyFaces
От: Blazkowicz Россия  
Дата: 13.06.07 11:47
Оценка:
Здравствуйте, Denis Tsyplakov, Вы писали:

B>>Выходит между получением размера и 3й итерацией executions очищаются другим потоком. Сессия точно между потоками не шарится?

DT> Огромное спасибо. По уму я должен был сам туда долезть. Сессия между потоками не шарится. Собственно потоков то и нету. Есть только то, что запускает сам сервер приложений.
Как это нету потоков? Я совсем не имел ввиду кастомные потоки. Вопрос был в том что надо разобратся каким образом в указанной связке происходить управление объектами Hibernate Session. Все ли правильно сконфигурено чтобы сессия создавалась правльно и не вызывала проблем в многопоточном окружении.
Re: Странный баг JBoss+EJB3+SEAM+MyFaces
От: Blazkowicz Россия  
Дата: 13.06.07 12:00
Оценка:
Здравствуйте, Denis Tsyplakov, Вы писали:

DT> SEAM конечно та еще банка с червяками, отвуда баг не пойму в упор. Единственно предположение каким-то образом сказывается использование

DT>@PersistenceContext(type = PersistenceContextType.EXTENDED)

Кстати очень верноятно, только не понятно почему он между потоками вдруг шарится. Покажи весь бин. Он Statefull? А к нему в рамках одной сессии могут быть конкурентные потоки?
Re[2]: Странный баг JBoss+EJB3+SEAM+MyFaces
От: Denis Tsyplakov Россия  
Дата: 13.06.07 12:10
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, Denis Tsyplakov, Вы писали:


DT>> SEAM конечно та еще банка с червяками, отвуда баг не пойму в упор. Единственно предположение каким-то образом сказывается использование

DT>>@PersistenceContext(type = PersistenceContextType.EXTENDED)

B>Кстати очень верноятно, только не понятно почему он между потоками вдруг шарится. Покажи весь бин. Он Statefull? А к нему в рамках одной сессии могут быть конкурентные потоки?


Где-то так

@Restrict
@Stateful
@Scope(ScopeType.SESSION)
@Name("userManager")
public class UserManagerBean implements Serializable, UserManager {

    private static final long serialVersionUID = -2926691419739343163L;

    @PersistenceContext(type = PersistenceContextType.EXTENDED)
    private EntityManager em;

    @DataModelSelection
    @Out(required = false)
    private User selectedUser;

    private User editUser;

...

    public void selectUser() {
        editUser = selectedUser;
        setEditMode(true);
        if (selectedUser != null) {
            for (UIGroup g : getGroups()) {
                g.setUser(selectedUser);
            }
        }
    }
....


Как настроен hibernate сказать сложно т.к. всем этим делом управляет JBoss(JPA) + SEAM короче полная магия. Не привык так. Обычно делаю под TomCat — руками. Тут мне наши EJB-филы говорят что сервер приложений вообще все сделает за меня — но как-то я сомневаюсь.
Re[3]: Странный баг JBoss+EJB3+SEAM+MyFaces
От: Blazkowicz Россия  
Дата: 13.06.07 12:18
Оценка:
Здравствуйте, Denis Tsyplakov, Вы писали:

DT>
DT>@Scope(ScopeType.SESSION)
DT>    @PersistenceContext(type = PersistenceContextType.EXTENDED)
DT>    private EntityManager em;
DT>


DT> Как настроен hibernate сказать сложно т.к. всем этим делом управляет JBoss(JPA) + SEAM короче полная магия.

Мне кажется что это конкурентные запросы в рамках одной сессии. Возможно ли тест написать который бы дергал бин кучей потоков в одной сессии?

А вообще в исключении видно на каком методе EJB оно вылезло? А по логам нельзя ли проследить какие ещё операции вызывались в то же время?


DT>Не привык так. Обычно делаю под TomCat — руками. Тут мне наши EJB-филы говорят что сервер приложений вообще все сделает за меня — но как-то я сомневаюсь.

Ну, это путь EJB-фила. За час все написать а потом неделю иметь сексуальные приключения на почве поиска источника проблемы.
Re[4]: Странный баг JBoss+EJB3+SEAM+MyFaces
От: Denis Tsyplakov Россия  
Дата: 13.06.07 12:27
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, Denis Tsyplakov, Вы писали:


DT>>
DT>>@Scope(ScopeType.SESSION)
DT>>    @PersistenceContext(type = PersistenceContextType.EXTENDED)
DT>>    private EntityManager em;
DT>>


DT>> Как настроен hibernate сказать сложно т.к. всем этим делом управляет JBoss(JPA) + SEAM короче полная магия.

B>Мне кажется что это конкурентные запросы в рамках одной сессии. Возможно ли тест написать который бы дергал бин кучей потоков в одной сессии?

Втом то и дело что вроде как один запрос — один поток. А запрос там точно один. Или нет?

B>А вообще в исключении видно на каком методе EJB оно вылезло? А по логам нельзя ли проследить какие ещё операции вызывались в то же время?


Да вроде бы никакие. В этом логе сам черт ногу сломает.

DT>>Не привык так. Обычно делаю под TomCat — руками. Тут мне наши EJB-филы говорят что сервер приложений вообще все сделает за меня — но как-то я сомневаюсь.

B>Ну, это путь EJB-фила. За час все написать а потом неделю иметь сексуальные приключения на почве поиска источника проблемы.

Да блин не говори, написали за две недели вдвоем, месяц фиксим баги. Ненавижу.
Re[5]: Странный баг JBoss+EJB3+SEAM+MyFaces
От: Blazkowicz Россия  
Дата: 13.06.07 13:09
Оценка:
Здравствуйте, Denis Tsyplakov, Вы писали:

B>>Мне кажется что это конкурентные запросы в рамках одной сессии. Возможно ли тест написать который бы дергал бин кучей потоков в одной сессии?

DT> Втом то и дело что вроде как один запрос — один поток. А запрос там точно один. Или нет?
Один запрос — один поток. Но одна сессия может плодить много запросов и соответственно потоков.

B>>А вообще в исключении видно на каком методе EJB оно вылезло? А по логам нельзя ли проследить какие ещё операции вызывались в то же время?

DT> Да вроде бы никакие. В этом логе сам черт ногу сломает.
Как на счет первого вопроса?
Re[6]: Странный баг JBoss+EJB3+SEAM+MyFaces
От: Denis Tsyplakov Россия  
Дата: 13.06.07 13:21
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>>>А вообще в исключении видно на каком методе EJB оно вылезло? А по логам нельзя ли проследить какие ещё операции вызывались в то же время?

DT>> Да вроде бы никакие. В этом логе сам черт ногу сломает.
B>Как на счет первого вопроса?

Коротко — нет. Длинно — вот так.

at org.jboss.ejb3.tx.Ejb3TxPolicy.handleInCallerTx(Ejb3TxPolicy.java:93)
at org.jboss.aspects.tx.TxPolicy.invokeInCallerTx(TxPolicy.java:130)
at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:195)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
at org.jboss.ejb3.stateful.StatefulInstanceInterceptor.invoke(StatefulInstanceInterceptor.java:83)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:77)
at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:102)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:47)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
at org.jboss.ejb3.stateful.StatefulContainer.localInvoke(StatefulContainer.java:203)
at org.jboss.ejb3.stateful.StatefulLocalProxy.invoke(StatefulLocalProxy.java:98)
at $Proxy145.getUsers(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.jboss.seam.util.Reflections.invoke(Reflections.java:20)
at org.jboss.seam.intercept.RootInvocationContext.proceed(RootInvocationContext.java:31)
at org.jboss.seam.intercept.ClientSideInterceptor$1.proceed(ClientSideInterceptor.java:72)
at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:57)
at org.jboss.seam.interceptors.SecurityInterceptor.aroundInvoke(SecurityInterceptor.java:37)
at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:69)
at org.jboss.seam.interceptors.RemoveInterceptor.aroundInvoke(RemoveInterceptor.java:40)
at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:69)
at org.jboss.seam.interceptors.SynchronizationInterceptor.aroundInvoke(SynchronizationInterceptor.java:31)
at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:69)
at org.jboss.seam.intercept.RootInterceptor.invoke(RootInterceptor.java:103)
at org.jboss.seam.intercept.ClientSideInterceptor.invoke(ClientSideInterceptor.java:50)
at org.javassist.tmp.java.lang.Object_$$_javassist_103.getUsers(Object_$$_javassist_103.java)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.jboss.seam.util.Reflections.invoke(Reflections.java:20)
at org.jboss.seam.util.Reflections.invokeAndWrap(Reflections.java:123)
at org.jboss.seam.Component.callComponentMethod(Component.java:1834)
at org.jboss.seam.Component.getInstanceFromFactory(Component.java:1696)
at org.jboss.seam.Component.getInstance(Component.java:1633)
at org.jboss.seam.Component.getInstance(Component.java:1610)
at org.jboss.seam.jsf.SeamVariableResolver.resolveVariable(SeamVariableResolver.java:53)
at org.apache.myfaces.config.LastVariableResolverInChain.resolveVariable(LastVariableResolverInChain.java:42)
at com.sun.facelets.el.LegacyELContext$LegacyELResolver.getValue(LegacyELContext.java:134)
at com.sun.el.parser.AstIdentifier.getValue(AstIdentifier.java:73)
at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:195)
at com.sun.facelets.el.TagValueExpression.getValue(TagValueExpression.java:71)
at com.sun.facelets.el.LegacyValueBinding.getValue(LegacyValueBinding.java:56)
at javax.faces.component.UIData.getValue(UIData.java:1019)
at javax.faces.component.UIData.createDataModel(UIData.java:785)
at javax.faces.component.UIData.getDataModel(UIData.java:765)
at javax.faces.component.UIData.getRowCount(UIData.java:191)
at javax.faces.component.UIData.processColumnChildren(UIData.java:685)
at javax.faces.component.UIData.processValidators(UIData.java:603)
at javax.faces.component.UIForm.processValidators(UIForm.java:70)
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:624)
at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:146)
at org.ajax4jsf.framework.ajax.AjaxViewRoot.access$201(AjaxViewRoot.java:53)
at org.ajax4jsf.framework.ajax.AjaxViewRoot$3.invokeRoot(AjaxViewRoot.java:302)
at org.ajax4jsf.framework.ajax.JsfOneOneInvoker.invokeOnRegionOrRoot(JsfOneOneInvoker.java:54)
at org.ajax4jsf.framework.ajax.AjaxContext.invokeOnRegionOrRoot(AjaxContext.java:176)
at org.ajax4jsf.framework.ajax.AjaxViewRoot.processValidators(AjaxViewRoot.java:315)
at org.apache.myfaces.lifecycle.LifecycleImpl.processValidations(LifecycleImpl.java:262)
at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:76)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:137)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.jboss.seam.web.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:63)
at org.jboss.seam.debug.hot.HotDeployFilter.doFilter(HotDeployFilter.java:60)
at org.jboss.seam.web.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:49)
at org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45)
at org.jboss.seam.web.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:49)
at org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:57)
at org.jboss.seam.web.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:49)
at org.jboss.seam.web.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:53)
at org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:79)
at org.jboss.seam.web.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:49)
at org.jboss.seam.web.SeamFilter.doFilter(SeamFilter.java:84)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.ajax4jsf.framework.ajax.xmlfilter.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:96)
at org.ajax4jsf.framework.ajax.xmlfilter.BaseFilter.doFilter(BaseFilter.java:220)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:175)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:432)
at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:74)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.jboss.web.tomcat.tc5.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:156)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112)
at java.lang.Thread.run(Thread.java:595)
Re[7]: Странный баг JBoss+EJB3+SEAM+MyFaces
От: Blazkowicz Россия  
Дата: 13.06.07 13:36
Оценка:
Здравствуйте, Denis Tsyplakov, Вы писали:

DT> Коротко — нет. Длинно — вот так.


DT>at org.jboss.ejb3.tx.Ejb3TxPolicy.handleInCallerTx(Ejb3TxPolicy.java:93)

...skipped...

Не достаточно длинно. Обе причины где?
Re[8]: Странный баг JBoss+EJB3+SEAM+MyFaces
От: Denis Tsyplakov Россия  
Дата: 13.06.07 13:43
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, Denis Tsyplakov, Вы писали:


Блин виноват.

@SuppressWarnings("unchecked")
@Factory("userList")
public void getUsers() {
userList = em.createQuery("from User").getResultList(); !!! Вот тут
}
Re: Странный баг JBoss+EJB3+SEAM+MyFaces
От: Blazkowicz Россия  
Дата: 13.06.07 14:00
Оценка: 3 (1)
Здравствуйте, Denis Tsyplakov, Вы писали:

DT>@PersistenceContext(type = PersistenceContextType.EXTENDED)


Короче все сходится.
1)EntityManager не thread safe.
2)@PersistenceContext(type = PersistenceContextType.EXTENDED) — шарит EntityManager на всю сессию, а не на транзакцию как по умолчанию.
3)Скорее всего благодаря именно Ajax возникает несколько запросов в рамках одной сессии.

В результате получаем конкурентное обращение к одному экземпляру EntityManager.

В общем осталось понять для чего понадобилось
@PersistenceContext(type = PersistenceContextType.EXTENDED)
И если он так супер нужен, то синхронизировать обращения к EM
Re[2]: Странный баг JBoss+EJB3+SEAM+MyFaces
От: Denis Tsyplakov Россия  
Дата: 13.06.07 14:10
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, Denis Tsyplakov, Вы писали:


DT>>@PersistenceContext(type = PersistenceContextType.EXTENDED)


B>Короче все сходится.

B>1)EntityManager не thread safe.
B>2)@PersistenceContext(type = PersistenceContextType.EXTENDED) — шарит EntityManager на всю сессию, а не на транзакцию как по умолчанию.
B>3)Скорее всего благодаря именно Ajax возникает несколько запросов в рамках одной сессии.

B>В результате получаем конкурентное обращение к одному экземпляру EntityManager.


B>В общем осталось понять для чего понадобилось

B>@PersistenceContext(type = PersistenceContextType.EXTENDED)
B>И если он так супер нужен, то синхронизировать обращения к EM

Похоже на правду. Насчет супер нужен я не уверен, заказчик хочет, говори мега-фича. Но можно его переубедить. Вопрос в другом. синхронизация EntityManager может быть весьма нетривиальным занятием.
Re[3]: Странный баг JBoss+EJB3+SEAM+MyFaces
От: Blazkowicz Россия  
Дата: 13.06.07 14:28
Оценка:
Здравствуйте, Denis Tsyplakov, Вы писали:

DT> Похоже на правду. Насчет супер нужен я не уверен, заказчик хочет, говори мега-фича. Но можно его переубедить.

Заказчик вам рассказывает как код писать?

DT> Вопрос в другом. синхронизация EntityManager может быть весьма нетривиальным занятием.

Ну, не сам EntityManager, конечно, а обащения к нему в рамках одного бина.
Re[4]: Странный баг JBoss+EJB3+SEAM+MyFaces
От: Denis Tsyplakov Россия  
Дата: 13.06.07 14:36
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, Denis Tsyplakov, Вы писали:


DT>> Похоже на правду. Насчет супер нужен я не уверен, заказчик хочет, говори мега-фича. Но можно его переубедить.

B>Заказчик вам рассказывает как код писать?

Проеткты бывают разные, здесь заказчик высказывает пожелания достаточно сильно влияющие на архитектуру.

DT>> Вопрос в другом. синхронизация EntityManager может быть весьма нетривиальным занятием.

B>Ну, не сам EntityManager, конечно, а обащения к нему в рамках одного бина.

Тут есть хитрость. Предположим я через @OUT аннотацию вставлю бин который я достал в контекст сессии — и соответственно бин становится достпным из любой формы. А запись в поле бина = работа с em так что все не засинхронизируешь.

Ага вот коллега подсказал

Из спеки:
Clients are not allowed to make concurrent calls to a stateful session object. If a client-invoked business
method is in progress on an instance when another client-invoked call, from the same or different client,
arrives at the same instance of a stateful session bean class, if the second client is a client of the bean’s
business interface, the concurrent invocation may result in the second client receiving the
javax.ejb.ConcurrentAccessException[14].


Похоже у нас серьезные проблемы, поговорю сегодня с заказчиком — обрадую.

Мораль — век живи — век учись.

Косвенное следствие — применимость Statefull beans with session scope в web приложениях — видится сомнительной.
Re[5]: Странный баг JBoss+EJB3+SEAM+MyFaces
От: Blazkowicz Россия  
Дата: 13.06.07 14:42
Оценка:
Здравствуйте, Denis Tsyplakov, Вы писали:

DT>Косвенное следствие — применимость Statefull beans with session scope в web приложениях — видится сомнительной.

Отчего же? Разве не достаточно просто заменить PersistentContextType?
Re[6]: Странный баг JBoss+EJB3+SEAM+MyFaces
От: Denis Tsyplakov Россия  
Дата: 13.06.07 14:51
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, Denis Tsyplakov, Вы писали:


DT>>Косвенное следствие — применимость Statefull beans with session scope в web приложениях — видится сомнительной.

B>Отчего же? Разве не достаточно просто заменить PersistentContextType?

Там сейчас сделано так что если изменить то много чего работать не будет. Собственно statefull делалось именно из расчета на Extended. Нафига мне не синхронный statefull bean если сессионные, что мне надо я могу хранить и в JSF бине а из него дергать методы stateless бинов.
Re: Странный баг JBoss+EJB3+SEAM+MyFaces [OFF]
От: Lucker Беларусь http://lucker.intervelopers.com/
Дата: 13.06.07 15:26
Оценка:
Здравствуйте, Denis Tsyplakov, Вы писали:

DT>Привет!


Почитал топик. Ощущения те же, что и когда читаешь шутки линейщиков (lineage).
Blog
Re[2]: Странный баг JBoss+EJB3+SEAM+MyFaces [OFF]
От: Blazkowicz Россия  
Дата: 13.06.07 16:25
Оценка:
Здравствуйте, Lucker, Вы писали:

L>Почитал топик. Ощущения те же, что и когда читаешь шутки линейщиков (lineage).

Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.