Skip to content

Commit 1679441

Browse files
authored
Add sample for reader-processor
Signed-off-by: Taeik Lim <[email protected]>
1 parent 746f9e8 commit 1679441

File tree

25 files changed

+1203
-2
lines changed

25 files changed

+1203
-2
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/*
2+
* Spring Batch Plus
3+
*
4+
* Copyright 2022-present NAVER Corp.
5+
*
6+
* Licensed under the Apache License, Version 2.0 (the "License");
7+
* you may not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS,
14+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*/
18+
19+
package com.navercorp.spring.batch.plus.sample.flux.readerprocessor
20+
21+
import org.junit.jupiter.api.Test
22+
import org.springframework.batch.core.BatchStatus
23+
import org.springframework.batch.core.Job
24+
import org.springframework.batch.core.JobParametersBuilder
25+
import org.springframework.batch.core.launch.JobLauncher
26+
import org.springframework.beans.factory.getBean
27+
import org.springframework.boot.autoconfigure.SpringBootApplication
28+
import org.springframework.boot.runApplication
29+
30+
@SpringBootApplication
31+
open class SampleApplicationTest {
32+
@Test
33+
fun run() {
34+
val applicationContext = runApplication<SampleApplicationTest>()
35+
val jobLauncher = applicationContext.getBean<JobLauncher>()
36+
val job = applicationContext.getBean<Job>("testJob")
37+
38+
val jobParameters = JobParametersBuilder()
39+
.addLong("totalCount", 20L)
40+
.toJobParameters()
41+
val jobExecution = jobLauncher.run(job, jobParameters)
42+
43+
assert(BatchStatus.COMPLETED == jobExecution.status)
44+
println(jobExecution)
45+
}
46+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/*
2+
* Spring Batch Plus
3+
*
4+
* Copyright 2022-present NAVER Corp.
5+
*
6+
* Licensed under the Apache License, Version 2.0 (the "License");
7+
* you may not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS,
14+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*/
18+
19+
package com.navercorp.spring.batch.plus.sample.flux.readerprocessor
20+
21+
import com.navercorp.spring.batch.plus.step.adapter.ItemStreamFluxReaderProcessor
22+
import org.springframework.batch.core.configuration.annotation.StepScope
23+
import org.springframework.batch.item.ExecutionContext
24+
import org.springframework.beans.factory.annotation.Value
25+
import org.springframework.stereotype.Component
26+
import reactor.core.publisher.Flux
27+
28+
@Component
29+
@StepScope
30+
open class SampleTasklet(
31+
@Value("#{jobParameters['totalCount']}") private var totalCount: Long,
32+
) : ItemStreamFluxReaderProcessor<Int, String> {
33+
private var count = 0
34+
35+
override fun readFlux(executionContext: ExecutionContext): Flux<out Int> {
36+
println("totalCount: $totalCount")
37+
return Flux.generate { sink ->
38+
if (count < totalCount) {
39+
sink.next(count)
40+
++count
41+
} else {
42+
sink.complete()
43+
}
44+
}
45+
}
46+
47+
override fun process(item: Int): String? {
48+
return "'$item'"
49+
}
50+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
* Spring Batch Plus
3+
*
4+
* Copyright 2022-present NAVER Corp.
5+
*
6+
* Licensed under the Apache License, Version 2.0 (the "License");
7+
* you may not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS,
14+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*/
18+
19+
package com.navercorp.spring.batch.plus.sample.flux.readerprocessor
20+
21+
import com.navercorp.spring.batch.plus.kotlin.configuration.BatchDsl
22+
import com.navercorp.spring.batch.plus.kotlin.step.adapter.asItemProcessor
23+
import com.navercorp.spring.batch.plus.kotlin.step.adapter.asItemStreamReader
24+
import org.springframework.batch.core.Job
25+
import org.springframework.context.annotation.Bean
26+
import org.springframework.context.annotation.Configuration
27+
import org.springframework.transaction.PlatformTransactionManager
28+
29+
@Configuration
30+
open class TestJobConfig(
31+
private val batch: BatchDsl,
32+
private val transactionManager: PlatformTransactionManager,
33+
) {
34+
@Bean
35+
open fun testJob(
36+
sampleTasklet: SampleTasklet,
37+
): Job = batch {
38+
job("testJob") {
39+
step("testStep") {
40+
chunk<Int, String>(3, transactionManager) {
41+
reader(sampleTasklet.asItemStreamReader())
42+
processor(sampleTasklet.asItemProcessor())
43+
writer { chunk -> println(chunk.items) }
44+
}
45+
}
46+
}
47+
}
48+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/*
2+
* Spring Batch Plus
3+
*
4+
* Copyright 2022-present NAVER Corp.
5+
*
6+
* Licensed under the Apache License, Version 2.0 (the "License");
7+
* you may not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS,
14+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*/
18+
19+
package com.navercorp.spring.batch.plus.sample.iterable.readerprocessor
20+
21+
import org.junit.jupiter.api.Test
22+
import org.springframework.batch.core.BatchStatus
23+
import org.springframework.batch.core.Job
24+
import org.springframework.batch.core.JobParametersBuilder
25+
import org.springframework.batch.core.launch.JobLauncher
26+
import org.springframework.beans.factory.getBean
27+
import org.springframework.boot.autoconfigure.SpringBootApplication
28+
import org.springframework.boot.runApplication
29+
30+
@SpringBootApplication
31+
open class SampleApplicationTest {
32+
@Test
33+
fun run() {
34+
val applicationContext = runApplication<SampleApplicationTest>()
35+
val jobLauncher = applicationContext.getBean<JobLauncher>()
36+
val job = applicationContext.getBean<Job>("testJob")
37+
38+
val jobParameters = JobParametersBuilder()
39+
.addLong("totalCount", 20L)
40+
.toJobParameters()
41+
val jobExecution = jobLauncher.run(job, jobParameters)
42+
43+
assert(BatchStatus.COMPLETED == jobExecution.status)
44+
println(jobExecution)
45+
}
46+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/*
2+
* Spring Batch Plus
3+
*
4+
* Copyright 2022-present NAVER Corp.
5+
*
6+
* Licensed under the Apache License, Version 2.0 (the "License");
7+
* you may not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS,
14+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*/
18+
19+
package com.navercorp.spring.batch.plus.sample.iterable.readerprocessor
20+
21+
import com.navercorp.spring.batch.plus.step.adapter.ItemStreamIterableReaderProcessor
22+
import org.springframework.batch.core.configuration.annotation.StepScope
23+
import org.springframework.batch.item.ExecutionContext
24+
import org.springframework.beans.factory.annotation.Value
25+
import org.springframework.stereotype.Component
26+
27+
@Component
28+
@StepScope
29+
open class SampleTasklet(
30+
@Value("#{jobParameters['totalCount']}") private var totalCount: Long,
31+
) : ItemStreamIterableReaderProcessor<Int, String> {
32+
private var count = 0
33+
34+
override fun readIterable(executionContext: ExecutionContext): Iterable<Int> {
35+
println("totalCount: $totalCount")
36+
return Iterable {
37+
object : Iterator<Int> {
38+
override fun hasNext(): Boolean {
39+
return count < totalCount
40+
}
41+
42+
override fun next(): Int {
43+
return count++
44+
}
45+
}
46+
}
47+
}
48+
49+
override fun process(item: Int): String? {
50+
return "'$item'"
51+
}
52+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
* Spring Batch Plus
3+
*
4+
* Copyright 2022-present NAVER Corp.
5+
*
6+
* Licensed under the Apache License, Version 2.0 (the "License");
7+
* you may not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS,
14+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*/
18+
19+
package com.navercorp.spring.batch.plus.sample.iterable.readerprocessor
20+
21+
import com.navercorp.spring.batch.plus.kotlin.configuration.BatchDsl
22+
import com.navercorp.spring.batch.plus.kotlin.step.adapter.asItemProcessor
23+
import com.navercorp.spring.batch.plus.kotlin.step.adapter.asItemStreamReader
24+
import org.springframework.batch.core.Job
25+
import org.springframework.context.annotation.Bean
26+
import org.springframework.context.annotation.Configuration
27+
import org.springframework.transaction.PlatformTransactionManager
28+
29+
@Configuration
30+
open class TestJobConfig(
31+
private val batch: BatchDsl,
32+
private val transactionManager: PlatformTransactionManager,
33+
) {
34+
@Bean
35+
open fun testJob(
36+
sampleTasklet: SampleTasklet,
37+
): Job = batch {
38+
job("testJob") {
39+
step("testStep") {
40+
chunk<Int, String>(3, transactionManager) {
41+
reader(sampleTasklet.asItemStreamReader())
42+
processor(sampleTasklet.asItemProcessor())
43+
writer { chunk -> println(chunk.items) }
44+
}
45+
}
46+
}
47+
}
48+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/*
2+
* Spring Batch Plus
3+
*
4+
* Copyright 2022-present NAVER Corp.
5+
*
6+
* Licensed under the Apache License, Version 2.0 (the "License");
7+
* you may not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS,
14+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*/
18+
19+
package com.navercorp.spring.batch.plus.sample.iterator.readerprocessor
20+
21+
import org.junit.jupiter.api.Test
22+
import org.springframework.batch.core.BatchStatus
23+
import org.springframework.batch.core.Job
24+
import org.springframework.batch.core.JobParametersBuilder
25+
import org.springframework.batch.core.launch.JobLauncher
26+
import org.springframework.beans.factory.getBean
27+
import org.springframework.boot.autoconfigure.SpringBootApplication
28+
import org.springframework.boot.runApplication
29+
30+
@SpringBootApplication
31+
open class SampleApplicationTest {
32+
@Test
33+
fun run() {
34+
val applicationContext = runApplication<SampleApplicationTest>()
35+
val jobLauncher = applicationContext.getBean<JobLauncher>()
36+
val job = applicationContext.getBean<Job>("testJob")
37+
38+
val jobParameters = JobParametersBuilder()
39+
.addLong("totalCount", 20L)
40+
.toJobParameters()
41+
val jobExecution = jobLauncher.run(job, jobParameters)
42+
43+
assert(BatchStatus.COMPLETED == jobExecution.status)
44+
println(jobExecution)
45+
}
46+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/*
2+
* Spring Batch Plus
3+
*
4+
* Copyright 2022-present NAVER Corp.
5+
*
6+
* Licensed under the Apache License, Version 2.0 (the "License");
7+
* you may not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS,
14+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*/
18+
19+
package com.navercorp.spring.batch.plus.sample.iterator.readerprocessor
20+
21+
import com.navercorp.spring.batch.plus.step.adapter.ItemStreamIteratorReaderProcessor
22+
import org.springframework.batch.core.configuration.annotation.StepScope
23+
import org.springframework.batch.item.ExecutionContext
24+
import org.springframework.beans.factory.annotation.Value
25+
import org.springframework.stereotype.Component
26+
27+
@Component
28+
@StepScope
29+
open class SampleTasklet(
30+
@Value("#{jobParameters['totalCount']}") private var totalCount: Long,
31+
) : ItemStreamIteratorReaderProcessor<Int, String> {
32+
private var count = 0
33+
34+
override fun readIterator(executionContext: ExecutionContext): Iterator<Int> {
35+
println("totalCount: $totalCount")
36+
return object : Iterator<Int> {
37+
override fun hasNext(): Boolean {
38+
return count < totalCount
39+
}
40+
41+
override fun next(): Int {
42+
return count++
43+
}
44+
}
45+
}
46+
47+
override fun process(item: Int): String? {
48+
return "'$item'"
49+
}
50+
}

0 commit comments

Comments
 (0)