Java - Concurrencia con Spring Batch

 
Vista:

Concurrencia con Spring Batch

Publicado por Pablo (1 intervención) el 09/04/2021 09:31:48
Buenas!

Estoy montando un proyecto en java con spring batch.
Tengo un trabajo con un reader, un processor y un writer. La idea es recibir un fichero de entrada, dividirlo antes de hacer nada por ejemplo en 2 partes, y luego lanzar en paralelo el proceso para que tarde menos.

Tengo esto:

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
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
@Bean
// @formatter:off
public Job job() {
    return jobBuilderFactory.get("job")
        .start(splitFlow())
        .build()        //builds FlowJobBuilder instance
        .build();       //builds Job instance
}
 
 
 
@Bean
public Flow splitFlow() {
    return new FlowBuilder<SimpleFlow>("splitFlow")
        .split(taskExecutor())
        .add(flow1(), flow2())
        .build();
}
 
@Bean
public Flow flow1() {
    return new FlowBuilder<SimpleFlow>("flow1")
        .start(stepLine1())
        .build();
}
 
@Bean
public Flow flow2() {
    return new FlowBuilder<SimpleFlow>("flow2")
        .start(stepLine2())
        .build();
}
 
@Bean
public Flow flow3() {
    return new FlowBuilder<SimpleFlow>("flow3")
        .start(stepLine3())
        .build();
}
 
@Bean
public Flow flow4() {
    return new FlowBuilder<SimpleFlow>("flow4")
        .start(stepLine4())
        .build();
}
 
@Bean
public TaskExecutor taskExecutor() {
    return new SimpleAsyncTaskExecutor("spring_batch");
}
 
@Bean
// @formatter:off
public Step stepLine1() {
return stepBuilderFactory.get("stepLine1").listener(new GenericListener())
                        .<LineFile, NormalizedLine>chunk(100)
                            .reader(readerLineFile1())
                            .processor(processorLineFile1())
                            .writer(writerLineFile1())
                            .build();
}
 
    @Bean
// @formatter:off
public Step stepLine2() {
return stepBuilderFactory.get("stepLine1").listener(new GenericListener())
                        .<LineFile, NormalizedLine>chunk(100)
                            .reader(readerLineFile1())
                            .processor(processorLineFile1())
                            .writer(writerLineFile1())
                            .build();
}




Y la historia que aparentemente funciona bien, porque lo hace por separado cada procesamiento. Pero el proceso me tarda lo mismo haciendolo secuencial que lanzandolo con 2 procesos en paralelo, lo cual no le veo ningún sentido.

¿Se os ocurre por qué puede ser?

Muchas Gracias, un saludo!!!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Concurrencia con Spring Batch

Publicado por Tom (1698 intervenciones) el 09/04/2021 12:01:27
Pues ... en mi opinión depende de lo que hagas en el processor.
Teniendo en cuenta que la entrada (lectura del fichero) es secuencial por muchos hilos que pongas, y la salida (escritura en un fichero) también es secuencial ... creo que, con los datos que das, solamente notarías mejoras con el multihilo si processor consume bastante tiempo (y, quizás, si cada hilo leyera de su propio fichero y escribiese en su propio fichero también).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar