0
votes

I'm using this hazelcast quartz scheduler JobStore for scheduling background jobs. I am using:

  • quartz: 2.2.3
  • Hazelcast: 3.7.2 (running in a docker container with default configuration)
  • Hazelcast-client: 3.7.2

When adding a new trigger to the hazelcast-quartz scheduler, I get the following exception on the hazelcast instance:

[3.7.2] java.lang.ClassNotFoundException: com.bikeemotion.quartz.jobstore.hazelcast.TriggerWrapper com.hazelcast.nio.serialization.HazelcastSerializationException: java.lang.ClassNotFoundException: com.bikeemotion.quartz.jobstore.hazelcast.TriggerWrapper at com.hazelcast.internal.serialization.impl.JavaDefaultSerializers$JavaSerializer.read(JavaDefaultSerializers.java:224) at com.hazelcast.internal.serialization.impl.StreamSerializerAdapter.read(StreamSerializerAdapter.java:46) at com.hazelcast.internal.serialization.impl.AbstractSerializationService.toObject(AbstractSerializationService.java:172) at com.hazelcast.map.impl.record.Records.tryStoreIntoCache(Records.java:149) at com.hazelcast.map.impl.record.Records.getValueOrCachedValue(Records.java:118) at com.hazelcast.map.impl.recordstore.AbstractRecordStore.saveIndex(AbstractRecordStore.java:146) at com.hazelcast.map.impl.recordstore.DefaultRecordStore.putInternal(DefaultRecordStore.java:741) at com.hazelcast.map.impl.recordstore.DefaultRecordStore.set(DefaultRecordStore.java:919) at com.hazelcast.map.impl.operation.SetOperation.run(SetOperation.java:44) at com.hazelcast.spi.impl.operationservice.impl.OperationRunnerImpl.run(OperationRunnerImpl.java:181) at com.hazelcast.spi.impl.operationexecutor.impl.OperationExecutorImpl.run(OperationExecutorImpl.java:375) at com.hazelcast.spi.impl.operationexecutor.impl.OperationExecutorImpl.runOrExecute(OperationExecutorImpl.java:402) at com.hazelcast.spi.impl.operationservice.impl.Invocation.doInvokeLocal(Invocation.java:283) at com.hazelcast.spi.impl.operationservice.impl.Invocation.doInvoke(Invocation.java:268) at com.hazelcast.spi.impl.operationservice.impl.Invocation.invoke0(Invocation.java:232) at com.hazelcast.spi.impl.operationservice.impl.Invocation.invoke(Invocation.java:207) at com.hazelcast.spi.impl.operationservice.impl.InvocationBuilderImpl.invoke(InvocationBuilderImpl.java:59) at com.hazelcast.client.impl.protocol.task.AbstractPartitionMessageTask.processMessage(AbstractPartitionMessageTask.java:64) at com.hazelcast.client.impl.protocol.task.AbstractMessageTask.initializeAndProcessMessage(AbstractMessageTask.java:119) at com.hazelcast.client.impl.protocol.task.AbstractMessageTask.run(AbstractMessageTask.java:99) at com.hazelcast.spi.impl.operationservice.impl.OperationRunnerImpl.run(OperationRunnerImpl.java:137) at com.hazelcast.spi.impl.operationexecutor.impl.OperationThread.process(OperationThread.java:127) at com.hazelcast.spi.impl.operationexecutor.impl.OperationThread.run(OperationThread.java:102) Caused by: java.lang.ClassNotFoundException: com.bikeemotion.quartz.jobstore.hazelcast.TriggerWrapper at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:425) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) at com.hazelcast.nio.ClassLoaderUtil.tryLoadClass(ClassLoaderUtil.java:151) at com.hazelcast.nio.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:120) at com.hazelcast.nio.IOUtil$ClassLoaderAwareObjectInputStream.resolveClass(IOUtil.java:358) at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1620) at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1521) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1779) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373) at com.hazelcast.internal.serialization.impl.JavaDefaultSerializers$JavaSerializer.read(JavaDefaultSerializers.java:219) ... 22 more

Any thoughts on what could be the issue? I'd really hate to have to have the hazelcast instance be aware of the hazelcast jobstore package. Should be able to store the trigger without having to deserialize it on hazelcast instance.

1

1 Answers

1
votes

@philip-wiebe, please see https://github.com/FlavioF/quartz-scheduler-hazelcast-jobstore/blob/master/src/main/java/com/bikeemotion/quartz/jobstore/hazelcast/HazelcastJobStore.java#L116

triggersByKey has an index on nextFireTime property, method in this case. This is why node trying to create an index & tries to deserialize the data. You need to have quartz-scheduler-hazelcast-jobstore and quartz related classes in the member classpath as well.

Note: HazelcastJobStore also have a custom predicate, this need to be available to the member as well: https://github.com/FlavioF/quartz-scheduler-hazelcast-jobstore/blob/master/src/main/java/com/bikeemotion/quartz/jobstore/hazelcast/HazelcastJobStore.java#L1259