powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / ejb кеш HttpSesssion
13 сообщений из 13, страница 1 из 1
ejb кеш HttpSesssion
    #39081721
dimchuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет)
Подскажите пожалуйста с ситуацией которую никак немогу понять и решить.
Примерно ожидаемый результат: пользователь залогинилса в системе на машине А, потом залогинилса на машине Б. Нужно чтоб сессия для машины А получила invalidate().

Решил реализовать cледующим способом:
1. Создал "кеш" на базе EJB
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
@Singleton
@LocalBean

public class AccessCach implements HttpSessionListener{

    private ConcurrentHashMap<String, HttpSession> mapa = new ConcurrentHashMap<String, HttpSession>();
    
    
    public void newEnter(String idClient, HttpSession session){
        if(mapa.contains(idClient)){
            mapa.get(idClient).invalidate();
            mapa.remove(idClient);
            mapa.put(idClient, session);
        }
        else{
            mapa.put(idClient, session);
        }
    }

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        if(se.getSession().getAttribute("role").equals("client")){
            mapa.remove(((ClientInfo)se.getSession().getAttribute("roleObject")).getIdClient()+"c");
        }else if(se.getSession().getAttribute("role").equals("enterprise")){
            mapa.remove(((EnterpriseInfo)se.getSession().getAttribute("roleObject")).getIdEnterprise()+"e");
        }else{
            System.out.println("Problem");
        }
        
    }
}



2. Хочу добавить в него елемент из сервлета
Код: java
1.
2.
String test = ei.getIdClient() + "c";
accessCach.newEnter(test, request.getSession());


и это всё дело вылетает с следующими логами:
Код: java
1.
A system exception occurred during an invocation on EJB AccessCach, method: public void com.trash.AccessCach.newEnter(java.lang.String,javax.servlet.http.HttpSession)


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
javax.ejb.EJBException at com.sun.ejb.containers.BaseContainer.processSystemException(BaseContainer.java:5215) at 
com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:5113) at  
com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4901) at  
com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2045) at  
com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1994) at  
com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:222) at  
com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88) at  
com.sun.proxy.$Proxy572.newEnter(Unknown Source) at  
com.trash.__EJB31_Generated__AccessCach__Intf____Bean__.newEnter(Unknown Source ) at  
com.servletclient.ClientLogin.processRequest(ClientLogin.java:77) at com.servletclient.ClientLogin.doPost(ClientLogin.java:177) at  
javax.servlet.http.HttpServlet.service(HttpServlet.java:688) at javax.servlet.http.HttpServlet.service(HttpServlet.java:770) at  и т.д. 


И почему вылетает Unknown Source - если передаю соответствующие обекты.
При этом использую GlassFish 3.1.2
...
Рейтинг: 0 / 0
ejb кеш HttpSesssion
    #39081786
breath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
получение доступа к SessionListener из сервлета звучит странно
...
Рейтинг: 0 / 0
ejb кеш HttpSesssion
    #39081909
dimchuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
breathполучение доступа к SessionListener из сервлета звучит странно

немогу понять - где я такое написал что сервлет стучитса к SessionListener !!!
...
Рейтинг: 0 / 0
ejb кеш HttpSesssion
    #39082034
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimchuk
Код: java
1.
A system exception occurred during an invocation on EJB AccessCach, method: public void com.trash.AccessCach.newEnter(java.lang.String,javax.servlet.http.HttpSession)


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
javax.ejb.EJBException at com.sun.ejb.containers.BaseContainer.processSystemException(BaseContainer.java:5215) at 
com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:5113) at  
com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4901) at  
com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2045) at  
com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1994) at  
com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:222) at  
com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88) at  
com.sun.proxy.$Proxy572.newEnter(Unknown Source) at  
com.trash.__EJB31_Generated__AccessCach__Intf____Bean__.newEnter(Unknown Source ) at  
com.servletclient.ClientLogin.processRequest(ClientLogin.java:77) at com.servletclient.ClientLogin.doPost(ClientLogin.java:177) at  
javax.servlet.http.HttpServlet.service(HttpServlet.java:688) at javax.servlet.http.HttpServlet.service(HttpServlet.java:770) at  и т.д. 


И почему вылетает Unknown Source - если передаю соответствующие обекты.
При этом использую GlassFish 3.1.2

Вы всё напутали. Во-первых порезали исключение, выбросим из него ключевое сообщение об ошибке.
Во-вторых Unknown Source это не исключение. Это просто указатель на то что синтетический код, сгенерированый контейнером, не имеет отладочной информации. К вашей проблеме это никакого отношения не имеет.
...
Рейтинг: 0 / 0
ejb кеш HttpSesssion
    #39082036
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimchuk mapa.put(idClient, session);
}
else{
mapa.put(idClient, session);
}

Отучайтесь копипастить.
...
Рейтинг: 0 / 0
ejb кеш HttpSesssion
    #39082040
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimchuk
Код: java
1.
2.
3.
        if(mapa.contains(idClient)){
            mapa.get(idClient).invalidate();
        }


В многопоточном окружении ваше условие никак не гарантирует что get() не вернет null.
Почитайте про то как использовать ConcurrentHashMap и особенно про методы интерфейса ConcurrentMap.
...
Рейтинг: 0 / 0
ejb кеш HttpSesssion
    #39087389
dimchuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Уважаемый. Либо я дура либо лыжи не едут. Немного исправил код, почитал это . Но всёравно вылетают в логах эксепшины.
Код:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)
@Singleton
@LocalBean

public class AccessCach implements HttpSessionListener {

    private ConcurrentHashMap<String, HttpSession> mapa = new ConcurrentHashMap<String, HttpSession>();

    @Lock(LockType.WRITE)
    public void Login(String idClient, HttpSession session) {
        //System.out.println("Method LOGIN: " + idClient + "," + session.getId());
        HttpSession s = mapa.get(idClient);
        if (s != null) {
            s.invalidate();
            mapa.put(idClient, session);
        } else {
            mapa.put(idClient, session);
        }
    }

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    @Lock(LockType.WRITE)
    public void sessionDestroyed(HttpSessionEvent se) {
        if (se.getSession().getAttribute("role").equals("client")) {
            mapa.remove(((ClientInfo) se.getSession().getAttribute("roleObject")).getIdClient() + "c");
        } else if (se.getSession().getAttribute("role").equals("enterprise")) {
            mapa.remove(((EnterpriseInfo) se.getSession().getAttribute("roleObject")).getIdEnterprise() + "e");
        } else {
            System.out.println("Problem");
        }
    }
}


По времени появляние в логах:
Код: java
1.
2.
	
A system exception occurred during an invocation on EJB AccessCach, method: public void com.ceit.detailor.back.api.v1.ejbs.cache.AccessCach.Login(java.lang.String,javax.servlet.http.HttpSession)


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
[SIZE=1]javax.ejb.EJBException at com.sun.ejb.containers.BaseContainer.processSystemException(BaseContainer.java:5215) at  
com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:5113) at  
com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4901) at  
com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2045) at  
com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1994) at  
com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:222) at  
com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88)  
at com.sun.proxy.$Proxy552.Login(Unknown Source) at 
com.ceit.detailor.back.api.v1.ejbs.cache.__EJB31_Generated__AccessCach__Intf____Bean__.Login(Unknown 
Source) at com.ceit.detailor.back.api.v1.servletclient.ClientLogin.processRequest(ClientLogin.java:77) at 
com.ceit.detailor.back.api.v1.servletclient.ClientLogin.doPost(ClientLogin.java:175) at 
javax.servlet.http.HttpServlet.service(HttpServlet.java:688) at 
javax.servlet.http.HttpServlet.service(HttpServlet.java:770) at 
org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1542) at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343) at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217) at 
com.ceit.detailor.back.api.v1.Filters.Access_Control_Filter.doFilter(Access_Control_Filter.java:57) at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217) at 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279) at 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) at 
org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) at 
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) at 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161) at 
org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331) at 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) at 
com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317) at 
com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) at 
com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:849) at 
com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:746) at 
com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1045) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:228) at 
com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) at 
com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) at 
com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) at 
com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) at 
com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) at 
com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) at 
com.sun.grizzly.ContextTask.run(ContextTask.java:71) at 
com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) at 
com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) at 
java.lang.Thread.run(Thread.java:745) Caused by: java.lang.IllegalStateException: PWC2776: invalidate: Session 
already invalidated at org.apache.catalina.session.StandardSession.invalidate(StandardSession.java:1467) at 
org.apache.catalina.session.StandardSessionFacade.invalidate(StandardSessionFacade.java:204) at 
com.ceit.detailor.back.api.v1.ejbs.cache.AccessCach.Login(AccessCach.java:39) at 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at 
java.lang.reflect.Method.invoke(Method.java:606) at 
org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052) at 
org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124) at 
com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5388) at 
com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:619) at 
com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800) at 
com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571) at 
org.jboss.weld.ejb.SessionBeanInterceptor.aroundInvoke(SessionBeanInterceptor.java:42) at 
sun.reflect.GeneratedMethodAccessor2392.invoke(Unknown Source) at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at 
java.lang.reflect.Method.invoke(Method.java:606) at 
com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:861) at 
com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800) at 
com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571) at 
com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:162) at 
com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:144) at 
sun.reflect.GeneratedMethodAccessor2396.invoke(Unknown Source) at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at 
java.lang.reflect.Method.invoke(Method.java:606) at 
com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:861) at 
com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800) at 
com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:370) at 
com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5360) at 
com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5348) at 
com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:214) ... 36 
more[/SIZE]



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
	
StandardWrapperValve[ClientLogin]: PWC1406: Servlet.service() for servlet ClientLogin threw exception 
javax.ejb.EJBException at com.sun.ejb.containers.BaseContainer.processSystemException(BaseContainer.java:5215) 
at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:5113) at 
com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4901) at 
com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2045) at 
com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1994) at 
com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:222) at 
com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.j
ava:88) at com.sun.proxy.$Proxy552.Login(Unknown Source) at 
com.ceit.detailor.back.api.v1.ejbs.cache.__EJB31_Generated__AccessCach__Intf____Bean__.Login(Unknown 
Source) at com.ceit.detailor.back.api.v1.servletclient.ClientLogin.processRequest(ClientLogin.java:77) at 
com.ceit.detailor.back.api.v1.servletclient.ClientLogin.doPost(ClientLogin.java:175) at 
javax.servlet.http.HttpServlet.service(HttpServlet.java:688) at 
javax.servlet.http.HttpServlet.service(HttpServlet.java:770) at 
org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1542) at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343) at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217) at 
com.ceit.detailor.back.api.v1.Filters.Access_Control_Filter.doFilter(Access_Control_Filter.java:57) at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217) at 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279) at 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) at 
org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) at 
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) at 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161) at 
org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331) at 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) at 
com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317) at 
com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) at 
com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:849) at 
com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:746) at 
com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1045) at 
com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:228) at 
com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) at 
com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) at 
com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) at 
com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) at 
com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) at 
com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) at 
com.sun.grizzly.ContextTask.run(ContextTask.java:71) at 
com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) at 
com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) at 
java.lang.Thread.run(Thread.java:745) Caused by: java.lang.IllegalStateException: PWC2776: invalidate: Session 
already invalidated at org.apache.catalina.session.StandardSession.invalidate(StandardSession.java:1467) at 
org.apache.catalina.session.StandardSessionFacade.invalidate(StandardSessionFacade.java:204) at 
com.ceit.detailor.back.api.v1.ejbs.cache.AccessCach.Login(AccessCach.java:39) at 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at 
java.lang.reflect.Method.invoke(Method.java:606) at 
org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052) at 
org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124) at 
com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5388) at 
com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:619) at 
com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800) at 
com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571) at 
org.jboss.weld.ejb.SessionBeanInterceptor.aroundInvoke(SessionBeanInterceptor.java:42) at 
sun.reflect.GeneratedMethodAccessor2392.invoke(Unknown Source) at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at 
java.lang.reflect.Method.invoke(Method.java:606) at 
com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:861) at 
com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800) at 
com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571) at 
com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:162) at 
com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:144) at 
sun.reflect.GeneratedMethodAccessor2396.invoke(Unknown Source) at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at 
java.lang.reflect.Method.invoke(Method.java:606) at 
com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:861) at 
com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800) at 
com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:370) at 
com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5360) at 
com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5348) at 
com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:214) ... 36 
more


Помогите понять как правельно нужно зделать - чтоб "всё было хорошо" :)
...
Рейтинг: 0 / 0
ejb кеш HttpSesssion
    #39087567
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimchuk,

Не удаляется у вас сессия в sessionDestroyed. Точно idClient уже с 'e' или 'c'?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
@Lock(LockType.WRITE)
    public void Login(String idClient, HttpSession session) {
        //System.out.println("Method LOGIN: " + idClient + "," + session.getId());
        HttpSession s = mapa.get(idClient);
        if (s != null && s.isRequestedSessionIdValid()) {
            s.invalidate();
        }
        mapa.put(idClient, session);
    }
...
Рейтинг: 0 / 0
ejb кеш HttpSesssion
    #39087694
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimchuk,

В вашем чудо форматировании логов свихнуться можно:

ошибкаCaused by: java.lang.IllegalStateException: PWC2776: invalidate: Session already invalidated
...
Рейтинг: 0 / 0
ejb кеш HttpSesssion
    #39087900
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не особо разбирался по коду.

Как здесь уже сказали у тебя есть EJB, который управляется EJB контейнером. А также HttpSessionListener который управляется Web контейнером.

Для регистрации HttpSessionListener у тебя должен быть в web.xml
<listener>
<listener-class>....AccessCach</listener-class>
</listener>

И скорее всего этот слушатель никаким EJB Singleton не является, а просто "новый" экземпляр AccessCach
...
Рейтинг: 0 / 0
ejb кеш HttpSesssion
    #39088109
dimchuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0FD,
Относительно 'е' или 'с' - всё верно - в одних ситуация есть приставка 'с' или 'е' - это выплывает из архитектуры проэкта и вариант когда нет приставки дописал(ниже представлю) - за это отдельно Вам спасибо-забыл. Свою же ситуацию решил следующим образом. Старый синглтон был заменил на:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
import java.util.ArrayList;
import java.util.concurrent.ConcurrentHashMap;
import javax.ejb.ConcurrencyManagement;
import javax.ejb.ConcurrencyManagementType;
import javax.ejb.Singleton;
import javax.ejb.LocalBean;

/**
 *
 * @author Dima
 */
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)
@Singleton
@LocalBean

public class AccessCach {

    private ConcurrentHashMap<String, String> mapa = new ConcurrentHashMap<String, String>();
    ArrayList<String> keys = new ArrayList<String>();

    public String getValidSessionId(String idClient) {
        return mapa.get(idClient);
    }

    public void Login(String idClient, String session) {
        System.out.println("Method LOGIN: " + idClient + "," + session);
        mapa.put(idClient, session);
    }

    public void invalidateSession(String idClient) {
        System.out.println("Start destroy in cache");
        mapa.remove(idClient);

    }
}


Изпользование HttpSessionListener перенёс в другой синглтон:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Singleton;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
 *
 * @author Dima
 */
@Singleton
@LocalBean
@WebListener
public class AccessWebSessionListener implements HttpSessionListener {

    @EJB
    private AccessCach accessCach;

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        if (se.getSession().getAttribute("role") != null && se.getSession().getAttribute("role").equals("client")) {
            accessCach.invalidateSession(((ClientInfo) se.getSession().getAttribute("roleObject")).getIdClient() + "c");
            
        } else if (se.getSession().getAttribute("role") != null && se.getSession().getAttribute("role").equals("enterprise")) {
            accessCach.invalidateSession(((EnterpriseInfo) se.getSession().getAttribute("roleObject")).getIdEnterprise() + "e");
        } else {
            System.out.println("Problem");
        }
    }

}


Придал внимание аннотации @WebListener - без которой контейнер не устанавливал даный синглтон как слушателя событий для HttpSession. (Можно и в web.xml наверно прописать - но если так работает, я решил недописывать).
Дополнительно прописал ещо один бин который служит некой прослойкой при проверки валидности (servlet->AccessValidator->AccessCach.)
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
@Stateless
@LocalBean
public class AccessValidator {

    @EJB
    private AccessCach accessCach;

    public boolean isValid(HttpServletRequest request, HttpServletResponse response, String idClient) {
        String value = accessCach.getValidSessionId(idClient);
        if (value != null && value.equals(request.getSession().getId())) {
            return true;

        } else {
            response.setStatus(401);
            request.getSession().invalidate();
            //-----дополнительные работы по сбору статистики
            return false;
        }
    }
}


Этот бин прописал для того, щоб на этапе проверки валидности в сервлете - выполнить проверку доступа и собрать некую статистику которая на всех сервлетах одинакова.

Костылями дело шито - но работает ...
Прошу стого не судить ))) Всех благодарю за помощь
...
Рейтинг: 0 / 0
ejb кеш HttpSesssion
    #39088114
dimchuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vas0,

Спасибо за ответ. Долго просто свой пост набил )
...
Рейтинг: 0 / 0
ejb кеш HttpSesssion
    #39088136
vas0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimchuk,

Именно такое решение хотел предложить, EJB компоненты отдельно, Web компоненты отдельно.
Аннотации @Singleton и @LocalBean для AccessWebSessionListener это лишнее.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / ejb кеш HttpSesssion
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]