Thanks Sven! Did your changes make it into the release? Or did they just miss it?
Thomas On Tue, Apr 7, 2020 at 7:43 PM Sven Meier <s...@meiers.net> wrote: > Hi Thomas, > > yes, you're right: > > wicketstuff data stores missed some adjustments to the latest updates in > wicket-core. > > And SessionQuotaManagingDataStore$DelegatedPage must be serializable of > course. > > I've pushed changes to wicketstuff master. > > Thanks > Sven > > > On 07.04.20 14:14, Thomas Heigl wrote: > > And one more thing. There is now a warning logged just before > serialization: > > > > WARN o.a.w.pageStore.AsynchronousPageStore : Delegated page store > >> 'org.apache.wicket.pageStore.SerializingPageStore' can not be > asynchronous > > > > > > On Tue, Apr 7, 2020 at 2:09 PM Thomas Heigl <tho...@umschalt.com> wrote: > > > >> The cause is the following MetaData entry in the session: > >> > >> class > >>> > org.wicketstuff.datastores.common.SessionQuotaManagingDataStore$1=org.wicketstuff.datastores.common.SessionQuotaManagingDataStore$SizeLimitedData@4090594a > >> > >> On Tue, Apr 7, 2020 at 1:59 PM Thomas Heigl <tho...@umschalt.com> > wrote: > >> > >>> Hi Sven, > >>> > >>> I just found time to give this a try with Wicket 9.0.0-M5. There seem > to > >>> be issues with serialization now. > >>> > >>> My new config: > >>> > >>> protected IPageStore newCachingStore(IPageStore pageStore) { > >>>> return new CachingPageStore(pageStore, new > InMemoryPageStore(getName(), > >>>> MAX_PAGES_CACHED_PER_SESSION)); > >>>> } > >>>> protected IPageStore newPersistentStore() { > >>>> final RedissonRedisCache redisCache = new > >>>> RedissonRedisCache(redissonClient); > >>>> final RedisDataStore redisDataStore = new RedisDataStore(getName(), > >>>> redisCache, new RedisSettings()); > >>>> return new SessionQuotaManagingDataStore(redisDataStore, > >>>> DATA_STORE_MAX_BYTES_PER_SESSION); > >>>> } > >>> > >>> This exception is logged after requests: > >>> > >>> org.springframework.data.redis.serializer.SerializationException: > Cannot > >>>> serialize; nested exception is > >>>> > org.springframework.core.serializer.support.SerializationFailedException: > >>>> Failed to serialize object using DefaultSerializer; nested exception > is > >>>> java.io.NotSerializableException: > >>>> > org.wicketstuff.datastores.common.SessionQuotaManagingDataStore$DelegatedPage > >>>> at > >>>> > org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.serialize(JdkSerializationRedisSerializer.java:96) > >>>> at > >>>> > org.springframework.data.redis.core.AbstractOperations.rawHashValue(AbstractOperations.java:185) > >>>> at > >>>> > org.springframework.data.redis.core.DefaultHashOperations.putAll(DefaultHashOperations.java:147) > >>>> at > >>>> > org.springframework.data.redis.core.DefaultBoundHashOperations.putAll(DefaultBoundHashOperations.java:147) > >>>> at > >>>> > org.springframework.session.data.redis.RedisIndexedSessionRepository$RedisSession.saveDelta(RedisIndexedSessionRepository.java:795) > >>>> at > >>>> > org.springframework.session.data.redis.RedisIndexedSessionRepository$RedisSession.save(RedisIndexedSessionRepository.java:783) > >>>> at > >>>> > org.springframework.session.data.redis.RedisIndexedSessionRepository$RedisSession.access$000(RedisIndexedSessionRepository.java:670) > >>>> at > >>>> > org.springframework.session.data.redis.RedisIndexedSessionRepository.save(RedisIndexedSessionRepository.java:398) > >>>> at > >>>> > org.springframework.session.data.redis.RedisIndexedSessionRepository.save(RedisIndexedSessionRepository.java:249) > >>>> at > >>>> > com.myproject.session.InstrumentedFindByIndexNameSessionRepository.save(InstrumentedFindByIndexNameSessionRepository.java:29) > >>>> at > >>>> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native > >>>> Method) > >>>> at > >>>> > java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) > >>>> at > >>>> > java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > >>>> at java.base/java.lang.reflect.Method.invoke(Method.java:566) > >>>> at > >>>> > org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) > >>>> at > >>>> > org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) > >>>> at > >>>> > org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) > >>>> at > >>>> > org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:88) > >>>> at > >>>> > io.micrometer.core.aop.TimedAspect.processWithTimer(TimedAspect.java:105) > >>>> at io.micrometer.core.aop.TimedAspect.timedMethod(TimedAspect.java:94) > >>>> at jdk.internal.reflect.GeneratedMethodAccessor146.invoke(Unknown > Source) > >>>> at > >>>> > java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > >>>> at java.base/java.lang.reflect.Method.invoke(Method.java:566) > >>>> at > >>>> > org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644) > >>>> at > >>>> > org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633) > >>>> at > >>>> > org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70) > >>>> at > >>>> > org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) > >>>> at > >>>> > org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95) > >>>> at > >>>> > org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) > >>>> at > >>>> > org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) > >>>> at com.sun.proxy.$Proxy296.save(Unknown Source) > >>>> at > >>>> > org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.commitSession(SessionRepositoryFilter.java:225) > >>>> at > >>>> > org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.access$100(SessionRepositoryFilter.java:192) > >>>> at > >>>> > org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:144) > >>>> at > >>>> > org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:82) > >>>> at > >>>> > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) > >>>> at > >>>> > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) > >>>> at > >>>> > org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) > >>>> at > >>>> > org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) > >>>> at > >>>> > org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:666) > >>>> at > >>>> > org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) > >>>> at > >>>> > org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) > >>>> at > >>>> > org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) > >>>> at > >>>> > org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) > >>>> at > >>>> > org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) > >>>> at > >>>> > org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) > >>>> at > >>>> > org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) > >>>> at > >>>> org.apache.tomcat.util.net > .NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1594) > >>>> at > >>>> org.apache.tomcat.util.net > .SocketProcessorBase.run(SocketProcessorBase.java:49) > >>>> at > >>>> > java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) > >>>> at > >>>> > java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) > >>>> at > >>>> > org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) > >>>> at java.base/java.lang.Thread.run(Thread.java:834) > >>>> Caused by: > >>>> > org.springframework.core.serializer.support.SerializationFailedException: > >>>> Failed to serialize object using DefaultSerializer; nested exception > is > >>>> java.io.NotSerializableException: > >>>> > org.wicketstuff.datastores.common.SessionQuotaManagingDataStore$DelegatedPage > >>>> at > >>>> > org.springframework.core.serializer.support.SerializingConverter.convert(SerializingConverter.java:68) > >>>> at > >>>> > org.springframework.core.serializer.support.SerializingConverter.convert(SerializingConverter.java:35) > >>>> at > >>>> > org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.serialize(JdkSerializationRedisSerializer.java:94) > >>>> ... 52 common frames omitted > >>>> Caused by: java.io.NotSerializableException: > >>>> > org.wicketstuff.datastores.common.SessionQuotaManagingDataStore$DelegatedPage > >>> > >>> Why does Wicket 9 try to serialize the SessionQuotaManagingDataStore in > >>> the session? Is this intended and does DelegatePage simply need to > >>> implement Serializable or shouldn't this be serialized at all? In > Wicket 8, > >>> the corresponding PageData wasn't serializable either so my guess > would be > >>> that this behavior is not intended. > >>> > >>> I'm using the following config for Wicket 8 and there are no such > issues: > >>> > >>> protected IPageStore newPageStore(IDataStore dataStore) { > >>>> final ISerializer pageSerializer = > >>>> getFrameworkSettings().getSerializer(); > >>>> return new PerSessionPageStore(pageSerializer, dataStore, > >>>> MAX_PAGES_CACHED_PER_SESSION); > >>>> } > >>>> protected IDataStore newDataStore() { > >>>> final RedissonRedisCache redisCache = new > >>>> RedissonRedisCache(redissonClient.get()); > >>>> final RedisDataStore redisDataStore = new RedisDataStore(redisCache, > new > >>>> RedisSettings()); > >>>> return new SessionQuotaManagingDataStore(redisDataStore, > >>>> DATA_STORE_MAX_BYTES_PER_SESSION); > >>>> } > >>> > >>> Best regards, > >>> > >>> Thomas > >>> > >>> On Sat, Mar 28, 2020 at 10:23 AM Thomas Heigl <tho...@umschalt.com> > >>> wrote: > >>> > >>>> Thanks Sven! > >>>> > >>>> That looks much better. I'll give it a try as soon as I can. > >>>> > >>>> Best regards, > >>>> > >>>> Thomas > >>>> > >>>> On Fri, Mar 27, 2020 at 2:23 PM Sven Meier <s...@meiers.net> wrote: > >>>> > >>>>> Hi Thomas, > >>>>> > >>>>> your question comes at the right time. > >>>>> > >>>>> I was able to improve the implementation with a new CachingPageStore: > >>>>> > >>>>> > >>>>> > https://github.com/apache/wicket/blob/8df3528dc44a08b7d375c20e764a3664cd6a5f30/wicket-core/src/main/java/org/apache/wicket/DefaultPageManagerProvider.java#L145 > >>>>> > >>>>> You can now use InMemoryPageStore as a cache too. > >>>>> > >>>>> Have fun > >>>>> Sven > >>>>> > >>>>> > >>>>> On 27.03.20 09:34, Sven Meier wrote: > >>>>>> Hi Thomas, > >>>>>> > >>>>>> I thought I covered that usecase, but I will have to take a look. > >>>>>> > >>>>>> Thanks for testing Wicket 9 > >>>>>> Sven > >>>>>> > >>>>>> On 25.03.20 20:10, Thomas Heigl wrote: > >>>>>>> Maybe the same approach could be used as for InSessionPageStore > that > >>>>>>> can be > >>>>>>> used as cache and a store: > >>>>>>> > >>>>>>> > >>>>> > https://github.com/apache/wicket/commit/894799e01227781be76886b2d1cdb2a424c812e0 > >>>>>>> > >>>>>>> On Wed, Mar 25, 2020 at 6:35 PM Thomas Heigl <tho...@umschalt.com> > >>>>>>> wrote: > >>>>>>> > >>>>>>>> Hi all, > >>>>>>>> > >>>>>>>> I just merged our master in our Wicket 9 branch and I ran into an > >>>>>>>> issue: > >>>>>>>> > >>>>>>>> Our current configuration with Wicket 8 looks like this: > >>>>>>>> > >>>>>>>> PageStore = PerSessionPageStore > >>>>>>>> DataStore = RedisDataStore > >>>>>>>> > >>>>>>>> So the page store keeps the last couple of pages of a session in > >>>>> memory > >>>>>>>> and Redis is used as a persistent store. > >>>>>>>> > >>>>>>>> I tried to recreate this behavior with Wicket 9: > >>>>>>>> > >>>>>>>> SessionStore = InMemoryPageStore > >>>>>>>> PersistentStore = RedisDataStore > >>>>>>>> > >>>>>>>> This looks correct, but it *does not work* because InMemoryPage > >>>>> store > >>>>>>>> implements AbstractPersistentPageStore and does *not* delegate to > >>>>> the > >>>>>>>> next store in the chain. > >>>>>>>> > >>>>>>>> So we basically lost the option to use a memory page store in > front > >>>>>>>> of a > >>>>>>>> persistent store. > >>>>>>>> > >>>>>>>> We need this functionality because we are using Spring Session and > >>>>>>>> cannot > >>>>>>>> use the session as a page store. > >>>>>>>> > >>>>>>>> Would it be possible to add an InMemory store that delegates to > the > >>>>>>>> next > >>>>>>>> store in the chain? Or do I have to implement it myself? > >>>>>>>> > >>>>>>>> Best regards, > >>>>>>>> > >>>>>>>> Thomas > >>>>>>>> > >>>>>> > --------------------------------------------------------------------- > >>>>>> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org > >>>>>> For additional commands, e-mail: users-h...@wicket.apache.org > >>>>>> > >>>>> --------------------------------------------------------------------- > >>>>> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org > >>>>> For additional commands, e-mail: users-h...@wicket.apache.org > >>>>> > >>>>> > > --------------------------------------------------------------------- > To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org > For additional commands, e-mail: users-h...@wicket.apache.org > >