Skip to content

Commit d5d225b

Browse files
Neetika23Neetika Khandelwal
andauthored
BAEL-9323 (#18723)
* BAEL-9323 * BAEL-9323 * BAEL-9323 * BAEL-9323 * BAEL-9323 * spy changes * pom version change * pom version change --------- Co-authored-by: Neetika Khandelwal <[email protected]>
1 parent 43d4140 commit d5d225b

File tree

7 files changed

+168
-0
lines changed

7 files changed

+168
-0
lines changed

spring-batch-2/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,11 @@
104104
</exclusion>
105105
</exclusions>
106106
</dependency>
107+
<dependency>
108+
<groupId>com.graphql-java</groupId>
109+
<artifactId>java-dataloader</artifactId>
110+
<version>${java-dataloader.version}</version>
111+
</dependency>
107112
</dependencies>
108113

109114
<build>
@@ -123,6 +128,7 @@
123128
<spring.batch.version>5.2.0</spring.batch.version>
124129
<awaitility.version>4.2.1</awaitility.version>
125130
<assertj.version>3.24.2</assertj.version>
131+
<java-dataloader.version>3.2.0</java-dataloader.version>
126132
<start-class>com.baeldung.batch.SpringBootBatchProcessingApplication</start-class>
127133
</properties>
128134

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.baeldung.dataloaderbatchprocessing;
2+
3+
import org.springframework.boot.SpringApplication;
4+
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
6+
@SpringBootApplication
7+
public class DataLoaderApp {
8+
9+
public static void main(String[] args) {
10+
SpringApplication.run(DataLoaderApp.class, args);
11+
}
12+
}
13+
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.baeldung.dataloaderbatchprocessing;
2+
3+
import org.dataloader.BatchLoader;
4+
import org.dataloader.DataLoader;
5+
import org.dataloader.DataLoaderFactory;
6+
import org.springframework.stereotype.Component;
7+
8+
import java.util.Map;
9+
import java.util.stream.Collectors;
10+
11+
import com.baeldung.dataloaderbatchprocessing.entity.User;
12+
import com.baeldung.dataloaderbatchprocessing.service.UserService;
13+
14+
@Component
15+
public class UserDataLoader {
16+
17+
private final UserService userService;
18+
19+
public UserDataLoader(UserService userService) {
20+
this.userService = userService;
21+
}
22+
23+
public DataLoader<String, User> createUserLoader() {
24+
BatchLoader<String, User> userBatchLoader = ids -> {
25+
return userService.getUsersByIds(ids)
26+
.thenApply(users -> {
27+
Map<String, User> userMap = users.stream()
28+
.collect(Collectors.toMap(User::getId, user -> user));
29+
return ids.stream()
30+
.map(userMap::get)
31+
.collect(Collectors.toList());
32+
});
33+
};
34+
35+
return DataLoaderFactory.newDataLoader(userBatchLoader);
36+
}
37+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.baeldung.dataloaderbatchprocessing.entity;
2+
3+
import jakarta.persistence.Entity;
4+
import jakarta.persistence.Id;
5+
import jakarta.persistence.Table;
6+
import lombok.AllArgsConstructor;
7+
import lombok.Getter;
8+
import lombok.NoArgsConstructor;
9+
10+
@Entity
11+
@Table(name = "users")
12+
@Getter
13+
@AllArgsConstructor
14+
@NoArgsConstructor
15+
public class User {
16+
17+
@Id
18+
private String id;
19+
private String name;
20+
}
21+
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.baeldung.dataloaderbatchprocessing.repository;
2+
3+
import org.springframework.data.jpa.repository.JpaRepository;
4+
5+
import com.baeldung.dataloaderbatchprocessing.entity.User;
6+
7+
public interface UserRepository extends JpaRepository<User, String> {
8+
}
9+
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.baeldung.dataloaderbatchprocessing.service;
2+
import org.springframework.stereotype.Service;
3+
4+
import java.util.List;
5+
import java.util.concurrent.CompletableFuture;
6+
7+
import com.baeldung.dataloaderbatchprocessing.entity.User;
8+
import com.baeldung.dataloaderbatchprocessing.repository.UserRepository;
9+
10+
@Service
11+
public class UserService {
12+
private final UserRepository userRepository;
13+
14+
public UserService(UserRepository userRepository) {
15+
this.userRepository = userRepository;
16+
}
17+
18+
public CompletableFuture<List<User>> getUsersByIds(List<String> ids) {
19+
return CompletableFuture.supplyAsync(() -> userRepository.findAllById(ids));
20+
}
21+
}
22+
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package com.baeldung.dataloaderbatchprocessing;
2+
3+
import com.baeldung.dataloaderbatchprocessing.entity.User;
4+
import com.baeldung.dataloaderbatchprocessing.repository.UserRepository;
5+
import com.baeldung.dataloaderbatchprocessing.service.UserService;
6+
import org.dataloader.DataLoader;
7+
import org.dataloader.DataLoaderRegistry;
8+
import org.junit.jupiter.api.BeforeEach;
9+
import org.junit.jupiter.api.Test;
10+
import org.springframework.beans.factory.annotation.Autowired;
11+
import org.springframework.boot.test.context.SpringBootTest;
12+
import org.springframework.boot.test.mock.mockito.SpyBean;
13+
14+
import java.util.Arrays;
15+
import java.util.concurrent.CompletableFuture;
16+
17+
import static org.assertj.core.api.Assertions.assertThat;
18+
import static org.mockito.Mockito.*;
19+
20+
@SpringBootTest(classes = DataLoaderApp.class)
21+
class UserDataLoaderIntegrationTest {
22+
23+
@Autowired
24+
private UserRepository userRepository;
25+
26+
@SpyBean
27+
private UserService userService;
28+
29+
private DataLoader<String, User> userDataLoader;
30+
31+
@BeforeEach
32+
void setUp() {
33+
userRepository.deleteAll();
34+
35+
User user1 = new User("101", "User_101");
36+
User user2 = new User("102", "User_102");
37+
User user3 = new User("103", "User_103");
38+
userRepository.saveAll(Arrays.asList(user1, user2, user3));
39+
40+
userDataLoader = new DataLoader<>(userService::getUsersByIds);
41+
DataLoaderRegistry registry = new DataLoaderRegistry();
42+
registry.register("userDataLoader", userDataLoader);
43+
}
44+
45+
@Test
46+
void whenLoadingUsers_thenBatchLoaderIsInvokedAndResultsReturned() {
47+
CompletableFuture<User> userFuture1 = userDataLoader.load("101");
48+
CompletableFuture<User> userFuture2 = userDataLoader.load("102");
49+
CompletableFuture<User> userFuture3 = userDataLoader.load("103");
50+
51+
userDataLoader.dispatchAndJoin();
52+
53+
verify(userService, times(1)).getUsersByIds(anyList());
54+
55+
assertThat(userFuture1.join().getName()).isEqualTo("User_101");
56+
assertThat(userFuture2.join().getName()).isEqualTo("User_102");
57+
assertThat(userFuture3.join().getName()).isEqualTo("User_103");
58+
}
59+
}
60+

0 commit comments

Comments
 (0)