Avalados por :
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(); } }