Está en la página 1de 12

Cree un demonio ABAP simple

2019-04-03
Intermedio 20 minutos.
Desarrollo ABAP, Intermedio, Tutorial

Aprenda a crear ABAP Daemons e interactuar con ellos mediante mensajes PCP.
Aprenderás

 Cómo crear y ejecutar un demonio ABAP


 Cómo enviar mensajes de PCP a un demonio ABAP

Prerrequisitos

 Su sistema debe basarse en SAP NetWeaver 7.52 o superior.


 Necesita utilizar herramientas de desarrollo ABAP .

Introducción a los demonios ABAP

ABAP Daemon son proporcionados por ABAP Daemon Framework (ADF). Se utilizan para
gestionar eventos de forma fiable al ejecutarse en sesiones con una vida útil ilimitada. Los
programas ABAP pueden comunicarse con los demonios enviándoles mensajes mediante los
canales de mensajería ABAP y el protocolo de canal push del tipo de mensaje.

Puede familiarizarse más con ABAP Daemon Framework leyendo la documentación oficial .

Push Channel Protocol (PCP) es un formato de comunicación similar a un mensaje HTTP


simple. Consta de campos de encabezado (pares de nombre-valor) para metadatos y un
cuerpo de mensaje. Para obtener más información, consulte la Especificación del protocolo de
canal push .

Paso 1: crear una nueva clase ABAP Daemon


ABAP Daemon son instancias de una clase ABAP Daemon que amplían la clase
base  CL_ABAP_DAEMON_EXT_BASE .

Primero, cree una nueva clase ABAP  ZCL_TUTORIAL_SIMPLE_DAEMON y


configúrela  CL_ABAP_DAEMON_EXT_BASE como su superclase.

Como puede ver, hay un error en la línea 1 ya que aún no se han implementado los métodos
abstractos necesarios. Haga clic en la bombilla junto al número de línea y seleccione Agregar
9 métodos no implementados para resolver esto:
Hecho

Inicie sesión para responder la pregunta

Paso 2: implementar el método ON_ACCEPT


Antes de que se pueda crear una nueva instancia de la clase ABAP Daemon,  ON_ACCEPT se

llama a su método para determinar si debe iniciarse el daemon.

Reemplace su  ON_ACCEPT método con el siguiente código. Acepta todas las solicitudes de inicio

de su propia clase y rechaza todas las solicitudes de cualquier otro programa. Esto se logra
comprobando el programa de llamada que inició el inicio.

abap

Copiar
METHOD if_abap_daemon_extension~on_accept.
TRY.
DATA lv_program_name TYPE program.
lv_program_name = cl_oo_classname_service=>get_classpool_name(
'ZCL_TUTORIAL_SIMPLE_DAEMON' ).

IF i_context_base->get_start_caller_info( )-program = lv_program_name.


e_setup_mode = co_setup_mode-accept.
ELSE.
e_setup_mode = co_setup_mode-reject.
ENDIF.
CATCH cx_abap_daemon_error.
" to do: error handling, e.g. write error log!
e_setup_mode = co_setup_mode-reject.
ENDTRY.
ENDMETHOD.

Hecho

Paso 3: implementar el método ON_START


Para iniciar ABAP Daemon,  ON_START se ejecuta el método.

Puede incluir un mensaje de PCP que contenga parámetros de inicio arbitrarios a los que se
puede acceder en el  ON_START método.

En este escenario simple, pasará un parámetro a  timeout través de PCP. El demonio

configurará un temporizador para mostrar un mensaje emergente cada vez que se agote el
tiempo de espera. Se utilizará un contador para detener el temporizador después de cinco
mensajes.

Al principio, debe crear algunas variables de miembros privados para almacenar los datos
necesarios. Agregue estas líneas al  PRIVATE SECTION de su clase:

ABAP

Copiar
DATA: mv_timeout TYPE i,
mo_timer TYPE REF TO if_abap_timer_manager,
mv_counter TYPE i.

En el  ON_START método, ahora puede recuperar el valor de tiempo de espera de PCP e iniciar el

temporizador después. Para hacerlo, copie la siguiente implementación:

abap

Copiar
METHOD if_abap_daemon_extension~on_start.
TRY.
" retrieve timeout from PCP start parameters
mv_timeout = i_context->get_start_parameter( )->get_field( 'timeout' ).

" start timer for displaying messages


mo_timer = cl_abap_timer_manager=>get_timer_manager( ).
mo_timer->start_timer( i_timeout = mv_timeout i_timer_handler = me ).

CATCH cx_abap_daemon_error cx_ac_message_type_pcp_error cx_abap_timer_error.


" to do: error handling, e.g. write error log!
ENDTRY.
ENDMETHOD.

¡PRECAUCIÓN! Agregue su propio manejo de excepciones para aplicaciones productivas, ya


que esto no se ha incluido en este sencillo tutorial.

Hecho
Paso 4: implementar el método ON_TIMEOUT
Mientras su Daemon ABAP se ejecuta en segundo plano, el  ON_TIMEOUT método se activará

cuando transcurra el tiempo de espera. Por lo tanto, debe implementar una interfaz de


controlador. Agrega este código al  PUBLIC SECTION de tu clase:

ABAP

Copiar
INTERFACES if_abap_timer_handler.

Ahora inserte el siguiente  ON_TIMEOUT método en la implementación de su clase. Mostrará un


mensaje emergente usando el módulo de función  TH_POPUP y reiniciará el temporizador cinco

veces:

ABAP

Copiar
METHOD if_abap_timer_handler~on_timeout.
" increment the loop counter
ADD 1 TO mv_counter.

" display popup message


CALL FUNCTION 'TH_POPUP'
EXPORTING
client = sy-mandt
user = sy-uname
message = CONV th_popup( |Timeout triggered. Number of loops: { mv_counter }| ).

" restart the timer if any loops are remaining


IF mv_counter < 5.
TRY.
mo_timer->start_timer( i_timeout = mv_timeout i_timer_handler = me ).
CATCH cx_abap_timer_error.
" to do: error handling, e.g. write error log!
ENDTRY.
ENDIF.
ENDMETHOD.

Hecho
Paso 5: implementar el método ON_MESSAGE
También puede enviar mensajes PCP a su demonio mientras se ejecuta continuamente en
segundo plano. El  ON_MESSAGE método se llamará cada vez que el daemon reciba un mensaje de

PCP.

En este tutorial, enviará un texto sin formato al demonio, que luego se mostrará en un mensaje
emergente. Como ejemplo de la vida real, podría imaginarse al ABAP Daemon recibiendo datos
en vivo de un sensor y enviando una notificación bajo ciertas condiciones.

Reemplace su  ON_MESSAGE método con este código:

abap

Copiar
METHOD if_abap_daemon_extension~on_message.
TRY.
" get text from PCP message
DATA(lv_text) = i_message->get_text( ).

" display popup


CALL FUNCTION 'TH_POPUP'
EXPORTING
client = sy-mandt
user = sy-uname
message = CONV th_popup( |Message received: { lv_text }| ).
CATCH cx_ac_message_type_pcp_error.
" to do: error handling, e.g. write error log!
ENDTRY.
ENDMETHOD.

Hecho
Paso 6: Implementar el método estático START
Dado que el concepto de seguridad de ABAP Daemons se basa en la “autorización del código
fuente” (ver documentación), es decir, sólo el programa (por ejemplo, una clase) que inicia el
daemon tiene derecho a enviar mensajes al daemon o detenerlo. Por razones de simplicidad,
usamos la clase daemon para implementar las funcionalidades de inicio, parada y envío para
que el daemon acceda a ellas desde diferentes programas.

Este simple demonio ABAP se iniciará mediante un método estático. Por lo tanto, necesita
crear un nuevo método  START en su clase demonio con dos parámetros de importación:

 IV_DAEMON_NAME : El nombre del demonio

 IV_TIMEOUT : El tiempo de espera entre dos eventos de temporizador sucesivos


(milisegundos)

Para hacerlo, pegue el siguiente código en la  PUBLIC SECTION definición de la clase:

ABAP
Copiar
CLASS-METHODS start
IMPORTING
iv_daemon_name TYPE string
iv_timeout TYPE i
RAISING
cx_abap_daemon_error
cx_ac_message_type_pcp_error.

Cree una instancia del ABAP Daemon usando ABAP Daemon Manager. Su método
estático  CL_ABAP_DAEMON_CLIENT_MANAGER=>START requiere el nombre y la prioridad del demonio
como parámetros. Además, puede pasar los parámetros de inicio como un mensaje de PCP.

Copie estas líneas en la implementación de su clase:

ABAP
Copiar
METHOD start.
" set ABAP Daemon start parameters
DATA(lo_pcp) = cl_ac_message_type_pcp=>create( ).
lo_pcp->set_field( i_name = 'timeout' i_value = CONV #( iv_timeout ) ).

" start the daemon application using the ABAP Daemon Manager
cl_abap_daemon_client_manager=>start(
i_class_name = 'ZCL_TUTORIAL_SIMPLE_DAEMON'
i_name = CONV #( iv_daemon_name )
i_priority = cl_abap_daemon_client_manager=>co_session_priority_low
i_parameter = lo_pcp ).
ENDMETHOD.

Hecho
Paso 7: Implementar el método estático
Implemente un método estático  SEND que se utilizará para enviar texto al demonio y, por lo
tanto, activar su  ON_MESSAGE método. El método necesitará los siguientes parámetros de
importación:

 IV_DAEMON_NAME : El nombre del demonio que recibirá el mensaje.

 IV_TEXT : El mensaje de texto que se enviará al demonio.

Puede tener varias instancias de su demonio ejecutándose de forma independiente al mismo


tiempo, ya que se pueden distinguir por su nombre.

Pegue el código siguiente en la  PUBLIC SECTION definición de la clase.

ABAP
Copiar
CLASS-METHODS send
IMPORTING
iv_daemon_name TYPE string
iv_text TYPE string
RAISING
cx_abap_daemon_error
cx_ac_message_type_pcp_error.

Para enviar mensajes de PCP a su daemon, primero debe recuperar una lista de todas las
instancias de ABAP Daemon de su clase en ejecución  ZCL_TUTORIAL_SIMPLE_DAEMON . Luego,
puede comparar el nombre de cada instancia  IV_DAEMON_NAME y enviar el mensaje del PCP en
consecuencia.

Inserte el siguiente código en la implementación de la clase:

ABAP
Copiar
METHOD send.
" retrieve the list of ABAP Daemon instances
DATA(lt_ad_info) = cl_abap_daemon_client_manager=>get_daemon_info( i_class_name =
'ZCL_TUTORIAL_SIMPLE_DAEMON').
" create PCP message with text
DATA(lo_pcp) = cl_ac_message_type_pcp=>create( ).
lo_pcp->set_text( iv_text ).

" for each running daemon instance of this class


LOOP AT lt_ad_info ASSIGNING FIELD-SYMBOL(<ls_info>).
" send a message if the names match
IF iv_daemon_name = <ls_info>-name.
cl_abap_daemon_client_manager=>attach( <ls_info>-instance_id )->send( lo_pcp ).
ENDIF.
ENDLOOP.
ENDMETHOD.
Hecho

Paso 8: Ejecute el demonio ABAP


¡Felicitaciones, ya ha creado su primera clase ABAP Daemon! 

Actívelo presionando  Ctrl+F3 .

Puede ejecutar su demonio simplemente llamando al  START método estático creado


previamente. Por lo tanto, cree un nuevo programa ABAP  Z_TUTORIAL_SIMPLE_DAEMON_START con

solo una línea de código:

abap

Copiar
zcl_tutorial_simple_daemon=>start( iv_daemon_name = 'simple_daemon' iv_timeout = 10000 ).

Active el programa y ejecútelo como Aplicación ABAP :

Debería ver una notificación emergente cada 10 segundos:

Hecho
Paso 9: enviar mensajes al demonio ABAP
Además del tiempo de espera, puede activar un mensaje emergente manualmente llamando
al  SEND método estático. Cree otro programa ABAP  Z_TUTORIAL_SIMPLE_DAEMON_SEND con el

siguiente contenido:

abap

Copiar
DATA(lv_text) = `This is a simple ABAP Daemon message sent via PCP.`.
zcl_tutorial_simple_daemon=>send( iv_daemon_name = 'simple_daemon' iv_text = lv_text ).

Siéntase libre de cambiar el texto del mensaje en la línea 1. Después de activar y ejecutar el
programa, debería ver un mensaje emergente similar a este:

Si no recibe ningún mensaje: Asegúrese de que su daemon se haya iniciado previamente en


el paso 8. El daemon seguirá ejecutándose incluso después de que se detengan los mensajes
emergentes.

Hecho
Paso 10: Detenga el demonio ABAP
Puede supervisar todos los Daemons ABAP en ejecución mediante transacciones  SMDAEMON en
SAPGUI. Allí puede ver su estado, verificar si hay errores y también reiniciarlos y terminarlos.

Para detener su daemon, selecciónelo de la lista y vaya a ABAP Daemon > Terminate


Daemon 

Alternativamente, también puede crear un  STOP método estático . Por lo tanto, agregue esto a
la  PUBLIC SECTION definición de su clase:

ABAP
Copiar
CLASS-METHODS stop
IMPORTING
iv_daemon_name TYPE string
RAISING
cx_abap_daemon_error.

Copie las siguientes líneas en la implementación de la clase:

ABAP
Copiar
METHOD stop.
" retrieve the list of ABAP Daemon instances
DATA(lt_ad_info) = cl_abap_daemon_client_manager=>get_daemon_info( i_class_name =
'ZCL_TUTORIAL_SIMPLE_DAEMON').

" for each running daemon instance of this class


LOOP AT lt_ad_info ASSIGNING FIELD-SYMBOL(<ls_info>).

" stop the daemon if the names match


IF iv_daemon_name = <ls_info>-name.
cl_abap_daemon_client_manager=>stop( i_instance_id = <ls_info>-instance_id ).
ENDIF.

ENDLOOP.
ENDMETHOD.

Ahora puede detener su demonio ejecutando

ABAP
Copiar
zcl_tutorial_simple_daemon=>stop( iv_daemon_name = 'simple_daemon' ).

de cualquier programa ABAP.

Para obtener más información sobre ABAP Daemons, consulte la documentación de ABAP
Daemons .
Hecho

Paso 11: prueba tu aplicación


Inicie su demonio usando la siguiente línea de código. Tenga en cuenta que el nombre del
demonio ahora es significativamente más largo y el tiempo de espera es negativo.

ABAP
Copiar
zcl_tutorial_simple_daemon=>start( iv_daemon_name =
'does_the_daemon_start_up_if_you_use_this_as_your_daemon_name' iv_timeout = -10000 ).

También podría gustarte