FND_CONCURRENT.WAIT_FOR_REQUEST: dúvida

Perguntas relacionadas a questões técnicas do Oracle EBS. Criação de Concorrentes, Value Sets, Alerts, Forms Personalizations, Configurações, etc
Responder
Avatar do usuário
Porva
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 342
Registrado em: Seg, 29 Jan 2007 7:36 am
Localização: São Paulo/SP
Rafael S. Nunes
São Paulo/SP

Galera, beleza?

fiz um processo que dispara um determinado concurrent várias vezes (dentro de um loop), fiz uma lógica pra fazer uma espécie de paralelismo e quebrar um processamento em várias partes para melhoria de performance, até aí tudo bem, funcionou e tal

mas preciso fazer outra validação após a execução desses concurrents que são chamados dentro do loop, e preciso saber se todos os que foram chamados terminaram com sucesso, pra só daí então continuar

me passaram o exemplo da api/function core FND_CONCURRENT.WAIT_FOR_REQUEST, mas não consegui entender bem o funcionamento dela, podem me dar umas dicas?

fiz assim:

Armazeno os request_ids no type l_tRequests dentro do loop que dispara os concurrents quantas vezes forem necessárias (controlo isso de acordo com a qtde de registros a serem processados)

com o type carregado com os resquest_ids dos concurrents que estão sendo executados no momento eu faço:

Selecionar tudo

FOR l_nInd IN l_tRequests.FIRST..l_tRequests.LAST LOOP
  --
  l_bCall_Status := 
    FND_CONCURRENT.WAIT_FOR_REQUEST ( request_id      => l_tRequests(l_nInd).request_id
				     ,interval        => 1             -- IN
				     ,max_wait        => 0             -- IN
				     ,phase           => l_vPhase      -- OUT
				     ,status          => l_vStatus     -- OUT
				     ,dev_phase       => l_vDev_phase  -- OUT
				     ,dev_status      => l_vDev_status -- OUT
				     ,message         => l_vMessage    -- OUT
				    );                                                            
END LOOP;
dúvidas:

como funcionam os parâmetros de entrada e saída, como utilizá-los?

como eu faço pra testar se todos os concurrents terminaram o processamento???

o retorno da WAIT_FOR_REQUEST é TRUE somente quando o concurrent termina com sucesso?

para cara chamada da WAIT_FOR_REQUEST ela fica em "espera" até que o concurrent termine?
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Também fiquei interessado nisto. Também já tiver de chamar concurrents e precisar fazer algo somente após sua conclusão mas nunca soube de algo que faça isso.
paulochagas
Moderador
Moderador
Mensagens: 86
Registrado em: Qua, 15 Mar 2006 2:46 pm
Localização: São Paulo - SP
Paulo Chagas Filho
__________________

Analista Funcional / Desenvolvedor Oracle EBS
MSN - paulochagas@hotmail.com
Gtalk - pachafi@gmail.com
Skype - paulochagas

Olá amigos

Eu já utilizei umas duas vezes essa API aqui na empresa e a sintaxe é essa mesmo e funcionou sem problemas, com a diferença de usar apenas para um concurrent program ao invés de vários

Segue o pedaço de codigo do ultimo meu programa:

Selecionar tudo

           L_Dummy := apps.Fnd_Concurrent.Wait_For_Request(Request_Id => l_request_num
                                                         , Interval   => 60         
                                                         , Max_Wait   => 0         
                                                         , Phase      => L_Phase          
                                                         , Status     => L_Status         
                                                         , Dev_Phase  => L_Dev_Phase         
                                                         , Dev_Status => L_Dev_Status         
                                                         , Message    => L_Message);           
           -- If Request Completed Successfully        
           If L_Dev_Phase = 'COMPLETE' And L_Dev_Status = 'NORMAL' Then         
              --
              fnd_file.put_line (fnd_file.LOG,'The Request Supplier Sites Open Interface Import - Request ID --> '||TO_CHAR(l_request_num)||', was proceeded with sucess!!');
Segue uma pagina que detalha o uso dessa API:
http://www.notesbit.com/index.php/oracl ... mple-code/

Abraços

When submitting concurrent requests using PL/SQL, it is often desired to have the parent process wait until all the child processes have completed before completing itself. The following describes the function used to accomplish this.

Refer Metalink 1021956.6: The following describes how to submit concurrent requests using PL/SQL and have the parent request ‘wait’ until each of the child processes have completed before it completes.

Use the FND_CONCURRENT.WAIT_FOR_REQUEST function documented in the Oracle Applications Developer’s Guide, RELEASE 11i, Page 21-8 See the FND_CONCURRENT.WAIT_FOR_REQUEST function description.

Selecionar tudo

Summary 
         FUNCTION FND_CONCURRENT.WAIT_FOR_REQUEST 
 
  (request_id IN number DEFAULT NULL, 
          interval   IN number DEFAULT 60, 
          max_wait   IN number DEFAULT 0, 
          phase      OUT varchar2, 
          STATUS     OUT varchar2, 
          dev_phase  OUT varchar2, 
          dev_status OUT varchar2, 
          message    OUT varchar2) RETURN  BOOLEAN;
Description
Wait for the request completion, then return the request phase/status and
completion message to the caller. Also call sleep between database checks.

Arguments (input)

request_id
The request ID of the program to wait on.

interval
Time to wait between checks. This is the number of seconds to sleep.
The default is 60 seconds.

max_wait
The maximum time in seconds to wait for the requests completion.

Arguments (output)

phase
The user friendly request phase from FND_LOOKUPS.

status
The user friendly request status from FND_LOOKUPS.

dev_phase
The request phase as a constant string that can be used for program
logic comparisons.

dev_status
The request status as a constant string that can be used for program
logic comparisons.

message
The completion message supplied if the request has completed.

Selecionar tudo

BEGIN
         l_request_id :=
            fnd_request.submit_request (‘XXCUS’,
                                        ‘XXCUSSPOOL’,      
                                        NULL,
                                        NULL,
                                        FALSE,
                                        p_filename_i,
                                        p_seq_i
                                       );
      END;
      p_request_id_o := l_request_id;

      fnd_file.put_line (fnd_file.LOG,‘XXCUSSPOOL Submitted. Request_id=’”p_request_id_o”‘ Filename=’”p_filename_i”‘ Seq=’”p_seq_i  );

      IF p_request_id_o = 0
      THEN
         ec_log_debug (p_filename_i,‘SUBMIT_FILE_CREATION’,4090, ‘XXCUSSPOOL submission failed for ‘”p_filename_i”‘Request_id=’”p_request_id_o );
      ELSE
         l_return :=
            fnd_concurrent.wait_for_request (request_id      => p_request_id_o,
                                             INTERVAL        => 10,
                                             max_wait        => 300, – Null means wait forever, I normally provide 300 = 5 mins
                                             phase           => l_phase,
                                             STATUS          => l_status,
                                             dev_phase       => l_dev_phase,
                                             dev_status      => l_dev_status,
                                             MESSAGE         => l_message
                                            );
      END IF;
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 7 visitantes