Skip to content

support for Hazelcast client-server topology user-code-deployment not working #1319

Closed
@michaelhaessig

Description

@michaelhaessig

Hi everyone

im in the process of updating from spring session 1, we have been using the client-server setup for quite some time in production.

Now with the new EntryProcessor implementation of HazelcastSessionRepository i cannot get it to work with the code deployment sample described in the issue #1101 .

i've enabled code deployment both on the server and on the client via the following xml configurations.

Server:

<user-code-deployment enabled="true">
    <class-cache-mode>ETERNAL</class-cache-mode>
    <provider-mode>LOCAL_AND_CACHED_CLASSES</provider-mode>
</user-code-deployment>

Client:

<user-code-deployment enabled="true">
    <classNames>
        <className>org.springframework.session.Session</className>
        <className>org.springframework.session.MapSession</className>
    <className>org.springframework.session.hazelcast.SessionUpdateEntryProcessor</className>
    </classNames>
</user-code-deployment>

I know this config is working because it triggers a new downstream Error when hazelcast is trying to send the SessionUpdateEntryProcessor class to the server.

The Hazelcast server throws the following error:

repository.SessionUpdateEntryProcessor.process(SessionUpdateEntryProcessor.java:27)
hazelcast_1  | 	at com.hazelcast.map.impl.operation.EntryOperator.process(EntryOperator.java:318)
hazelcast_1  | 	at com.hazelcast.map.impl.operation.EntryOperator.operateOnKeyValueInternal(EntryOperator.java:181)
hazelcast_1  | 	at com.hazelcast.map.impl.operation.EntryOperator.operateOnKeyValue(EntryOperator.java:170)
hazelcast_1  | 	at com.hazelcast.map.impl.operation.EntryOperation$EntryOperationOffload$2.run(EntryOperation.java:343)
hazelcast_1  | 	at com.hazelcast.util.executor.CachedExecutorServiceDelegate$Worker.run(CachedExecutorServiceDelegate.java:227)
hazelcast_1  | 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
hazelcast_1  | 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
hazelcast_1  | 	at java.lang.Thread.run(Thread.java:748)
hazelcast_1  | 	at com.hazelcast.util.executor.HazelcastManagedThread.executeRun(HazelcastManagedThread.java:64)
hazelcast_1  | 	at com.hazelcast.util.executor.HazelcastManagedThread.run(HazelcastManagedThread.java:80)
hazelcast_1  | Caused by: java.lang.ClassNotFoundException: Failed to load class org.springframework.security.core.context.SecurityContextImpl from other members.
hazelcast_1  | 	at com.hazelcast.internal.usercodedeployment.impl.ClassLocator.tryToGetClassFromRemote(ClassLocator.java:157)
hazelcast_1  | 	at com.hazelcast.internal.usercodedeployment.impl.ClassLocator.handleClassNotFoundException(ClassLocator.java:95)
hazelcast_1  | 	at com.hazelcast.internal.usercodedeployment.UserCodeDeploymentService.handleClassNotFoundException(UserCodeDeploymentService.java:89)
hazelcast_1  | 	at com.hazelcast.internal.usercodedeployment.UserCodeDeploymentClassLoader.loadClass(UserCodeDeploymentClassLoader.java:57)
hazelcast_1  | 	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
hazelcast_1  | 	at com.hazelcast.nio.ClassLoaderUtil.tryLoadClass(ClassLoaderUtil.java:288)
hazelcast_1  | 	at com.hazelcast.nio.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:252)
hazelcast_1  | 	at com.hazelcast.nio.IOUtil$ClassLoaderAwareObjectInputStream.resolveClass(IOUtil.java:646)
hazelcast_1  | 	at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1866)
hazelcast_1  | 	at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1749)
hazelcast_1  | 	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2040)
hazelcast_1  | 	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1571)
hazelcast_1  | 	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)
hazelcast_1  | 	at java.util.HashMap.readObject(HashMap.java:1409)
hazelcast_1  | 	at sun.reflect.GeneratedMethodAccessor13.invoke(Unknown Source)
hazelcast_1  | 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
hazelcast_1  | 	at java.lang.reflect.Method.invoke(Method.java:498)
hazelcast_1  | 	at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1158)
hazelcast_1  | 	at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2176)
hazelcast_1  | 	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2067)
hazelcast_1  | 	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1571)
hazelcast_1  | 	at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2285)
hazelcast_1  | 	at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2209)
hazelcast_1  | 	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2067)
hazelcast_1  | 	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1571)
hazelcast_1  | 	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)
hazelcast_1  | 	at com.hazelcast.internal.serialization.impl.JavaDefaultSerializers$JavaSerializer.read(JavaDefaultSerializers.java:82)
hazelcast_1  | 	... 15 more

I've tried to add spring-security jars to the hazelcast server, this fixed this error but triggered more downstream dependency errors.

Does anyone know how to fix this error ?
I've looked at the issues #1312 #1131 maybe they can fix my issue and the need to upload code to the hazelcast server.

To fix my situation i had to completely replace the HazelcastSessionRepository with my own implementation that uses the old way of get/put on the Hazelcast IMap. This is working for now.

Im looking forward to any suggesstions.

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions