diff --git a/2022-08/spring-31/spring-31-exercise/pom.xml b/2022-08/spring-31/spring-31-exercise/pom.xml
index 7c252869..f61dbede 100644
--- a/2022-08/spring-31/spring-31-exercise/pom.xml
+++ b/2022-08/spring-31/spring-31-exercise/pom.xml
@@ -11,7 +11,8 @@
org.springframework.boot
spring-boot-starter-parent
- 2.3.3.RELEASE
+ 2.7.8
+
@@ -19,10 +20,6 @@
org.springframework.boot
spring-boot-starter-integration
-
- org.springframework
- spring-messaging
-
org.apache.commons
commons-lang3
diff --git a/2022-08/spring-31/spring-31-exercise/src/main/java/ru/otus/spring/integration/App.java b/2022-08/spring-31/spring-31-exercise/src/main/java/ru/otus/spring/integration/App.java
index 15edfe62..14058f97 100644
--- a/2022-08/spring-31/spring-31-exercise/src/main/java/ru/otus/spring/integration/App.java
+++ b/2022-08/spring-31/spring-31-exercise/src/main/java/ru/otus/spring/integration/App.java
@@ -1,70 +1,16 @@
package ru.otus.spring.integration;
-import org.apache.commons.lang3.RandomUtils;
-import org.springframework.context.annotation.AnnotationConfigApplicationContext;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.support.AbstractApplicationContext;
-import org.springframework.integration.annotation.IntegrationComponentScan;
-
-import org.springframework.integration.channel.PublishSubscribeChannel;
-import org.springframework.integration.channel.QueueChannel;
-import org.springframework.integration.config.EnableIntegration;
-import org.springframework.integration.dsl.IntegrationFlow;
-import org.springframework.integration.dsl.IntegrationFlows;
-
-import org.springframework.integration.dsl.MessageChannels;
-import ru.otus.spring.integration.domain.Food;
-import ru.otus.spring.integration.domain.OrderItem;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.ConfigurableApplicationContext;
+import ru.otus.spring.integration.services.OrderService;
-@IntegrationComponentScan
-@SuppressWarnings({"resource", "Duplicates", "InfiniteLoopStatement"})
-@ComponentScan
-@Configuration
-@EnableIntegration
+@SpringBootApplication
public class App {
- private static final String[] MENU = {"coffee", "tea", "smoothie", "whiskey", "beer", "cola", "water"};
-
- @Bean
- public QueueChannel itemsChannel() {
- return MessageChannels.queue(10).get();
- }
-
- @Bean
- public PublishSubscribeChannel foodChannel() {
- return MessageChannels.publishSubscribe().get();
- }
-
- // TODO: create default poller
-
- @Bean
- public IntegrationFlow cafeFlow() {
- return IntegrationFlows.from("itemsChannel")
- // TODO: cook OrderItem in the kitchen
- // TODO*: add splitter and aggregator
- // TODO: forward it to the publish subscriber channel
- .get();
- }
-
- public static void main(String[] args) throws Exception {
- AbstractApplicationContext ctx = new AnnotationConfigApplicationContext(App.class);
-
- // here we works with cafe using interface
- Cafe cafe = ctx.getBean(Cafe.class);
-
- while (true) {
- Thread.sleep(1000);
-
- OrderItem orderItem = generateOrderItem();
- System.out.println("New orderItem: " + orderItem.getItemName());
- Food food = cafe.process(orderItem);
- System.out.println("Ready food: " + food.getName());
- }
- }
-
- private static OrderItem generateOrderItem() {
- return new OrderItem(MENU[RandomUtils.nextInt(0, MENU.length)]);
+ public static void main(String[] args) {
+ ConfigurableApplicationContext ctx = SpringApplication.run(App.class, args);
+ OrderService orderService = ctx.getBean(OrderService.class);
+ orderService.startGenerateOrdersLoop();
}
}
diff --git a/2022-08/spring-31/spring-31-exercise/src/main/java/ru/otus/spring/integration/config/IntegrationConfig.java b/2022-08/spring-31/spring-31-exercise/src/main/java/ru/otus/spring/integration/config/IntegrationConfig.java
new file mode 100644
index 00000000..9021a611
--- /dev/null
+++ b/2022-08/spring-31/spring-31-exercise/src/main/java/ru/otus/spring/integration/config/IntegrationConfig.java
@@ -0,0 +1,33 @@
+package ru.otus.spring.integration.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.integration.channel.PublishSubscribeChannel;
+import org.springframework.integration.channel.QueueChannel;
+import org.springframework.integration.dsl.IntegrationFlow;
+import org.springframework.integration.dsl.IntegrationFlows;
+import org.springframework.integration.dsl.MessageChannels;
+
+@Configuration
+public class IntegrationConfig {
+ @Bean
+ public QueueChannel itemsChannel() {
+ return MessageChannels.queue(10).get();
+ }
+
+ @Bean
+ public PublishSubscribeChannel foodChannel() {
+ return MessageChannels.publishSubscribe().get();
+ }
+
+ // TODO: create default poller
+
+ @Bean
+ public IntegrationFlow cafeFlow() {
+ return IntegrationFlows.from("itemsChannel")
+ // TODO: cook OrderItem in the kitchen
+ // TODO*: add splitter and aggregator
+ // TODO: forward it to the publish subscriber channel
+ .get();
+ }
+}
diff --git a/2022-08/spring-31/spring-31-exercise/src/main/java/ru/otus/spring/integration/kitchen/KitchenService.java b/2022-08/spring-31/spring-31-exercise/src/main/java/ru/otus/spring/integration/kitchen/KitchenService.java
deleted file mode 100644
index 8e40715f..00000000
--- a/2022-08/spring-31/spring-31-exercise/src/main/java/ru/otus/spring/integration/kitchen/KitchenService.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package ru.otus.spring.integration.kitchen;
-
-import org.springframework.stereotype.Service;
-import ru.otus.spring.integration.domain.Food;
-import ru.otus.spring.integration.domain.OrderItem;
-
-@Service
-public class KitchenService {
-
- public Food cook(OrderItem orderItem) throws Exception {
- System.out.println("Cooking " + orderItem.getItemName());
- Thread.sleep(3000);
- System.out.println("Cooking " + orderItem.getItemName() + " done");
- return new Food(orderItem.getItemName());
- }
-}
diff --git a/2022-08/spring-31/spring-31-exercise/src/main/java/ru/otus/spring/integration/Cafe.java b/2022-08/spring-31/spring-31-exercise/src/main/java/ru/otus/spring/integration/services/CafeGateway.java
similarity index 76%
rename from 2022-08/spring-31/spring-31-exercise/src/main/java/ru/otus/spring/integration/Cafe.java
rename to 2022-08/spring-31/spring-31-exercise/src/main/java/ru/otus/spring/integration/services/CafeGateway.java
index 0114f741..58c24077 100644
--- a/2022-08/spring-31/spring-31-exercise/src/main/java/ru/otus/spring/integration/Cafe.java
+++ b/2022-08/spring-31/spring-31-exercise/src/main/java/ru/otus/spring/integration/services/CafeGateway.java
@@ -1,11 +1,11 @@
-package ru.otus.spring.integration;
+package ru.otus.spring.integration.services;
import ru.otus.spring.integration.domain.Food;
import ru.otus.spring.integration.domain.OrderItem;
// TODO: add messaging gateway annotation
-public interface Cafe {
+public interface CafeGateway {
// TODO: add gateway annotation with required channels
Food process(OrderItem orderItem);
diff --git a/2022-08/spring-31/spring-31-exercise/src/main/java/ru/otus/spring/integration/services/KitchenService.java b/2022-08/spring-31/spring-31-exercise/src/main/java/ru/otus/spring/integration/services/KitchenService.java
new file mode 100644
index 00000000..2ae92af2
--- /dev/null
+++ b/2022-08/spring-31/spring-31-exercise/src/main/java/ru/otus/spring/integration/services/KitchenService.java
@@ -0,0 +1,9 @@
+package ru.otus.spring.integration.services;
+
+import ru.otus.spring.integration.domain.Food;
+import ru.otus.spring.integration.domain.OrderItem;
+
+public interface KitchenService {
+
+ Food cook(OrderItem orderItem);
+}
diff --git a/2022-08/spring-31/spring-31-exercise/src/main/java/ru/otus/spring/integration/kitchen/KitchenServiceImpl.java b/2022-08/spring-31/spring-31-exercise/src/main/java/ru/otus/spring/integration/services/KitchenServiceImpl.java
similarity index 51%
rename from 2022-08/spring-31/spring-31-exercise/src/main/java/ru/otus/spring/integration/kitchen/KitchenServiceImpl.java
rename to 2022-08/spring-31/spring-31-exercise/src/main/java/ru/otus/spring/integration/services/KitchenServiceImpl.java
index a1e36f1a..8a01a914 100644
--- a/2022-08/spring-31/spring-31-exercise/src/main/java/ru/otus/spring/integration/kitchen/KitchenServiceImpl.java
+++ b/2022-08/spring-31/spring-31-exercise/src/main/java/ru/otus/spring/integration/services/KitchenServiceImpl.java
@@ -1,17 +1,25 @@
-package ru.otus.spring.integration.kitchen;
+package ru.otus.spring.integration.services;
import org.springframework.stereotype.Service;
import ru.otus.spring.integration.domain.Food;
import ru.otus.spring.integration.domain.OrderItem;
@Service
-public class KitchenServiceImpl implements KitchenService{
+public class KitchenServiceImpl implements KitchenService {
@Override
- public Food cook(OrderItem orderItem) throws Exception {
+ public Food cook(OrderItem orderItem) {
System.out.println("Cooking " + orderItem.getItemName());
- Thread.sleep(3000);
+ delay();
System.out.println("Cooking " + orderItem.getItemName() + " done");
return new Food(orderItem.getItemName());
}
+
+ private static void delay() {
+ try {
+ Thread.sleep(3000);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
}
diff --git a/2022-08/spring-31/spring-31-exercise/src/main/java/ru/otus/spring/integration/services/OrderService.java b/2022-08/spring-31/spring-31-exercise/src/main/java/ru/otus/spring/integration/services/OrderService.java
new file mode 100644
index 00000000..e50dc07d
--- /dev/null
+++ b/2022-08/spring-31/spring-31-exercise/src/main/java/ru/otus/spring/integration/services/OrderService.java
@@ -0,0 +1,5 @@
+package ru.otus.spring.integration.services;
+
+public interface OrderService {
+ void startGenerateOrdersLoop();
+}
diff --git a/2022-08/spring-31/spring-31-exercise/src/main/java/ru/otus/spring/integration/services/OrderServiceImpl.java b/2022-08/spring-31/spring-31-exercise/src/main/java/ru/otus/spring/integration/services/OrderServiceImpl.java
new file mode 100644
index 00000000..f5a4e400
--- /dev/null
+++ b/2022-08/spring-31/spring-31-exercise/src/main/java/ru/otus/spring/integration/services/OrderServiceImpl.java
@@ -0,0 +1,40 @@
+package ru.otus.spring.integration.services;
+
+import org.apache.commons.lang3.RandomUtils;
+import org.springframework.stereotype.Service;
+import ru.otus.spring.integration.domain.Food;
+import ru.otus.spring.integration.domain.OrderItem;
+
+@Service
+public class OrderServiceImpl implements OrderService {
+ private static final String[] MENU = {"coffee", "tea", "smoothie", "whiskey", "beer", "cola", "water"};
+
+ private final CafeGateway cafe;
+
+ public OrderServiceImpl(CafeGateway cafe) {
+ this.cafe = cafe;
+ }
+
+ public void startGenerateOrdersLoop() {
+ for (int i = 0; i < 10; i++) {
+ delay();
+
+ OrderItem orderItem = generateOrderItem();
+ System.out.println("New orderItem: " + orderItem.getItemName());
+ Food food = cafe.process(orderItem);
+ System.out.println("Ready food: " + food.getName());
+ }
+ }
+
+ private static OrderItem generateOrderItem() {
+ return new OrderItem(MENU[RandomUtils.nextInt(0, MENU.length)]);
+ }
+
+ private void delay() {
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/2022-08/spring-31/spring-31-solution/pom.xml b/2022-08/spring-31/spring-31-solution/pom.xml
index 5efcc8b8..cebe4933 100644
--- a/2022-08/spring-31/spring-31-solution/pom.xml
+++ b/2022-08/spring-31/spring-31-solution/pom.xml
@@ -11,7 +11,8 @@
org.springframework.boot
spring-boot-starter-parent
- 2.3.3.RELEASE
+ 2.7.8
+
@@ -19,10 +20,7 @@
org.springframework.boot
spring-boot-starter-integration
-
- org.springframework
- spring-messaging
-
+
org.apache.commons
commons-lang3
diff --git a/2022-08/spring-31/spring-31-solution/src/main/java/ru/otus/spring/integration/App.java b/2022-08/spring-31/spring-31-solution/src/main/java/ru/otus/spring/integration/App.java
index bd7a48f2..79be8664 100644
--- a/2022-08/spring-31/spring-31-solution/src/main/java/ru/otus/spring/integration/App.java
+++ b/2022-08/spring-31/spring-31-solution/src/main/java/ru/otus/spring/integration/App.java
@@ -1,96 +1,17 @@
package ru.otus.spring.integration;
-import org.apache.commons.lang3.RandomUtils;
-import org.springframework.context.annotation.AnnotationConfigApplicationContext;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.support.AbstractApplicationContext;
-import org.springframework.integration.annotation.IntegrationComponentScan;
-import org.springframework.integration.channel.PublishSubscribeChannel;
-import org.springframework.integration.channel.QueueChannel;
-import org.springframework.integration.config.EnableIntegration;
-import org.springframework.integration.dsl.IntegrationFlow;
-import org.springframework.integration.dsl.IntegrationFlows;
-import org.springframework.integration.dsl.MessageChannels;
-import org.springframework.integration.dsl.Pollers;
-import org.springframework.integration.scheduling.PollerMetadata;
-import ru.otus.spring.integration.domain.Food;
-import ru.otus.spring.integration.domain.OrderItem;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.concurrent.ForkJoinPool;
-import java.util.stream.Collectors;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.ConfigurableApplicationContext;
+import ru.otus.spring.integration.services.OrderService;
-@IntegrationComponentScan
-@SuppressWarnings({ "resource", "Duplicates", "InfiniteLoopStatement" })
-@ComponentScan
-@Configuration
-@EnableIntegration
+@SpringBootApplication
public class App {
- private static final String[] MENU = { "coffee", "tea", "smoothie", "whiskey", "beer", "cola", "water" };
- @Bean
- public QueueChannel itemsChannel() {
- return MessageChannels.queue( 10 ).get();
- }
-
- @Bean
- public PublishSubscribeChannel foodChannel() {
- return MessageChannels.publishSubscribe().get();
- }
-
- @Bean(name = PollerMetadata.DEFAULT_POLLER)
- public PollerMetadata poller() {
- return Pollers.fixedRate( 100 ).maxMessagesPerPoll( 2 ).get();
- }
-
- @Bean
- public IntegrationFlow cafeFlow() {
- return IntegrationFlows.from( "itemsChannel" )
- .split()
- .handle( "kitchenService", "cook" )
- .aggregate()
- .channel( "foodChannel" )
- .get();
- }
-
- public static void main( String[] args ) throws Exception {
- AbstractApplicationContext ctx = new AnnotationConfigApplicationContext( App.class );
-
- // here we works with cafe using interface
- Cafe cafe = ctx.getBean( Cafe.class );
-
- ForkJoinPool pool = ForkJoinPool.commonPool();
-
- while ( true ) {
- Thread.sleep( 7000 );
-
- pool.execute( () -> {
- Collection items = generateOrderItems();
- System.out.println( "New orderItems: " +
- items.stream().map( OrderItem::getItemName )
- .collect( Collectors.joining( "," ) ) );
- Collection food = cafe.process( items );
- System.out.println( "Ready food: " + food.stream()
- .map( Food::getName )
- .collect( Collectors.joining( "," ) ) );
- } );
- }
- }
-
- private static OrderItem generateOrderItem() {
- return new OrderItem( MENU[ RandomUtils.nextInt( 0, MENU.length ) ] );
- }
-
- private static Collection generateOrderItems() {
- List items = new ArrayList<>();
- for ( int i = 0; i < RandomUtils.nextInt( 1, 5 ); ++ i ) {
- items.add( generateOrderItem() );
- }
- return items;
+ public static void main(String[] args) {
+ ConfigurableApplicationContext ctx = SpringApplication.run(App.class, args);
+ OrderService orderService = ctx.getBean(OrderService.class);
+ orderService.startGenerateOrdersLoop();
}
}
diff --git a/2022-08/spring-31/spring-31-solution/src/main/java/ru/otus/spring/integration/config/IntegrationConfig.java b/2022-08/spring-31/spring-31-solution/src/main/java/ru/otus/spring/integration/config/IntegrationConfig.java
new file mode 100644
index 00000000..b6a10576
--- /dev/null
+++ b/2022-08/spring-31/spring-31-solution/src/main/java/ru/otus/spring/integration/config/IntegrationConfig.java
@@ -0,0 +1,41 @@
+package ru.otus.spring.integration.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.integration.channel.PublishSubscribeChannel;
+import org.springframework.integration.channel.QueueChannel;
+import org.springframework.integration.dsl.IntegrationFlow;
+import org.springframework.integration.dsl.IntegrationFlows;
+import org.springframework.integration.dsl.MessageChannels;
+import org.springframework.integration.dsl.Pollers;
+import org.springframework.integration.scheduling.PollerMetadata;
+import ru.otus.spring.integration.services.KitchenServiceImpl;
+
+@Configuration
+public class IntegrationConfig {
+
+ @Bean
+ public QueueChannel itemsChannel() {
+ return MessageChannels.queue(10).get();
+ }
+
+ @Bean
+ public PublishSubscribeChannel foodChannel() {
+ return MessageChannels.publishSubscribe().get();
+ }
+
+ @Bean(name = PollerMetadata.DEFAULT_POLLER)
+ public PollerMetadata poller() {
+ return Pollers.fixedRate(100).maxMessagesPerPoll(2).get();
+ }
+
+ @Bean
+ public IntegrationFlow cafeFlow(KitchenServiceImpl kitchenService) {
+ return IntegrationFlows.from(itemsChannel())
+ .split()
+ .handle(kitchenService, "cook")
+ .aggregate()
+ .channel(foodChannel())
+ .get();
+ }
+}
diff --git a/2022-08/spring-31/spring-31-solution/src/main/java/ru/otus/spring/integration/kitchen/KitchenService.java b/2022-08/spring-31/spring-31-solution/src/main/java/ru/otus/spring/integration/kitchen/KitchenService.java
deleted file mode 100644
index 8e40715f..00000000
--- a/2022-08/spring-31/spring-31-solution/src/main/java/ru/otus/spring/integration/kitchen/KitchenService.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package ru.otus.spring.integration.kitchen;
-
-import org.springframework.stereotype.Service;
-import ru.otus.spring.integration.domain.Food;
-import ru.otus.spring.integration.domain.OrderItem;
-
-@Service
-public class KitchenService {
-
- public Food cook(OrderItem orderItem) throws Exception {
- System.out.println("Cooking " + orderItem.getItemName());
- Thread.sleep(3000);
- System.out.println("Cooking " + orderItem.getItemName() + " done");
- return new Food(orderItem.getItemName());
- }
-}
diff --git a/2022-08/spring-31/spring-31-solution/src/main/java/ru/otus/spring/integration/Cafe.java b/2022-08/spring-31/spring-31-solution/src/main/java/ru/otus/spring/integration/services/CafeGateway.java
similarity index 84%
rename from 2022-08/spring-31/spring-31-solution/src/main/java/ru/otus/spring/integration/Cafe.java
rename to 2022-08/spring-31/spring-31-solution/src/main/java/ru/otus/spring/integration/services/CafeGateway.java
index 6b31f40a..85cae973 100644
--- a/2022-08/spring-31/spring-31-solution/src/main/java/ru/otus/spring/integration/Cafe.java
+++ b/2022-08/spring-31/spring-31-solution/src/main/java/ru/otus/spring/integration/services/CafeGateway.java
@@ -1,4 +1,4 @@
-package ru.otus.spring.integration;
+package ru.otus.spring.integration.services;
import org.springframework.integration.annotation.Gateway;
@@ -9,7 +9,7 @@ import ru.otus.spring.integration.domain.OrderItem;
import java.util.Collection;
@MessagingGateway
-public interface Cafe {
+public interface CafeGateway {
@Gateway(requestChannel = "itemsChannel", replyChannel = "foodChannel")
Collection process(Collection orderItem);
diff --git a/2022-08/spring-31/spring-31-solution/src/main/java/ru/otus/spring/integration/services/KitchenService.java b/2022-08/spring-31/spring-31-solution/src/main/java/ru/otus/spring/integration/services/KitchenService.java
new file mode 100644
index 00000000..2ae92af2
--- /dev/null
+++ b/2022-08/spring-31/spring-31-solution/src/main/java/ru/otus/spring/integration/services/KitchenService.java
@@ -0,0 +1,9 @@
+package ru.otus.spring.integration.services;
+
+import ru.otus.spring.integration.domain.Food;
+import ru.otus.spring.integration.domain.OrderItem;
+
+public interface KitchenService {
+
+ Food cook(OrderItem orderItem);
+}
diff --git a/2022-08/spring-31/spring-31-solution/src/main/java/ru/otus/spring/integration/services/KitchenServiceImpl.java b/2022-08/spring-31/spring-31-solution/src/main/java/ru/otus/spring/integration/services/KitchenServiceImpl.java
new file mode 100644
index 00000000..8a01a914
--- /dev/null
+++ b/2022-08/spring-31/spring-31-solution/src/main/java/ru/otus/spring/integration/services/KitchenServiceImpl.java
@@ -0,0 +1,25 @@
+package ru.otus.spring.integration.services;
+
+import org.springframework.stereotype.Service;
+import ru.otus.spring.integration.domain.Food;
+import ru.otus.spring.integration.domain.OrderItem;
+
+@Service
+public class KitchenServiceImpl implements KitchenService {
+
+ @Override
+ public Food cook(OrderItem orderItem) {
+ System.out.println("Cooking " + orderItem.getItemName());
+ delay();
+ System.out.println("Cooking " + orderItem.getItemName() + " done");
+ return new Food(orderItem.getItemName());
+ }
+
+ private static void delay() {
+ try {
+ Thread.sleep(3000);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/2022-08/spring-31/spring-31-solution/src/main/java/ru/otus/spring/integration/services/OrderService.java b/2022-08/spring-31/spring-31-solution/src/main/java/ru/otus/spring/integration/services/OrderService.java
new file mode 100644
index 00000000..e50dc07d
--- /dev/null
+++ b/2022-08/spring-31/spring-31-solution/src/main/java/ru/otus/spring/integration/services/OrderService.java
@@ -0,0 +1,5 @@
+package ru.otus.spring.integration.services;
+
+public interface OrderService {
+ void startGenerateOrdersLoop();
+}
diff --git a/2022-08/spring-31/spring-31-solution/src/main/java/ru/otus/spring/integration/services/OrderServiceImpl.java b/2022-08/spring-31/spring-31-solution/src/main/java/ru/otus/spring/integration/services/OrderServiceImpl.java
new file mode 100644
index 00000000..fc28f314
--- /dev/null
+++ b/2022-08/spring-31/spring-31-solution/src/main/java/ru/otus/spring/integration/services/OrderServiceImpl.java
@@ -0,0 +1,61 @@
+package ru.otus.spring.integration.services;
+
+import org.apache.commons.lang3.RandomUtils;
+import org.springframework.stereotype.Service;
+import ru.otus.spring.integration.domain.Food;
+import ru.otus.spring.integration.domain.OrderItem;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.ForkJoinPool;
+import java.util.stream.Collectors;
+
+@Service
+public class OrderServiceImpl implements OrderService {
+ private static final String[] MENU = {"coffee", "tea", "smoothie", "whiskey", "beer", "cola", "water"};
+
+ private final CafeGateway cafe;
+
+ public OrderServiceImpl(CafeGateway cafe) {
+ this.cafe = cafe;
+ }
+
+ public void startGenerateOrdersLoop() {
+ ForkJoinPool pool = ForkJoinPool.commonPool();
+ for (int i = 0; i < 10; i++) {
+ delay();
+ pool.execute(() -> {
+ Collection items = generateOrderItems();
+ System.out.println("New orderItems: " +
+ items.stream().map(OrderItem::getItemName)
+ .collect(Collectors.joining(",")));
+ Collection food = cafe.process(items);
+ System.out.println("Ready food: " + food.stream()
+ .map(Food::getName)
+ .collect(Collectors.joining(",")));
+ });
+ }
+ }
+
+ private static OrderItem generateOrderItem() {
+ return new OrderItem(MENU[RandomUtils.nextInt(0, MENU.length)]);
+ }
+
+ private static Collection generateOrderItems() {
+ List items = new ArrayList<>();
+ for (int i = 0; i < RandomUtils.nextInt(1, 5); ++i) {
+ items.add(generateOrderItem());
+ }
+ return items;
+ }
+
+ private void delay() {
+ try {
+ Thread.sleep(7000);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+
+ }
+}
diff --git a/2023-01/spring-13-data-jpa/demo/pom.xml b/2023-01/spring-13-data-jpa/demo/pom.xml
index 48523ba6..6decee96 100644
--- a/2023-01/spring-13-data-jpa/demo/pom.xml
+++ b/2023-01/spring-13-data-jpa/demo/pom.xml
@@ -11,7 +11,8 @@
org.springframework.boot
spring-boot-starter-parent
- 2.4.5
+ 2.7.8
+
diff --git a/2023-01/spring-13-data-jpa/exercise/pom.xml b/2023-01/spring-13-data-jpa/exercise/pom.xml
index 172b613d..46d446db 100644
--- a/2023-01/spring-13-data-jpa/exercise/pom.xml
+++ b/2023-01/spring-13-data-jpa/exercise/pom.xml
@@ -11,7 +11,8 @@
org.springframework.boot
spring-boot-starter-parent
- 2.4.5
+ 2.7.8
+
diff --git a/2023-01/spring-13-data-jpa/solution-01/pom.xml b/2023-01/spring-13-data-jpa/solution-01/pom.xml
index 355f4335..d89e13de 100644
--- a/2023-01/spring-13-data-jpa/solution-01/pom.xml
+++ b/2023-01/spring-13-data-jpa/solution-01/pom.xml
@@ -11,7 +11,8 @@
org.springframework.boot
spring-boot-starter-parent
- 2.4.5
+ 2.7.8
+
diff --git a/2023-01/spring-13-data-jpa/solution-02/pom.xml b/2023-01/spring-13-data-jpa/solution-02/pom.xml
index c6dd4ab8..7a32f631 100644
--- a/2023-01/spring-13-data-jpa/solution-02/pom.xml
+++ b/2023-01/spring-13-data-jpa/solution-02/pom.xml
@@ -11,7 +11,8 @@
org.springframework.boot
spring-boot-starter-parent
- 2.4.5
+ 2.7.8
+
diff --git a/2023-01/spring-13-data-jpa/solution-03/pom.xml b/2023-01/spring-13-data-jpa/solution-03/pom.xml
index 4fff22c3..4a9a6008 100644
--- a/2023-01/spring-13-data-jpa/solution-03/pom.xml
+++ b/2023-01/spring-13-data-jpa/solution-03/pom.xml
@@ -11,7 +11,8 @@
org.springframework.boot
spring-boot-starter-parent
- 2.4.5
+ 2.7.8
+
diff --git a/2023-01/spring-13-data-jpa/solution-04/pom.xml b/2023-01/spring-13-data-jpa/solution-04/pom.xml
index 6f0a221c..a7e1de42 100644
--- a/2023-01/spring-13-data-jpa/solution-04/pom.xml
+++ b/2023-01/spring-13-data-jpa/solution-04/pom.xml
@@ -11,7 +11,8 @@
org.springframework.boot
spring-boot-starter-parent
- 2.4.5
+ 2.7.8
+