Edit:
After some feedback and some time to work on this I've improved the examples and introduced the Thread Pool Executor concept.
Motivação
De tempos em tempos, nos deparamos com a necessidade de realizar algum trabalho em paralelo. Recentemente, trabalhei em um processo que estava demorando muito para ser útil. Estava lidando com grandes quantidades de dados e criando uma quantidade ainda maior de registros seguindo regras complexas, validações e enriquecimento.
Ao revisitar algumas técnicas de paralelismo em ABAP, minhas opções basicamente eram dividir os dados de entrada e então executar FMs
em segundo plano,
iniciar uma nova tarefa
ou
escrever um relatório e programar um trabalho
com o paralelismo sendo intervalos de um critério de seleção.
Todas são opções válidas, suponho, mas me acostumei a trabalhar puramente em OO e usar FMs aqui e ali para ter meu paralelismo tinha um odor particularmente
ruim.
Isso me impediria de afirmar qualquer comportamento crítico através de testes unitários, para começar, e também adicionaria essa nova responsabilidade, rodar em paralelo, a lugares estranhos com código que parecia chato e repetitivo (pegar dados de classes, executar fm, retornar dados
).
Então decidi encontrar uma abordagem de OO para o paralelismo em ABAP e me inspirei no Thread de Java. Fiquei particularmente atraído pelo Thread de Java devido à sua simples
interface Runnable,
que permite aos desenvolvedores envolver rapidamente o que precisa ser feito em paralelo em um único método. Eu poderia usá-lo simplesmente para chamar os métodos existentes que eu já tinha. Abaixo está um exemplo de como ficaria em Java.
public class MyRunnable implements Runnable {
public void run(){
myOtherClassMethodThatDoesStuff( )
}
}
Runnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();
zthread
Provavelmente há centenas de implementações semelhantes a esta por aí. Espero que esta possa ser útil para alguns de vocês. Meu conceito é exatamente o mesmo que no Java, tendo a interface Runnable e o Thread como ponto de partida. Como estou acostumado (e gosto) da ideia de callback do JavaScript, a inseri na mistura. Isso tornou parte do código que eu precisava escrever e testar mais fácil. Parece algo assim:
Há uma fábrica de threads e algumas implementações padrão também, que eu deixei de fora do diagrama, para ajudar a testar unidades de classes que usam Threads.
Uso
Você pode consultar o git para obter a documentação mais atualizada. Estou colocando alguns exemplos aqui para mostrar como usá-lo de forma geral.
Os exemplos abaixo são baseados em exemplos anteriores. Portanto, zc_my_runnable nem sempre está declarado e sua implementação é a mesma que da última vez definida.
Forma bruta
Simplesmente implemente sua interface runnable, passe-a para um Thread e inicie-o. A desvantagem de