Avalados por :

Como implementar um endpoint assíncrono para lidar com as Regras de Negócio do SAP em Java com CAP e CF

  • Creado 01/03/2024
  • Modificado 01/03/2024
  • 2 Vistas
0
Cargando...

Olá colegas,

Em nossa nova aplicação Java baseada em CAP, implementada em CF, queremos expor um endpoint que lida com as Regras de Negócio do SAP. Essas regras serão invocadas usando o cliente do tipo save para Regras de Negócio do SAP no Cloud SDK: https://sap.github.io/cloud-sdk/docs/java/features/rest/clients/btp-business-rules-rest-api . Como o processamento das regras de negócio leva algum tempo, o endpoint deve invocá-las de forma assíncrona.

Para conseguir isso, criamos uma ação (o endpoint) que imediatamente gera um evento que realizará todo o trabalho de forma assíncrona.

Nosso arquivo CDS se parece com isso:

service ruleServiceInvocationService @(path : 'ruleservices'){  type Invocations {    projectId  : String;    ruleServiceId : String;  }  action invokeMany( invocations : array of Invocations );  event invokeManyStarted : {     invocations : array of Invocations;  }}

O manipulador correspondente:

@Component@ServiceName(RuleServiceInvocationService_.CDS_NAME)@Slf4jpublic class RuleServiceInvocationServiceHandler implements EventHandler {    @On    public void onInvokeMany(InvokeManyContext context) throws JsonProcessingException {        InvokeManyStartedContext startedContext = InvokeManyStartedContext.create();        InvokeManyStarted started = InvokeManyStarted.create();        started.setInvocations(context.getInvocations());        startedContext.setData(started);        context.getService().emit(startedContext);        context.setCompleted();    }    @On    public void onInvokeManyStarted(InvokeManyStartedContext context) throws JsonProcessingException {        String projectId = context.getData().getInvocations().stream().findFirst().get().getProjectId();        HttpDestination destination = ScpCfServiceDestinationLoader.getDestinationForService(            ScpCfServiceDestinationLoader.CfServices.BUSINESS_RULES_AUTHORING,            "business-rules"        );        ProjectVersionObject project = new ProjectsApi(destination).readProject(projectId);        // Fazer algo com o projeto        context.setCompleted();    }    }    
            
Pedro Pascal
Se unió el 07/03/2018
Pinterest
Telegram
Linkedin
Whatsapp

1 Respuestas

0
Cargando...

O método emit() no CAP Java é completamente síncrono. É uma chamada de método simples que é executada completamente na mesma thread por padrão. Como não vejo que você esteja criando nenhuma thread dedicada em seu código, assumo que seu código continua sendo executado de forma síncrona.

A forma sugerida no CAP Java para alcançar um comportamento assíncrono seria executar explicitamente o código que deseja executar de forma assíncrona em uma thread dedicada. Você pode fazer isso diretamente a partir do seu método de manipulador de eventos "onInvokeMany".

Ao criar uma nova thread, você deve garantir que o RequestContext do CAP Java seja propagado para a nova thread, pois ele é armazenado em uma thread local. Ele contém informações do inquilino e garante o mesmo contexto na thread filha. Você pode encontrar documentação a respeito aqui: https://cap.cloud.sap/docs/java/request-contexts#threading-requestcontext

Se você tiver a dependência cds-integration-cloudsdk no seu classpath, as abstrações do inquilino do CAP e Cloud SDK são automaticamente sincronizadas. Portanto, o DestinationLoader do Cloud SDK deve se comportar automaticamente consciente do inquilino. Você pode encontrar mais informações a respeito aqui: https://sap.github.io/cloud-sdk/docs/java/guides/cap-sdk-integration

Quanto ao código de status: Infelizmente, não é possível influenciar o código de status HTTP de uma ação bem-sucedida para ser 202.

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019

contacto@primeinstitute.com

(+51) 1641 9379
(+57) 1489 6964

© 2024 Copyright. Todos los derechos reservados.

Desarrollado por Prime Institute

¡Hola! Soy Diana, asesora académica de Prime Institute, indícame en que curso estas interesado, saludos!
Hola ¿Puedo ayudarte?