0

I have a problem with tomcat session replication using DeltaManager. After I've figured out all problems(not serializable properties) with my SessionScoped beans (CDI) now I get an error which I cannot fix cause I don't know where the problem is. Here's stacktrace on the bottom.

I've walked trough my code and search for suspicious HttpSession setAttribute calls or something like that and found nothing. Im using weld-servlet 2.4.5.Final and weld-api 2.4.Final.

How can I find out what is the true problem?

`11-Sep-2019 11:15:43.331 SEVERE [http-nio-8081-exec-5] org.apache.catalina.ha.session.DeltaManager.requestCompleted Unable to serialize delta request for sessionid [8C493261547F84FCDF306258240EFC76]
 java.io.NotSerializableException: com.sun.faces.cdi.SessionProducer$$Lambda$43/678571560
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
    at org.apache.catalina.ha.session.DeltaRequest$AttributeInfo.writeExternal(DeltaRequest.java:401)
    at org.apache.catalina.ha.session.DeltaRequest.writeExternal(DeltaRequest.java:294)
    at org.apache.catalina.ha.session.DeltaRequest.serialize(DeltaRequest.java:308)
    at org.apache.catalina.ha.session.DeltaManager.serializeDeltaRequest(DeltaManager.java:594)
    at org.apache.catalina.ha.session.DeltaManager.requestCompleted(DeltaManager.java:979)
    at org.apache.catalina.ha.session.DeltaManager.requestCompleted(DeltaManager.java:946)
    at org.apache.catalina.ha.tcp.ReplicationValve.send(ReplicationValve.java:523)
    at org.apache.catalina.ha.tcp.ReplicationValve.sendMessage(ReplicationValve.java:511)
    at org.apache.catalina.ha.tcp.ReplicationValve.sendSessionReplicationMessage(ReplicationValve.java:493)
    at org.apache.catalina.ha.tcp.ReplicationValve.sendReplicationMessage(ReplicationValve.java:404)
    at org.apache.catalina.ha.tcp.ReplicationValve.invoke(ReplicationValve.java:333)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)`
Rembrandt
  • 81
  • 1
  • 7
  • You might want to either set a breakpoint onto the `java.io.NotSerializableException` and debug which bean or Session entry is currently in progress of serialization, or get the Memory Analyzer (eclipse) plugin and inspect all reference paths to all `com.sun.faces.cdi.SessionProducer` instances. – Selaron Sep 11 '19 at 13:14
  • Ive created a heapdump when i get an NotSerializableException and look for SessionProducer object in dominator_tree(MAT) and found none of my classes in outgoung or incoming references... i dont have a clue right now – Rembrandt Sep 12 '19 at 08:57
  • Is there an incoming reference from a session object? It might reside somewhere in a ViewMap or the SessionMap which is serialized, it's not necessarily reference by one of your beans. – Selaron Sep 13 '19 at 11:19
  • ive moved a little bit further... it seems like theres problem with lambda serialization in javax.faces SessionProducer class - but i dont have a clue how to change that code without changing internal dependency code – Rembrandt Jul 06 '20 at 11:32
  • Not sure if that helps: you can cast Lambdas to be serializable: https://stackoverflow.com/questions/22807912/how-to-serialize-a-lambda - but if foreign code stores Lambdas in session without casting, that's a problem. – Selaron Jul 11 '20 at 10:55

1 Answers1

0

I've figured it out. I've created an alternative bean for "request" named bean which is created by SessionProducer class from CDI. My bean provides methods I need and its request scoped instead of session scoped. I still don't understand why such bean created by jsf/cdi framework is meant be session scoped. I think it will always throw an error when you use tomcat and try to serialize session objects.

Rembrandt
  • 81
  • 1
  • 7