Expand my Community achievements bar.

Don’t miss the AEM Skill Exchange in SF on Nov 14—hear from industry leaders, learn best practices, and enhance your AEM strategy with practical tips.
SOLVED

org.apache.sling.event.impl.jobs.JobManagerImpl Discarding job - properties must be serializable: job/topic

Avatar

Level 2

Hello,

 

I am getting an exception when processing DamEvent events on my Job manager that implements EventHandler. I am using code guidelines from  references below. My code works fine when processing PageEvent but it does not process the job for DamEvent.

 
public static final String JOB_TOPIC = "aem/solr/indexing/job";
final Map<String, Object> payload = new HashMap<String, Object>();
DamEvent damEvent = DamEvent.fromEvent(event);
payload.put("damEvent", damEvent);
jobManager.addJob(JOB_TOPIC, payload); 
 
** It works when using PageEvent pageEvent = PageEvent.fromEvent(event);
 
In the error log I see this exception on DamEvent events:

the 23.06.2023 16:43:12.938 *WARN* [EventAdminThread #20] org.apache.sling.event.impl.jobs.JobManagerImpl Discarding job - properties must be serializable: aem/solr/indexing/job : {damEvent=com.day.cq.dam.api.DamEvent@733fc832}

 

I see this note in the Sling documentation which I don't quite understand: "The job topic follows the conventions for the topic of an OSGi event. All objects in the payload must be serializable and publically available (exported by a bundle). This is required as the job is persisted and unmarshalled before processing.

Also, I see there is a checkJob in the API (https://github.com/apache/sling-org-apache-sling-event/blob/master/src/main/java/org/apache/sling/ev...) which describes the exception I am getting. 

 

Is this a bug? I am working on AEM 6.5.15.0 

 

References:

https://sling.apache.org/documentation/bundles/apache-sling-eventing-and-job-handling.html

https://sling.apache.org/documentation/tutorials-how-tos/how-to-manage-events-in-sling.html

1 Accepted Solution

Avatar

Correct answer by
Community Advisor
3 Replies

Avatar

Correct answer by
Community Advisor

By default objects on aem are not serialized and your payload need to be serialized as explained on https://sling.apache.org/documentation/bundles/apache-sling-eventing-and-job-handling.html

you need to deserialized your payload object(damevent)as explained https://helpx.adobe.com/experience-manager/kb/deserialization-not-allowed-error.html

 

https://www.linkedin.com/pulse/aem-sling-jobs-processed-nurbek-umirov

Avatar

Community Advisor

Hello @Lucas_Reyes - 

 

As per the Apache Sling documentation

 

All objects in the payload of a job must be serializable. This is because the job is persisted and unmarshalled before processing. Serialization allows the objects to be converted into a format that can be stored and reconstructed later.

 

Issue : You are trying to add it directly to the payload using payload.put("damEvent", damEvent);. However, the DamEvent class might not implement the Serializable interface, causing the serialization error.

 

 

import java.io.Serializable;

public class CustomDamEventData implements Serializable {
    // Define necessary fields to hold the extracted information from DamEvent
    private String eventId;
    private String eventPath;
    
    // Constructors, getters, and setters for the fields
    // ...

    @Override
    public String toString() {
        return "CustomDamEventData{" +
                "eventId='" + eventId + '\'' +
                ", eventPath='" + eventPath + '\'' +
                '}';
    }
}

 

 

 

Avatar

Level 2

Thank you for your replies DPrakashRaj and Tanika02.

 

I was missing the fact that DamEvent does not implement Serializable, but DamEvent.Type does. So a little bit of refactoring fixed my issue while sending the payload:

DamEvent damEvent = DamEvent.fromEvent(event);
payload.put("eventType"damEvent.getType());
payload.put("assetPath"damEvent.getAssetPath());
 
Thank you!