org.apache.sling.event.impl.jobs.JobManagerImpl Discarding job - properties must be serializable: job/topic | Community
Skip to main content
Lucas_Reyes
Level 2
June 24, 2023
Solved

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

  • June 24, 2023
  • 3 replies
  • 1690 views

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/event/impl/jobs/Utility.java) 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

This post is no longer active and is closed to new replies. Need help? Start a new post to ask your question.
Best answer by DPrakashRaj

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

3 replies

DPrakashRaj
Community Advisor
DPrakashRajCommunity AdvisorAccepted solution
Community Advisor
June 24, 2023

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

Tanika02
Level 7
June 26, 2023

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 + '\'' + '}'; } }

 

 

 

Lucas_Reyes
Level 2
June 26, 2023

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!