Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / ejb кеш HttpSesssion / 13 сообщений из 13, страница 1 из 1
20.10.2015, 19:06
    #39081721
dimchuk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ejb кеш HttpSesssion
Всем привет)
Подскажите пожалуйста с ситуацией которую никак немогу понять и решить.
Примерно ожидаемый результат: пользователь залогинилса в системе на машине А, потом залогинилса на машине Б. Нужно чтоб сессия для машины А получила 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
20.10.2015, 20:29
    #39081786
breath
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ejb кеш HttpSesssion
получение доступа к SessionListener из сервлета звучит странно
...
Рейтинг: 0 / 0
20.10.2015, 23:46
    #39081909
dimchuk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ejb кеш HttpSesssion
breathполучение доступа к SessionListener из сервлета звучит странно

немогу понять - где я такое написал что сервлет стучитса к SessionListener !!!
...
Рейтинг: 0 / 0
21.10.2015, 09:43
    #39082034
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ejb кеш HttpSesssion
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
21.10.2015, 09:43
    #39082036
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ejb кеш HttpSesssion
dimchuk mapa.put(idClient, session);
}
else{
mapa.put(idClient, session);
}

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


В многопоточном окружении ваше условие никак не гарантирует что get() не вернет null.
Почитайте про то как использовать ConcurrentHashMap и особенно про методы интерфейса ConcurrentMap.
...
Рейтинг: 0 / 0
26.10.2015, 20:52
    #39087389
dimchuk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ejb кеш HttpSesssion
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
27.10.2015, 08:58
    #39087567
0FD
0FD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ejb кеш HttpSesssion
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
27.10.2015, 10:31
    #39087694
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ejb кеш HttpSesssion
dimchuk,

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

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

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

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

И скорее всего этот слушатель никаким EJB Singleton не является, а просто "новый" экземпляр AccessCach
...
Рейтинг: 0 / 0
27.10.2015, 15:00
    #39088109
dimchuk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ejb кеш HttpSesssion
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
27.10.2015, 15:02
    #39088114
dimchuk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ejb кеш HttpSesssion
vas0,

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

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


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