Sunteți pe pagina 1din 4

9/9/2016

ABAPZombieProcessamentoemParaleloutilizandoRFCAssncrona

as
ic
D

Back to Top

AP
AB
1,356
Fans

821
Followers

RSS
Subscribe

Assine o nosso podcast

oniTunes

onAndroid

viaRSS

Published on March 12th, 2012 | by Daiane Zigiotto

32

Processamento em Paralelo
utilizando RFC Assncrona
Demorou, mas chegou! Meu post inaugural no ABAP Zombie! Vou comear falando um
pouco sobre processamento paralelo com RFC Assncrona. Hein???
O processamento em paralelo (ou paralelismo) no um conceito novo, mas pouco
utilizado para melhoria de performance. Por qu?
Em alguns casos podemos utilizar mais de uma sesso (ou task) disponvel, mas geralmente
utilizamos apenas uma delas. como se uma transportadora contasse apenas com um
caminho para levar seus produtos, quando h uma frota inteira de caminhes que podem
ser utilizados.
No s isso, a maioria dos sistemas conta com mais de um servidor de aplicao com uma
srie de sesses disponveis. Ento, o que estamos esperando?

Links que no envelhecem

O que NO fazer num cdigo ABAP


Quer Trabalhar com SAP?
Cdigos ABAPZombie
Transaes
Guia de Comandos
HANA, HANA, HANA
RTTS
ABAP um lixo
Transporte de Requests
Todo ABAPer um Consultor?
SAP Netweaver Gateway
UI5, OpenUI5 e Fiori
Desvalorizao do mercado ABAP
Transporte de Requests
Diverso com BSP e JQuery

Livro anti-zumbis
Escrito por Mauricio Cruz, sobre o mundo ABAP.
Diverso e informao para iniciantes, plenos e
sniors! Clique para conhecer:

http://www.abapzombie.com/dicasabap/2012/03/12/processamentoemparaleloutilizandorfcassincrona/

1/12

9/9/2016

ABAPZombieProcessamentoemParaleloutilizandoRFCAssncrona

Categorias!
Dicas ABAP (67)

Mundo SAP (27)

Dicas CRM (16)

Non-ABAP (3)

Dicas PI (7)

O Topic (32)

Guias (62)

Podcast (6)

Mundo SAP (27)

Utilizar processamento paralelo ou no, eis a questo!

Neste post vou mostrar um exemplo prtico utilizando RFC Assncrona. Vamos tentar
equilibrar o trabalho do programa com base no nmero de dados informados na tela de
seleo e nas sesses disponveis nos servidores de aplicao. Por ltimo, vamos analisar o
tempo de execuo do programa e comparar a execuo utilizando uma nica sesso.
Ento, vamos l!
Default
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

REPORTzppbap_rfc_assincrona.
**********************************************************************
* VARIVEIS GLOBAIS (V_...)*
**********************************************************************
DATA: v_tasksTYPE i,
v_task_idTYPE numc2,
v_task_count TYPE i,
v_task_ativa TYPE i.

**********************************************************************
* TABELA INTERNA (T_...) *
**********************************************************************
DATA: t_bsegTYPE TABLE OF bseg,
t_bseg_auxTYPE TABLE OF bseg.

**********************************************************************
* TABELA *
**********************************************************************
TABLES: bseg.

**********************************************************************
* PARMETROS DE TELA:*
* SELECT OPTIONS (S_...) *
* PARAMETERS (P_...) *
**********************************************************************
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.

SELECT-OPTIONS: s_gjahr FOR bseg-gjahr OBLIGATORY NO INTERVALS. "Ano


* Obs. Estou utilizando apenas como chave o campo GJAHR, pois o ambiente
* que estou fazendo testes no possui muitos registros

SELECTION-SCREEN END OF BLOCK b1.

**********************************************************************
* START-OF-SELECTION *
**********************************************************************
START-OF-SELECTION.
DATA: wa_gjahr LIKE LINE OF s_gjahr.

* Obter o nmero de sesses disponveis


CALL FUNCTION 'SPBT_INITIALIZE'
IMPORTING
free_pbt_wps = v_tasks
EXCEPTIONS
invalid_group_name = 1
internal_error = 2

http://www.abapzombie.com/dicasabap/2012/03/12/processamentoemparaleloutilizandorfcassincrona/

2/12

9/9/2016
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121

ABAPZombieProcessamentoemParaleloutilizandoRFCAssncrona
pbt_env_already_initialized= 3
currently_no_resources_avail = 4
no_pbt_resources_found = 5
cant_init_different_pbt_groups = 6
OTHERS = 7.

IF sy-subrc <> 0.
*** Mensagem de erro
LEAVE LIST-PROCESSING.
ENDIF.

* Para cada ano informado na tela de seleo, ser chamada a RFC


LOOP AT s_gjahr INTO wa_gjahr.

* Como no sabemos a quantidade de registros, devemos controlar quantas sesses sero geradas
DO.

* Incrementar ao contador de sesses ativas


IF sy-subrc IS INITIAL.
ADD 1 TO v_task_ativa.
ENDIF.

* Verificar se o nmero de sesses ativas est dentro do limite


IF v_task_ativa <= v_tasks.

* Cada sesso dever ter um ID nico


ADD 1 TO v_task_id.

* Chamar a RFC em uma nova sesso


CALL FUNCTION 'Z_RFC_ASSINC'
STARTING NEW TASK v_task_id
DESTINATION IN GROUP DEFAULT
PERFORMING update_order ON END OF TASK
EXPORTING
i_gjahr = wa_gjahr-low
EXCEPTIONS
OTHERS= 1.

IF sy-subrc <> 0.
* Se a RFC falhar, vamos tentar novamente e diminuir o nmero de sesses ativas. Cuidado para no entrar
* em loop infinito!!
SUBTRACT 1 FROM v_task_ativa.
ELSE.
EXIT.
ENDIF.
ELSE.
SUBTRACT 1 FROM v_task_ativa.
ENDIF.
ENDDO.
ENDLOOP.

IF sy-subrc IS INITIAL.
* Esperar at que todas as sesses sejam finalizadas. O nmero decrementado na subrtoina abaixo
* e incrementado quando a RFC chamada.
WAIT UNTIL v_task_ativa = 0.

*** Neste ponto voc poder utilizar os resultados retornados da RFC para continuar a lgica do programa

ENDIF.

**********************************************************************
* SUBROTINA*
**********************************************************************
FORM update_order USING name.

* Obter os resultados da RFC


RECEIVE RESULTS FROM FUNCTION 'Z_RFC_ASSINC'
TABLES
t_bseg = t_bseg_aux.

APPEND LINES OF t_bseg_aux TO t_bseg.

SUBTRACT 1 FROM v_task_ativa.

ENDFORM." UPDATE_ORDER

Anlise do Tempo de Execuo


nica sesso:

Utilizando Processamento em Paralelo:

http://www.abapzombie.com/dicasabap/2012/03/12/processamentoemparaleloutilizandorfcassincrona/

3/12

9/9/2016

ABAPZombieProcessamentoemParaleloutilizandoRFCAssncrona

Atravs da transao SE30, podemos analisar o tempo de execuo de cada programa. No


meu exemplo, eu consegui uma melhoria de 18% do tempo que levou para execut-lo em
uma nica sesso.
Mas ateno!!!
Antes de comear a implementar, devemos nos certicar que o processamento em
paralelo deve ser logicamente independente. Como assim? Explico: cada processo
no pode depender de outros dados que esto sendo processados paralelamente,
pois no temos como garantir que os dados sero processados em uma ordem
especca.
O programa principal no pode mudar de sesso depois de chamar a RFC
Assncrona, ou seja, voc no deve usar SUBMIT ou CALL TRANSACTION depois de
usar CALL FUNCTION STARTING NEW TASK.
No recomendado utilizar COMMIT dentro da RFC Assncrona, pois poderia
entrar em conito com a sesso em que o programa principal est sendo
executado.
isso a zombies, espero que tenham gostado, at uma prxima!

Tags: paralelismo

About the Author


Daiane Zigiotto Abapeira desde 2008, curte som underground, arte urbana,
bobeiras geek, luta krav maga, fala grias idosas e jura que uma pessoa
normal.

Related Posts

No related posts found!


32 Responses to Processamento em Paralelo utilizando RFC Assncrona

Custodio says:
March 12, 2012 at 7:50 pm

Ou eu estou bebado, ou esta faltando um monte de codigo nesse post, nao?


Reply

Miguel says:
March 12, 2012 at 9:51 pm

Hahaha!
Estava me perguntando a mesma coisa!
Quando corrigido ser um post muito til!
Reply

Daiane Zigiotto says:

http://www.abapzombie.com/dicasabap/2012/03/12/processamentoemparaleloutilizandorfcassincrona/

4/12

S-ar putea să vă placă și