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 >>>> >>>>