Showing posts with label #Event Listeners. Show all posts
Showing posts with label #Event Listeners. Show all posts

Thursday, September 24, 2026

SAP Commerce Events & Event Listeners Explained: AbstractEvent, EventService, Cluster Events & Best Practices

SAP Commerce Events & Event Listeners Explained

In a large SAP Commerce implementation, different parts of the application often need to communicate with each other.

For example:

  • An order is placed.
  • Customer registration is completed.
  • Product information changes.
  • An order status changes.
  • A payment is completed.
  • A customer account is created.
  • Some background processing needs to start.

One approach is to directly call another service:

OrderService
    |
    v
PaymentService
    |
    v
NotificationService
    |
    v
IntegrationService

This can create tight coupling between components.

SAP Commerce provides an Event System that allows one component to publish an event while other components listen for that event and execute their own logic.

                    +-------------------+
                    |  Business Service |
                    +---------+---------+
                              |
                              | publishEvent()
                              v
                    +-------------------+
                    |    EventService   |
                    +---------+---------+
                              |
              +---------------+---------------+
              |               |               |
              v               v               v
        Event Listener   Event Listener   Event Listener
              |               |               |
              v               v               v
        Notification      Integration       Custom Logic

SAP Commerce's ServiceLayer event framework supports publishing events locally and across cluster nodes.

This article explains how the event framework works, how to create custom events and listeners, how cluster-aware events behave, and what senior developers should consider when designing event-driven functionality.


1. What Is an Event in SAP Commerce?

An event is an object representing something that happened in the application.

For example:

Order Placed
Customer Registered
Order Status Changed
Product Updated
Payment Completed

A component publishes the event.

Other components can register listeners that react to that event.

Conceptually:

Something happens
       |
       v
Create Event
       |
       v
Publish Event
       |
       v
EventService
       |
       +----> Listener 1
       |
       +----> Listener 2
       |
       +----> Listener 3

SAP Commerce events are subclasses of AbstractEvent.


2. Why Use Events?

The biggest advantage is loose coupling.

Suppose we have an order placement service.

Without events:

orderService.placeOrder(order);

emailService.sendOrderConfirmation(order);

inventoryService.updateInventory(order);

integrationService.sendOrderToSAP(order);

analyticsService.trackOrder(order);

The order service now knows about:

  • Email
  • Inventory
  • SAP integration
  • Analytics

This creates strong coupling.

With events:

orderService.placeOrder(order);

eventService.publishEvent(new OrderPlacedEvent(order));

Other components independently listen:

OrderPlacedEvent
       |
       +----> Email Listener
       |
       +----> Inventory Listener
       |
       +----> SAP Integration Listener
       |
       +----> Analytics Listener

The order service doesn't need to know who is listening.


3. SAP Commerce Event Architecture

The basic architecture is:

+--------------------+
| Business Component |
+---------+----------+
          |
          | publishEvent()
          v
+--------------------+
|    EventService    |
+---------+----------+
          |
          v
+--------------------+
| Event Dispatcher   |
+---------+----------+
          |
    +-----+-----+-----+
    |           |     |
    v           v     v
Listener A  Listener B Listener C

The major components are:

Event

Represents something that happened.

Example:

OrderPlacedEvent

EventService

Responsible for publishing events.

Event Listener

Receives the event and executes business logic.

AbstractEvent

Base class for SAP Commerce events.

AbstractEventListener

Base class commonly used to implement listeners.

SAP documentation specifically recommends extending AbstractEventListener for event listener implementations.


4. AbstractEvent

Custom events generally extend:

de.hybris.platform.servicelayer.event.events.AbstractEvent

A simple custom event:

public class OrderStatusChangedEvent extends AbstractEvent
{
    private final String orderCode;
    private final String oldStatus;
    private final String newStatus;

    public OrderStatusChangedEvent(
            final Object source,
            final String orderCode,
            final String oldStatus,
            final String newStatus)
    {
        super(source);
        this.orderCode = orderCode;
        this.oldStatus = oldStatus;
        this.newStatus = newStatus;
    }

    public String getOrderCode()
    {
        return orderCode;
    }

    public String getOldStatus()
    {
        return oldStatus;
    }

    public String getNewStatus()
    {
        return newStatus;
    }
}

The event contains information that the listener needs.


5. Why Should Events Be Immutable?

Events represent something that already happened.

Therefore, it is generally a good design to make event data immutable.

For example:

private final String orderCode;
private final String oldStatus;
private final String newStatus;

Instead of:

private String orderCode;

public void setOrderCode(String orderCode)
{
    this.orderCode = orderCode;
}

Prefer:

private final String orderCode;

and initialize it in the constructor.

This prevents another component from modifying the event after publication.


6. Publishing an Event

SAP Commerce uses EventService to publish events.

For example:

@Resource
private EventService eventService;

Then:

final OrderStatusChangedEvent event =
        new OrderStatusChangedEvent(
                this,
                order.getCode(),
                oldStatus,
                newStatus);

eventService.publishEvent(event);

SAP's documentation shows the same basic pattern:

eventService.publishEvent(event);

for publishing a custom AbstractEvent.


7. Creating an Event Listener

A listener can extend:

AbstractEventListener<T>

For our example:

public class OrderStatusChangedEventListener
        extends AbstractEventListener<OrderStatusChangedEvent>
{
    @Override
    protected void onEvent(final OrderStatusChangedEvent event)
    {
        System.out.println(
                "Order status changed: "
                + event.getOrderCode());
    }
}

Because we use:

AbstractEventListener<OrderStatusChangedEvent>

the listener is specifically associated with:

OrderStatusChangedEvent

SAP Commerce supports this generic approach when a listener handles one event type.


8. Generic Listener vs instanceof

You may see older implementations like:

public class MyEventListener
        extends AbstractEventListener
{
    @Override
    protected void onEvent(final AbstractEvent event)
    {
        if (event instanceof OrderStatusChangedEvent)
        {
            // process event
        }
    }
}

This works.

However, if the listener handles only one event type, the generic form is cleaner:

public class OrderStatusChangedEventListener
        extends AbstractEventListener<OrderStatusChangedEvent>
{
    @Override
    protected void onEvent(
            final OrderStatusChangedEvent event)
    {
        // process event
    }
}

SAP documentation explicitly notes that Java generics can be used when listening for a single event type.


9. Registering the Event Listener

The listener needs to be registered.

A common approach is using Spring configuration.

Example:

<bean id="orderStatusChangedEventListener"
      class="com.mycompany.core.event.listener.OrderStatusChangedEventListener"
      parent="abstractEventListener"/>

The event framework scans the application context and registers event listeners configured this way.

You can also register a listener programmatically through:

eventService.registerEventListener(listener);

This approach is useful when listeners need to be registered dynamically.


10. Complete Example

Let's build a simple end-to-end example.

Step 1: Create Event

public class OrderStatusChangedEvent extends AbstractEvent
{
    private final String orderCode;
    private final String oldStatus;
    private final String newStatus;

    public OrderStatusChangedEvent(
            final Object source,
            final String orderCode,
            final String oldStatus,
            final String newStatus)
    {
        super(source);
        this.orderCode = orderCode;
        this.oldStatus = oldStatus;
        this.newStatus = newStatus;
    }

    public String getOrderCode()
    {
        return orderCode;
    }

    public String getOldStatus()
    {
        return oldStatus;
    }

    public String getNewStatus()
    {
        return newStatus;
    }
}

11. Step 2: Create Listener

public class OrderStatusChangedEventListener
        extends AbstractEventListener<OrderStatusChangedEvent>
{
    @Override
    protected void onEvent(
            final OrderStatusChangedEvent event)
    {
        System.out.println(
                "Order: " + event.getOrderCode());

        System.out.println(
                "Old Status: " + event.getOldStatus());

        System.out.println(
                "New Status: " + event.getNewStatus());
    }
}

12. Step 3: Register Listener

Spring configuration:

<bean id="orderStatusChangedEventListener"
      class="com.mycompany.core.event.listener.OrderStatusChangedEventListener"
      parent="abstractEventListener"/>

13. Step 4: Publish Event

Suppose an order status changes.

final OrderStatusChangedEvent event =
        new OrderStatusChangedEvent(
                this,
                order.getCode(),
                oldStatus,
                newStatus);

eventService.publishEvent(event);

Flow:

Order Status Updated
        |
        v
Create OrderStatusChangedEvent
        |
        v
eventService.publishEvent()
        |
        v
OrderStatusChangedEventListener
        |
        v
Execute business logic

14. Real-World Example

Consider an SAP Commerce B2B implementation.

When an order is submitted:

Order Submitted
      |
      v
OrderPlacedEvent
      |
      +----------------------+
      |                      |
      v                      v
Send Notification       SAP Integration
      |                      |
      v                      v
Email/Message           CPI / External SAP

Another listener could update analytics:

OrderPlacedEvent
       |
       +----> Email Listener
       |
       +----> SAP Listener
       |
       +----> Analytics Listener
       |
       +----> Loyalty Listener

The order placement code doesn't have to directly call all these services.


15. Synchronous Event Processing

One of the most important interview topics is:

Are SAP Commerce events synchronous or asynchronous?

The answer is:

It depends on how the event is configured and where it is being processed.

For standard local event processing, SAP Commerce documents event publishing as synchronous on the same instance by default. The publishing thread waits for listeners to process the event.

Example:

Thread
  |
  | publishEvent()
  v
Listener A
  |
  v
Listener B
  |
  v
Listener C
  |
  v
publishEvent() returns

Therefore, a slow listener can directly affect the calling operation.


16. Why Slow Event Listeners Are Dangerous

Imagine:

@Override
protected void onEvent(final OrderPlacedEvent event)
{
    callExternalSAPSystem();
}

Suppose the external SAP call takes:

10 seconds

If this listener runs synchronously:

Order Placement
       |
       v
publishEvent()
       |
       +----> SAP call
                 |
                 | 10 seconds
                 v
             returns
       |
       v
Order operation continues

This can increase response time and potentially contribute to timeout problems.

SAP specifically advises paying attention to listener performance because synchronous publishing blocks the current thread until listeners have reacted.


17. Cluster-Aware Events

SAP Commerce can run as a cluster:

              Load Balancer
                   |
        +----------+----------+
        |          |          |
        v          v          v
      Node 1     Node 2     Node 3

Events can be published locally or across cluster nodes.

SAP Commerce provides cluster-aware event support for scenarios where events need asynchronous processing or need to reach other cluster nodes.

An event can implement:

ClusterAwareEvent

Example:

public class MyCustomEvent
        extends AbstractEvent
        implements ClusterAwareEvent
{
    public MyCustomEvent(final Object source)
    {
        super(source);
    }
}

SAP's publishing example demonstrates a custom event implementing ClusterAwareEvent.


18. Cluster Event Flow

Imagine:

Node 1
  |
  | publish event
  v
Cluster Event Mechanism
  |
  +------------+------------+
  |            |            |
  v            v            v
Node 1       Node 2       Node 3
Listener     Listener     Listener

This is particularly relevant in SAP Commerce Cloud deployments where multiple application nodes can process requests.

However, cluster-aware events should not automatically be treated as a guaranteed enterprise message-delivery mechanism.

SAP documentation notes that transient failures can prevent reliable processing on a selected node.

For business-critical integrations requiring guaranteed delivery, you should carefully consider whether an event alone is sufficient.


19. Event Listener Should Be Idempotent

This is an important senior-level design consideration.

Suppose:

OrderPlacedEvent
       |
       v
SAP Integration

If the listener processes the same logical event more than once, you don't want:

Order sent to SAP
Order sent to SAP
Order sent to SAP

Instead, design the processing to be idempotent.

For example:

if (alreadyProcessed(event))
{
    return;
}

process(event);
markAsProcessed(event);

Possible idempotency keys:

Order Code
+
Event ID
+
Business Operation

For example:

ORDER-10001 + ORDER_SUBMISSION

The exact implementation depends on the integration architecture.


20. Don't Put Heavy Business Logic Directly in the Listener

Avoid:

@Override
protected void onEvent(final OrderPlacedEvent event)
{
    // 500 lines of business logic
}

Instead:

@Override
protected void onEvent(final OrderPlacedEvent event)
{
    orderNotificationService.processOrderPlaced(event);
}

Architecture:

Event Listener
      |
      v
Service Layer
      |
      +---- DAO
      |
      +---- Integration
      |
      +---- Notification

The listener should primarily act as an event-to-service adapter.


21. Event Listener vs Interceptor

This is a very common interview question.

InterceptorEvent Listener
Executes around model lifecycle operationsReacts to published events
Tightly connected to model lifecycleLoosely coupled
Prepare / Validate / Load / RemoveBusiness event processing
Often executes during model save/load/removeExecutes when event is published
Good for validation/preparationGood for reacting to business events
Can affect save operationUsually performs follow-up processing

Example:

Interceptor

Product.save()
    |
    v
PrepareInterceptor
    |
    v
ValidateInterceptor
    |
    v
Database

Event

Order Placed
    |
    v
OrderPlacedEvent
    |
    +----> Email
    +----> Integration
    +----> Analytics

22. Event Listener vs CronJob

Another important distinction.

Event Listener

Best for:

Something happened
        |
        v
React immediately

Example:

Order placed -> send notification

CronJob

Best for:

Run periodically

Example:

Every night at 11 PM
        |
        v
Process pending orders

Don't use a CronJob just because you want to avoid designing an event flow.

Likewise, don't use an event listener for something that fundamentally requires scheduled batch processing.


23. Event vs Business Process

A Business Process is useful when the workflow itself has multiple steps and state.

For example:

Order
 |
 v
Order Confirmation
 |
 v
Payment
 |
 v
Fulfillment
 |
 v
Shipping
 |
 v
Delivery

An event can trigger a business process:

OrderPlacedEvent
       |
       v
Business Process
       |
       +--> Payment
       |
       +--> Fulfillment
       |
       +--> Notification

This distinction is important in real SAP Commerce projects.


24. Event Listener vs Direct Service Call

Suppose:

orderService.placeOrder(order);

Option 1:

notificationService.send(order);

Option 2:

eventService.publishEvent(
        new OrderPlacedEvent(order));

Use an event when multiple independent consumers may need to react to the business occurrence.

Use a direct service call when the caller explicitly requires the other service's behavior as part of the same operation.

The choice should be based on coupling, transaction requirements, processing guarantees and business semantics.


25. Transaction Considerations

This is an area where senior developers need to be careful.

Consider:

Save Order
   |
   v
Publish Event
   |
   v
Listener
   |
   v
External SAP API

You need to understand when the event is published relative to the transaction and what guarantees the listener actually has.

Do not assume:

event published = database transaction committed

or:

event listener failed = entire business transaction automatically rolled back

The exact behavior depends on the event mechanism, transaction boundaries and listener implementation.

For critical workflows, explicitly design:

  • Transaction boundaries
  • Retry behavior
  • Idempotency
  • Failure handling
  • Monitoring
  • Recovery

26. Common Mistake: Calling External Systems from Synchronous Listeners

Avoid directly doing this without considering the consequences:

@Override
protected void onEvent(final OrderPlacedEvent event)
{
    restTemplate.postForObject(
        sapUrl,
        request,
        String.class);
}

Potential problems:

Slow SAP
   |
   v
Slow listener
   |
   v
Slow transaction/request
   |
   v
Timeout

A better design may involve:

OrderPlacedEvent
       |
       v
Lightweight processing
       |
       v
Asynchronous integration mechanism
       |
       v
SAP CPI / External System

The appropriate architecture depends on the integration and delivery requirements.


27. Exception Handling in Event Listeners

Don't blindly swallow exceptions:

try
{
    process(event);
}
catch (Exception e)
{
    // ignore
}

This is dangerous because the event may appear to have succeeded while the actual business operation failed.

At minimum, make failures observable:

try
{
    process(event);
}
catch (Exception e)
{
    LOG.error(
        "Failed to process OrderPlacedEvent for order {}",
        event.getOrderCode(),
        e);

    throw e;
}

Whether the exception should be propagated, retried or handled separately depends on the processing model and business requirement.


28. Logging Best Practices

Don't log only:

LOG.error("Event failed");

Prefer useful business identifiers:

LOG.error(
    "Failed to process OrderStatusChangedEvent. " +
    "OrderCode={}, OldStatus={}, NewStatus={}",
    event.getOrderCode(),
    event.getOldStatus(),
    event.getNewStatus(),
    exception);

This makes production troubleshooting much easier.


29. Event Listener Performance

For high-volume events:

10 events/sec
100 events/sec
1000 events/sec

listener performance becomes critical.

Avoid:

for (OrderModel order : orders)
{
    flexibleSearchService.search(...);
}

This can create an N+1 query problem.

Instead:

  • Batch data retrieval
  • Use appropriate DAO methods
  • Avoid unnecessary model loading
  • Avoid repeated external calls
  • Cache where appropriate
  • Keep listener logic lightweight
  • Monitor processing time

30. Avoid Duplicate Event Publishing

Be careful with code like:

serviceA()
{
    eventService.publishEvent(event);
}

serviceB()
{
    serviceA();
    eventService.publishEvent(event);
}

You may unintentionally publish the same business event twice.

Production symptoms can include:

Duplicate emails
Duplicate integrations
Duplicate SAP messages
Duplicate audit records
Duplicate notifications

Always establish a clear event ownership rule:

Who publishes the event?
When is it published?
What does one event represent?
Who consumes it?

31. Event Naming

Use names that represent business occurrences.

Good:

OrderPlacedEvent
OrderStatusChangedEvent
CustomerRegisteredEvent
PaymentCompletedEvent

Less useful:

OrderEvent1
CustomEvent
ProcessEvent
TestEvent

A good event name should answer:

What happened?


32. Event Payload Design

Avoid putting unnecessary objects into an event.

Instead of:

private OrderModel order;
private CustomerModel customer;
private ProductModel product;
private CartModel cart;

consider whether the listener really needs all of them.

Sometimes a lightweight payload is better:

private String orderCode;
private String customerUid;
private String eventId;

The correct design depends on whether the listener needs a snapshot of information or can safely retrieve current state.


33. Event ID and Correlation ID

For enterprise systems, it is often useful to associate events with identifiers such as:

eventId
correlationId
orderCode
businessProcessId

Example:

Correlation ID:
ORD-10001

Event:
OrderPlacedEvent

External Request:
SAP-REQ-78452

This makes distributed troubleshooting much easier.


34. Debugging Event Listeners

If a listener isn't executing, check the following.

1. Is the event actually published?

Search logs around:

eventService.publishEvent(...)

2. Is the listener registered?

Check Spring configuration.

3. Is the bean loaded?

Verify the extension Spring context.

4. Is the listener listening for the correct event?

For example:

AbstractEventListener<OrderPlacedEvent>

must correspond to the event being published.

5. Is the event cluster-aware?

Check whether:

implements ClusterAwareEvent

is appropriate.

6. Check node behavior

In a clustered environment, determine which node published and processed the event.

7. Check exceptions

Look for listener exceptions in the application logs.


35. Scripts as Event Listeners

SAP Commerce also supports script-based event listeners.

This can be useful when dynamic event listener registration is required without implementing a traditional Java listener and Spring bean. SAP documents scripting support for event listeners in Commerce Cloud.

For example, a Groovy-based listener can extend:

AbstractEventListener<MyEvent>

and implement:

void onEvent(MyEvent event)
{
    println "Event received"
}

This can be useful for certain runtime/customization scenarios, but Java/Spring-based listeners remain common for application-level production functionality.


36. Complete Architecture Example

Consider a B2B order placement scenario.

                   Customer
                      |
                      v
                OCC Controller
                      |
                      v
                 Facade Layer
                      |
                      v
                 Service Layer
                      |
                      v
                Place Order
                      |
                      v
             OrderPlacedEvent
                      |
             +--------+--------+
             |        |        |
             v        v        v
          Email     SAP CPI  Analytics
          Listener  Listener  Listener
             |        |        |
             v        v        v
          Email     SAP      Reporting

This architecture keeps the order placement service from being directly coupled to every downstream consumer.


37. When Should You Use Events?

Events are particularly useful when:

  • Multiple components need to react to the same occurrence
  • You want loose coupling
  • Consumers can evolve independently
  • The action is naturally expressed as "something happened"
  • Processing can be separated from the original operation
  • Cluster-wide notification is required
  • You want to add new consumers without changing the publisher

Example:

Customer Registered
        |
        +--> Welcome Email
        +--> CRM Integration
        +--> Analytics
        +--> Loyalty

38. When Should You NOT Use Events?

Don't use events for everything.

Avoid unnecessary event chains like:

Service A
  |
  v
Event A
  |
  v
Listener A
  |
  v
Event B
  |
  v
Listener B
  |
  v
Event C

This can become extremely difficult to debug.

Sometimes a direct service call is much clearer.

Use events when they provide an architectural benefit rather than simply because the framework supports them.


39. Event vs Interceptor vs CronJob vs Business Process

A useful interview comparison:

RequirementRecommended Mechanism
Validate model before saveValidateInterceptor
Prepare model before savePrepareInterceptor
React to model lifecycleInterceptor/Event depending on requirement
React to business occurrenceEvent
Run something periodicallyCronJob
Multi-step long-running workflowBusiness Process
REST requestOCC Controller
Reusable business logicService
Data accessDAO

Remember:

Interceptor = model lifecycle

Event = business occurrence

CronJob = scheduled execution

Business Process = stateful workflow

40. Senior-Level Production Scenario

Scenario

An order placement API has suddenly become slow.

The OCC API normally responds in:

500 ms

After a new event listener was introduced:

3-5 seconds

What would you investigate?

Answer

First identify:

OCC request
    |
    v
Order placement
    |
    v
publishEvent()
    |
    v
Listener

Because local event processing is synchronous by default, a slow listener can block the calling thread.

Investigate:

  1. Listener execution time
  2. External API calls
  3. FlexibleSearch queries
  4. Number of database calls
  5. Model loading
  6. Network calls
  7. Locking
  8. Exceptions/retries
  9. Whether asynchronous processing is appropriate
  10. Whether the listener should run outside the critical request path

41. Senior Interview Questions

Question 1

What is an event in SAP Commerce?

Answer

An event is an object representing an occurrence in the application. Components publish events through EventService, while registered listeners react to those events.


Question 2

Which class is commonly extended to create a custom event?

Answer

AbstractEvent

Question 3

Which class is commonly extended to create an event listener?

Answer

AbstractEventListener<T>

SAP documents this as the standard listener implementation approach.


Question 4

How do you publish an event?

Answer

eventService.publishEvent(event);

Question 5

Are SAP Commerce events synchronous?

Answer

Local event publishing is synchronous by default. In clustered environments and with cluster-aware events, processing can involve asynchronous behavior.


Question 6

How can an event be made cluster-aware?

Answer

Implement:

ClusterAwareEvent

where appropriate.


Question 7

What is the biggest performance concern with synchronous listeners?

Answer

A slow listener can block the publishing thread and therefore increase the response time of the operation that published the event.


Question 8

Why should event listeners be idempotent?

Answer

Because event processing can encounter retries, duplicate delivery scenarios or repeated triggering depending on the architecture. Idempotent processing prevents duplicate business effects.


Question 9

Should you call external SAP APIs directly from a synchronous listener?

Answer

Not without carefully considering latency, failure, transaction boundaries and retry behavior. Long-running external calls can block the publishing thread.


Question 10

Event listener vs interceptor?

Answer

An interceptor is tied to the SAP Commerce model lifecycle, while an event listener reacts to an explicitly published event.


42. Tricky Interview Question

Question

You have:

eventService.publishEvent(event);

and three listeners:

Listener A
Listener B
Listener C

Listener A takes 5 seconds.

What happens to the publishing request?

Answer

For normal synchronous local processing, the publishing thread waits for event processing. Therefore, a slow listener can increase the time taken by the publishing operation.

This is why event listener performance is important.


43. Another Tricky Question

Question

Should an event listener contain business logic?

Answer

It can contain small amounts of event-specific handling, but large business workflows are generally better delegated to services.

Prefer:

@Override
protected void onEvent(final OrderPlacedEvent event)
{
    orderNotificationService.process(event);
}

rather than putting a large business implementation directly inside:

onEvent()

44. Best Practices Checklist

Event Design

  • Use meaningful event names
  • Keep event payload focused
  • Prefer immutable event data
  • Include useful identifiers
  • Consider correlation IDs

Listener Design

  • Keep listeners lightweight
  • Delegate business logic to services
  • Avoid unnecessary database queries
  • Avoid long synchronous external calls
  • Make processing idempotent
  • Log meaningful identifiers

Cluster

  • Understand local vs cluster processing
  • Use ClusterAwareEvent when appropriate
  • Don't assume cluster events provide guaranteed business delivery
  • Design recovery for important integrations

Production

  • Monitor listener execution time
  • Monitor failures
  • Add useful logging
  • Consider retry strategies
  • Avoid duplicate event publication

45. Key Takeaways

SAP Commerce Events provide a powerful way to implement loosely coupled communication between components.

Remember these core concepts:

AbstractEvent
      |
      v
EventService
      |
      v
AbstractEventListener

And remember the architectural differences:

Interceptor
    = Model lifecycle

Event
    = Something happened

CronJob
    = Run periodically

Business Process
    = Stateful workflow

For senior SAP Commerce developers, don't stop at knowing:

eventService.publishEvent(event);

You should also understand:

  • Synchronous processing
  • Cluster-aware events
  • Listener performance
  • Transaction boundaries
  • Idempotency
  • Error handling
  • Retry strategies
  • External integration implications
  • Event vs interceptor
  • Event vs business process
  • Production troubleshooting

These are the areas that separate basic knowledge of SAP Commerce Events from production-level understanding.