Edit:
After some feedback and some time to work on this I've improved the examples and introduced the Thread Pool Executor concept.
Motivación
Cada cierto tiempo nos encontramos con la necesidad de realizar algún trabajo en paralelo. Recientemente trabajé en un proceso que estaba tardando demasiado en ser útil. Estaba tomando grandes cantidades de datos y creando una cantidad aún mayor de registros siguiendo reglas complejas, validaciones y enriquecimiento.
Al refrescar algunas técnicas de paralelismo en ABAP, mis opciones básicamente eran dividir los datos de entrada y luego ejecutar FMs
en segundo plano,
iniciar una nueva tarea
o
escribir un informe y programar un trabajo
con el paralelismo siendo rangos de un criterio de selección.
Todas son opciones válidas, supongo, pero me acostumbré a trabajar puramente en OO y usar FMs aquí y allá para tener mi paralelismo tenía un olor particularmente
malo.
Esto me impediría afirmar algún comportamiento crítico a través de pruebas unitarias, para empezar, y también agregaría esta nueva responsabilidad, correr en paralelo, a lugares extraños con código que se veía aburrido y repetitivo (tomar datos de clases, ejecutar fm, devolver datos…).
Así que decidí encontrar un enfoque de OO para el paralelismo en ABAP, y tomé como inspiración el Thread de Java. Me sentí particularmente atraído por el Thread de Java dado su simple
interfaz Runnable,
que permite a los desarrolladores envolver rápidamente lo que debe hacerse en paralelo en un solo método. Podría usarlo simplemente para llamar a los métodos existentes que ya tenía. A continuación se muestra un ejemplo de cómo se vería en Java.
public class MyRunnable implements Runnable {
public void run(){
myOtherClassMethodThatDoesStuff( )
}
}
Runnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();
zthread
Probablemente hay cientos de implementaciones similares a esta por ahí. Espero que esta pueda ser útil para algunos de ustedes. Mi concepto es exactamente el mismo que en Java, teniendo la interfaz Runnable y el Thread como punto de partida. Como estoy acostumbrado (y me gusta) la idea de devolución de llamada detrás de Javascript, la he lanzado al mix. Hizo que parte del código que necesitaba escribir y probar fuera más fácil. Se ve algo así:
Hay una interfaz de fábrica de threads y algunas implementaciones predeterminadas también, que he descartado del diagrama, para ayudar a probar unidades de clases que usan Threads.
Uso
Puedes consultar git para obtener la documentación más actualizada. Estoy poniendo algunos ejemplos aquí para mostrar cómo usarlo en general.
Los ejemplos a continuación se basan en ejemplos anteriores. Por lo tanto, zc_my_runnable no siempre está declarado y su implementación es la misma que la última vez definida.
Forma cruda
Simplemente implementa tu interfaz runnable, dásela a un Thread y arráncalo. La desventaja de