Implement domain agent

Agent base

  • For each agent there will be an abstract class Agent Base generated in the SDK

  • The Agent Base provides access to the repository, the entity builder, the event builder and the event producer

  • The Agent Base contains one abstract method named onMessage

  • The onMessage method needs to be implemented in the generated implementation file for the agent

  • The agent implementation file onMessage is automatically triggered when the Kafka event that the agent is modelled against is received.

Payload entity

  • Agent onMessage method will receive Payload Entity as first parameter (if event that the agent receives is modelled with a payload).

  • Agent onMessage method will also receive MessageHeaders as a parameter which is a key-value map that contains Kafka message headers.

Events

  • If an agent is modelled using business events, for each event there will be an inherited method in the Agent Base class that takes the event as an input and publishes it.

  • It is also possible to publish events directly using EventProducerService.

Implementation example

Example of Balance service implementation file.

    package de.knowis.cards.operations.domain.cc.agent;

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Service;
    import org.springframework.messaging.MessageHeaders;

    import de.knowis.cards.operations.sdk.domain.cc.agent.CreditCardCreatedAgentBase;
    import de.knowis.cards.operations.domain.facade.DomainEntityBuilder;
    import de.knowis.cards.operations.domain.facade.DomainEventBuilder;
    import de.knowis.cards.operations.sdk.domain.facade.Repository;
    import de.knowis.cards.operations.sdk.domain.service.EventProducerService;
    import de.knowis.cards.operations.sdk.domain.cc.entity.CreditCard;
    import de.knowis.cards.operations.sdk.domain.cc.entity.Card;

    @Service
    public class CreditCardCreatedAgent extends CreditCardCreatedAgentBase {

      private static Logger log = LoggerFactory.getLogger(CreditCardCreatedAgent.class);

      // Declare Card Command 
      private final CardCommandBase cardCommand;

      // Adjust your generated agent constructor to inject CardCommandBase so it can be used in agent logic
      public CreditCardCreatedAgent(DomainEntityBuilder entityBuilder, DomainEventBuilder eventBuilder, EventProducerService eventProducer, Repository repo, CardCommandBase cardCommand) {
        super(entityBuilder,eventBuilder, eventProducer,repo);
        this.cardCommand = cardCommand;
      }

      
      @Override
      public void onMessage(CreditCard creditCard, MessageHeaders headers) {

        log.info("Agent CreditCardCreatedAgent received event cc:CreditCardCreated");

        // Get root entity through repository
        Card card = this.repo.getCc().getCards().findById(creditCard.getId());

        // Call activateCard instance command to activate Card 
        // (this will call implemented logic for activate card command)
        cardCommand.activateCard(card);

      }

    }