Search code examples
aemsling

Sling job not being processed with custom serializable property


I have created custom Serializable class, and I add it into payload of necessary Sling Job

public SomeClass extends Serializable {
    //Implementaton details
}

.......
//some service

Map<String, Object> payload = new HashMap<>();
payload.put("property1", someClassObject);

jobManager.createJob("some/job/topic").properties(payload).add();

As a reusult job is successfully created and assigned, but process method of JobConsumer is not triggered.

crx /var/eventing

I have enabled TRACE log level on org.apache.sling.event.jobs, logs say the same: job is added and assigned, nothing else is happened:

20.03.2019 11:15:00.263 DEBUG [sling-threadpool-15f9e0b4-a24d-4b0d-bf4a-433ec604e41d-(apache-sling-job-thread-pool)-27-<main queue>(com/some/Service)] org.apache.sling.event.jobs.audit ASSIGN OK bb92b672-1b0d-4fe8-bf5e-9194a934f249 : 2019/3/20/11/15/bb92b672-1b0d-4fe8-bf5e-9194a934f249_50
20.03.2019 11:15:00.263 DEBUG [sling-threadpool-15f9e0b4-a24d-4b0d-bf4a-433ec604e41d-(apache-sling-job-thread-pool)-27-<main queue>(com/some/Service)] org.apache.sling.event.jobs.audit ADD OK topic=some/job/topic, properties={spreadsheet=com.some.project.SomeClass@7acdf4a2} : 2019/3/20/11/15/bb92b672-1b0d-4fe8-bf5e-9194a934f249_50

If I pass standard serializable objects like String, Integer and etc; Job is started, and I could find evidence in logs:

20.03.2019 11:15:00.012 DEBUG [sling-threadpool-15f9e0b4-a24d-4b0d-bf4a-433ec604e41d-(apache-sling-job-thread-pool)-27-<main queue>(com/some/Service)] org.apache.sling.event.jobs.audit START OK : 2019/3/20/11/15/bb92b672-1b0d-4fe8-bf5e-9194a934f249_49

How could I resolve problem of Sling Job processing?

Tested on AEM 6.4.2 and 6.4.3


Solution

  • The problem is that your custom class is prohibited from being deserialized. Actually all classes are prohibited from being deserialized as described here . You should whitelist classes that you would like to be deserializable.

    Specific RuntimeException is only seen when you create debug logger on org.apache.sling.event.impl instead of org.apache.sling.event.jobs :

    *DEBUG* [sling-default-137-Registered Service.4303] org.apache.sling.event.impl.jobs.queues.QueueJobCache Unable to read resource.
    java.lang.UnsupportedOperationException: Deserialization not allowed for class TestEnum
        at org.kantega.notsoserial.DefaultNotSoSerial.preventDeserialization(DefaultNotSoSerial.java:256)
        at org.kantega.notsoserial.DefaultNotSoSerial.onBeforeResolveClass(DefaultNotSoSerial.java:248)
        at org.kantega.notsoserial.ObjectInputStreamClassVisitor.onBeforeResolveClass(ObjectInputStreamClassVisitor.java:48)
        at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1868)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1751)
        at java.io.ObjectInputStream.readEnum(ObjectInputStream.java:1994)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1570)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)
        at org.apache.sling.jcr.resource.internal.helper.JcrPropertyMapCacheEntry.convertToType(JcrPropertyMapCacheEntry.java:330) [org.apache.sling.jcr.resource:3.0.8]
        at org.apache.sling.jcr.resource.internal.helper.JcrPropertyMapCacheEntry.convertToType(JcrPropertyMapCacheEntry.java:231) [org.apache.sling.jcr.resource:3.0.8]
        at org.apache.sling.jcr.resource.internal.JcrValueMap.get(JcrValueMap.java:105) [org.apache.sling.jcr.resource:3.0.8]
        at org.apache.sling.event.impl.support.ResourceHelper.cloneValueMap(ResourceHelper.java:203) [org.apache.sling.event:4.2.10]
      at org.apache.sling.event.impl.jobs.Utility.readJob(Utility.java:181) [org.apache.sling.event:4.2.10]
    
    
    

    Here is the line of code that is catching this exception.