Avalados por :

Cómo implementar un punto final asíncrono para manejar las Reglas de Negocio de SAP en Java con CAP y CF

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

Hola colegas,

En nuestra nueva aplicación Java basada en CAP, implementada en CF, queremos exponer un punto final que maneje las Reglas de Negocio de SAP. Esas reglas se invocarán utilizando el cliente de tipo save para Reglas de Negocio de SAP en el Cloud SDK: https://sap.github.io/cloud-sdk/docs/java/features/rest/clients/btp-business-rules-rest-api . Dado que el procesamiento de las reglas de negocio lleva cierto tiempo, el punto final debe invocarlas de forma asíncrona.

Para lograrlo, creamos una acción (el punto final) que inmediatamente genera un evento que realizará todo el trabajo de forma asíncrona.

Nuestro archivo CDS se ve así:

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

El manejador correspondiente:

@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);        // Hacer algo con el proyecto        context.setCompleted();    }    }
            
            
Pedro Pascal
Se unió el 07/03/2018
Pinterest
Telegram
Linkedin
Whatsapp

1 Respuestas

0
Cargando...

El método emit() en CAP Java es completamente síncrono. Es una llamada de método simple que se ejecuta completamente en el mismo hilo de forma predeterminada. Dado que no veo que estés creando ningún hilo dedicado en tu código, asumo que tu código sigue ejecutándose de forma síncrona.

La forma sugerida en CAP Java para lograr un comportamiento asíncrono sería ejecutar explícitamente el código que deseas ejecutar de forma asíncrona en un hilo dedicado. Puedes hacerlo directamente desde tu método manejador de eventos "onInvokeMany".

Al crear un nuevo hilo, debes tener en cuenta propagar el RequestContext de CAP Java al nuevo hilo, ya que se almacena en un hilo local. Contiene información del inquilino y asegura el mismo contexto en el hilo hijo. Puedes encontrar documentación al respecto aquí: https://cap.cloud.sap/docs/java/request-contexts#threading-requestcontext

Si tienes la dependencia cds-integration-cloudsdk en tu classpath, las abstracciones del inquilino de CAP y Cloud SDK se sincronizan automáticamente. Por lo tanto, el DestinationLoader de Cloud SDK debería comportarse automáticamente de forma consciente del inquilino. Puedes encontrar más información al respecto aquí: https://sap.github.io/cloud-sdk/docs/java/guides/cap-sdk-integration

En cuanto al código de estado: Desafortunadamente, no es posible influir en el código de estado HTTP de una acción exitosa para que sea 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?