Translate

miércoles, 27 de agosto de 2014

Ejemplo Básico Parallel Processing con Modulo de Funciones

Iniciemos explicando cómo podemos generar un proceso paralelo usando modulo de funciones:
Básicamente son dos fragmentos de código los cuales se deben desarrollar:
Después de seleccionar los datos a procesar se hace la llamada al modulo de funciones que se va a ejecutar en paralelo:
START-OF-SELECTION.
PERFORM GET_DATA CHANGING  tab_datos.
“Nos enfocaremos solo en el perform call parallel
PERFORM CALL_PARALLEL USING TAB_DATOS.
PERFORM SHOW_LOGS USING GT_LOG.

FORM call_parallel  using tab_datos  type ztt_datos.
Field-Symbols: <fs_datos> type zst_datos.
Loop at tab_datos assigning <fs_datos> .
  CALL FUNCTION 'Z_FM_PARALLELS' STARTING NEW TASK gv_taskname
    DESTINATION IN GROUP gv_system
    PERFORMING f_finalizar_funcion ON END OF TASK
    EXPORTING
      it_datos    = <fs_datos>
“ Es muy importante agregar las exceptions ya que nos permitirán informarnos en qué momento “falla la llamada al paralelo y saber la razón”
    EXCEPTIONS                
      system_failure        = 1  MESSAGE mess
      communication_failure = 2  MESSAGE mess
      resource_failure      = 3.      "Tipo de relación
  CASE sy-subrc.
    WHEN 0. "Si no hay error se incrementa contador de éxito.
      gv_snd_jobs = gv_snd_jobs + 1.
    WHEN 1 or 2.
      MESSAGE mess TYPE 'I'.
    WHEN 3. "Si hubo error se hace esperar a la tarea.
      IF  gv_snd_jobs >= 1 AND gv_exc_flag = 0.
        gv_exc_flag = 1.
        WAIT UNTIL gv_rcv_jobs >= gv_snd_jobs
        UP TO 5 SECONDS.
      ENDIF.
      IF sy-subrc = 0.
        gv_exc_flag = 0.
      ELSE.
        MESSAGE 'Resource failure' TYPE 'I'.
      ENDIF.
    WHEN OTHERS.
      MESSAGE 'Other Error' TYPE 'I'.
Endloop….
* Se hace esperar a la tarea para que se ejecute correctamente.
  WAIT UNTIL gv_rcv_jobs >= gv_snd_jobs.
Endform.

Una vez finalizado todos los llamados a la función paralela el programa llama al perform donde recibimos el resultado de su ejecución y guardamos los logs correspondientes.
FORM f_finalizar_funcion USING gv_taskname.
  DATA: mess  TYPE c LENGTH 80.
  task_wa-name = gv_taskname.
  gv_rcv_jobs = gv_rcv_jobs + 1.
* Se reciben los resultados del RFC para loguear los mensajes.
  RECEIVE RESULTS FROM FUNCTION ' Z_FM_PARALLELS '
   TABLES
    e_tab_return = gt_log
“Es importante colocar las exceptions en caso de algún error de comunicación o el paralelo tenga “algún problema
  EXCEPTIONS
      system_failure        = 1 MESSAGE mess
      communication_failure = 2 MESSAGE mess .
  IF sy-subrc eq 0.
    task_wa-dest = info-rfcdest.
  ELSE.
    task_wa-dest = mess.
  ENDIF.
  APPEND task_wa TO task_list.
*
* Se loguean todos los mensajes
  CLEAR gs_log.
  LOOP AT gt_log INTO gs_log.
    CLEAR gv_tam_msj.
    gv_tam_msj = strlen( gs_log-message ).
    IF gv_tam_msj > 50.
      gs_message-msg_text_2 = gs_log-message+50.
      IF gv_tam_msj > 100.
        gs_message-msg_text_3 = gs_log-message+100.
      ENDIF.
    ENDIF.
    gs_message-msgty      = gs_log-type.
    gs_message-msg_text_1 = gs_log-message.
    APPEND gs_message TO gt_message.
    CLEAR: gs_message.
*           gt_message[].
    CLEAR gs_log.
*
  ENDLOOP.
  FREE: gt_log.
*
ENDFORM.



Cabe destacar que con esta lógica solo estamos generando un proceso paralelo por cada registro de la tabla interna y lo ideal sería darle mas carga a la función paralela para que sea más eficiente.

No hay comentarios.:

Publicar un comentario