From 795f39d238604681658414d5880d0635454bc86b Mon Sep 17 00:00:00 2001 From: michaelin007 Date: Mon, 5 Feb 2024 06:42:49 +0000 Subject: [PATCH 01/11] https://jira.baeldung.com/browse/BAEL-5235 --- apache-libraries-2/pom.xml | 19 ++++++ .../dynamicrouter/DynamicRouterBean.java | 28 +++++++++ .../dynamicrouter/DynamicRouterRoute.java | 13 ++++ .../DynamicRouterRouteUnitTest.java | 63 +++++++++++++++++++ .../dynamicrouting/DynamicRouteBuilder.java | 4 ++ .../dynamicrouting/DynamicRouterBean.java | 4 ++ .../dynamicrouter/DynamicRouterUnitTest.java | 4 ++ 7 files changed, 135 insertions(+) create mode 100644 apache-libraries-2/src/main/java/com/baeldung/dynamicrouter/DynamicRouterBean.java create mode 100644 apache-libraries-2/src/main/java/com/baeldung/dynamicrouter/DynamicRouterRoute.java create mode 100644 apache-libraries-2/src/test/java/dynamicrouter/DynamicRouterRouteUnitTest.java create mode 100644 messaging-modules/apache-camel/src/main/java/com/baeldung/camel/apache/dynamicrouting/DynamicRouteBuilder.java create mode 100644 messaging-modules/apache-camel/src/main/java/com/baeldung/camel/apache/dynamicrouting/DynamicRouterBean.java create mode 100644 messaging-modules/apache-camel/src/test/java/com/apache/dynamicrouter/DynamicRouterUnitTest.java diff --git a/apache-libraries-2/pom.xml b/apache-libraries-2/pom.xml index d188204208..2e7ef0344c 100644 --- a/apache-libraries-2/pom.xml +++ b/apache-libraries-2/pom.xml @@ -19,10 +19,29 @@ validation-api ${javax.validation.validation-api.version} + + org.apache.camel + camel-core + ${camel.version} + + + + org.apache.camel + camel-test-junit5 + ${camel.version} + test + + + + org.apache.camel + camel-main + ${camel.version} + 2.0.1.Final + 4.3.0 \ No newline at end of file diff --git a/apache-libraries-2/src/main/java/com/baeldung/dynamicrouter/DynamicRouterBean.java b/apache-libraries-2/src/main/java/com/baeldung/dynamicrouter/DynamicRouterBean.java new file mode 100644 index 0000000000..3df861d2b2 --- /dev/null +++ b/apache-libraries-2/src/main/java/com/baeldung/dynamicrouter/DynamicRouterBean.java @@ -0,0 +1,28 @@ +package com.baeldung.dynamicrouter; + +import org.apache.camel.ExchangeProperties; + +import java.util.Map; + +public class DynamicRouterBean { + public String route(String body, @ExchangeProperties Map properties) { + int invoked = 0; + Integer current = (Integer) properties.get("invoked"); + if (current != null) { + invoked = current; + } + invoked++; + properties.put("invoked", invoked); + + if (body.equalsIgnoreCase("mock") && invoked == 1) { + return "mock:dynamicRouter"; + } else if (body.equalsIgnoreCase("direct") && invoked == 1) { + return "mock:directDynamicRouter"; + } else if (body.equalsIgnoreCase("seda") && invoked == 1) { + return "mock:sedaDynamicRouter"; + } else if (body.equalsIgnoreCase("book") && invoked == 1) { + return "mock:bookDynamicRouter"; + } + return null; + } +} diff --git a/apache-libraries-2/src/main/java/com/baeldung/dynamicrouter/DynamicRouterRoute.java b/apache-libraries-2/src/main/java/com/baeldung/dynamicrouter/DynamicRouterRoute.java new file mode 100644 index 0000000000..875263f0b1 --- /dev/null +++ b/apache-libraries-2/src/main/java/com/baeldung/dynamicrouter/DynamicRouterRoute.java @@ -0,0 +1,13 @@ +package com.baeldung.dynamicrouter; + +import org.apache.camel.builder.RouteBuilder; + +public class DynamicRouterRoute extends RouteBuilder { + + @Override + public void configure() { + + from("direct:dynamicRouter").dynamicRouter(method(DynamicRouterBean.class, "route")); + + } +} diff --git a/apache-libraries-2/src/test/java/dynamicrouter/DynamicRouterRouteUnitTest.java b/apache-libraries-2/src/test/java/dynamicrouter/DynamicRouterRouteUnitTest.java new file mode 100644 index 0000000000..fa8cab99a0 --- /dev/null +++ b/apache-libraries-2/src/test/java/dynamicrouter/DynamicRouterRouteUnitTest.java @@ -0,0 +1,63 @@ +package dynamicrouter; + +import com.baeldung.dynamicrouter.DynamicRouterRoute; +import org.apache.camel.RoutesBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.test.junit5.CamelTestSupport; +import org.junit.jupiter.api.Test; + +public class DynamicRouterRouteUnitTest extends CamelTestSupport { + + @Override + protected RoutesBuilder createRouteBuilder() { + return new DynamicRouterRoute(); + } + + @Test + void givenDynamicRouter_whenMockEndpointExpectedMessageCountOneAndMockAsMessageBody_thenMessageSentToDynamicRouter() throws InterruptedException { + + MockEndpoint mockDynamicEndpoint = getMockEndpoint("mock:dynamicRouter"); + mockDynamicEndpoint.expectedMessageCount(1); + + template.send("direct:dynamicRouter", exchange -> exchange.getIn() + .setBody("mock")); + context.start(); + MockEndpoint.assertIsSatisfied(context); + } + + @Test + void givenDynamicRouter_whenMockEndpointExpectedMessageCountOneAndDirectAsMessageBody_thenMessageSentToDynamicRouter() throws InterruptedException { + + MockEndpoint mockDynamicEndpoint = context.getEndpoint("mock:directDynamicRouter", MockEndpoint.class); + mockDynamicEndpoint.expectedMessageCount(1); + + template.send("direct:dynamicRouter", exchange -> exchange.getIn() + .setBody("direct")); + + MockEndpoint.assertIsSatisfied(context); + } + + @Test + void givenDynamicRouter_whenMockEndpointExpectedMessageCountOneAndSedaAsMessageBody_thenMessageSentToDynamicRouter() throws InterruptedException { + + MockEndpoint mockDynamicEndpoint = context.getEndpoint("mock:sedaDynamicRouter", MockEndpoint.class); + mockDynamicEndpoint.expectedMessageCount(1); + + template.send("direct:dynamicRouter", exchange -> exchange.getIn() + .setBody("seda")); + + MockEndpoint.assertIsSatisfied(context); + } + + @Test + void givenDynamicRouter_whenMockEndpointExpectedMessageCountOneAndBookAsMessageBody_thenMessageSentToDynamicRouter() throws InterruptedException { + + MockEndpoint mockDynamicEndpoint = getMockEndpoint("mock:bookDynamicRouter"); + mockDynamicEndpoint.expectedMessageCount(1); + + template.send("direct:dynamicRouter", exchange -> exchange.getIn() + .setBody("book")); + MockEndpoint.assertIsSatisfied(context); + } + +} \ No newline at end of file diff --git a/messaging-modules/apache-camel/src/main/java/com/baeldung/camel/apache/dynamicrouting/DynamicRouteBuilder.java b/messaging-modules/apache-camel/src/main/java/com/baeldung/camel/apache/dynamicrouting/DynamicRouteBuilder.java new file mode 100644 index 0000000000..0019a56cae --- /dev/null +++ b/messaging-modules/apache-camel/src/main/java/com/baeldung/camel/apache/dynamicrouting/DynamicRouteBuilder.java @@ -0,0 +1,4 @@ +package com.baeldung.camel.apache.dynamicrouting; + +public class DynamicRouteBuilder { +} diff --git a/messaging-modules/apache-camel/src/main/java/com/baeldung/camel/apache/dynamicrouting/DynamicRouterBean.java b/messaging-modules/apache-camel/src/main/java/com/baeldung/camel/apache/dynamicrouting/DynamicRouterBean.java new file mode 100644 index 0000000000..3128551b0a --- /dev/null +++ b/messaging-modules/apache-camel/src/main/java/com/baeldung/camel/apache/dynamicrouting/DynamicRouterBean.java @@ -0,0 +1,4 @@ +package com.baeldung.camel.apache.dynamicrouting; + +public class DynamicRouterBean { +} diff --git a/messaging-modules/apache-camel/src/test/java/com/apache/dynamicrouter/DynamicRouterUnitTest.java b/messaging-modules/apache-camel/src/test/java/com/apache/dynamicrouter/DynamicRouterUnitTest.java new file mode 100644 index 0000000000..a5a7a2c4fa --- /dev/null +++ b/messaging-modules/apache-camel/src/test/java/com/apache/dynamicrouter/DynamicRouterUnitTest.java @@ -0,0 +1,4 @@ +package com.apache.dynamicrouter; + +public class DynamicRouterUnitTest { +} From f63fbeca4f74d249e2ba34ef6ea79f76be7d6aae Mon Sep 17 00:00:00 2001 From: michaelin007 Date: Mon, 5 Feb 2024 06:45:06 +0000 Subject: [PATCH 02/11] https://jira.baeldung.com/browse/BAEL-5235 --- .../camel/apache/dynamicrouting/DynamicRouteBuilder.java | 4 ---- .../camel/apache/dynamicrouting/DynamicRouterBean.java | 4 ---- .../java/com/apache/dynamicrouter/DynamicRouterUnitTest.java | 4 ---- 3 files changed, 12 deletions(-) delete mode 100644 messaging-modules/apache-camel/src/main/java/com/baeldung/camel/apache/dynamicrouting/DynamicRouteBuilder.java delete mode 100644 messaging-modules/apache-camel/src/main/java/com/baeldung/camel/apache/dynamicrouting/DynamicRouterBean.java delete mode 100644 messaging-modules/apache-camel/src/test/java/com/apache/dynamicrouter/DynamicRouterUnitTest.java diff --git a/messaging-modules/apache-camel/src/main/java/com/baeldung/camel/apache/dynamicrouting/DynamicRouteBuilder.java b/messaging-modules/apache-camel/src/main/java/com/baeldung/camel/apache/dynamicrouting/DynamicRouteBuilder.java deleted file mode 100644 index 0019a56cae..0000000000 --- a/messaging-modules/apache-camel/src/main/java/com/baeldung/camel/apache/dynamicrouting/DynamicRouteBuilder.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.baeldung.camel.apache.dynamicrouting; - -public class DynamicRouteBuilder { -} diff --git a/messaging-modules/apache-camel/src/main/java/com/baeldung/camel/apache/dynamicrouting/DynamicRouterBean.java b/messaging-modules/apache-camel/src/main/java/com/baeldung/camel/apache/dynamicrouting/DynamicRouterBean.java deleted file mode 100644 index 3128551b0a..0000000000 --- a/messaging-modules/apache-camel/src/main/java/com/baeldung/camel/apache/dynamicrouting/DynamicRouterBean.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.baeldung.camel.apache.dynamicrouting; - -public class DynamicRouterBean { -} diff --git a/messaging-modules/apache-camel/src/test/java/com/apache/dynamicrouter/DynamicRouterUnitTest.java b/messaging-modules/apache-camel/src/test/java/com/apache/dynamicrouter/DynamicRouterUnitTest.java deleted file mode 100644 index a5a7a2c4fa..0000000000 --- a/messaging-modules/apache-camel/src/test/java/com/apache/dynamicrouter/DynamicRouterUnitTest.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.apache.dynamicrouter; - -public class DynamicRouterUnitTest { -} From 8af3dd780f4c9fe8782745c39a666d8de5744507 Mon Sep 17 00:00:00 2001 From: michaelin007 Date: Wed, 7 Feb 2024 07:01:48 +0000 Subject: [PATCH 03/11] https://jira.baeldung.com/browse/BAEL-5235 --- .../java/com/baeldung/dynamicrouter/DynamicRouterBean.java | 4 ++-- .../test/java/dynamicrouter/DynamicRouterRouteUnitTest.java | 6 ++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/apache-libraries-2/src/main/java/com/baeldung/dynamicrouter/DynamicRouterBean.java b/apache-libraries-2/src/main/java/com/baeldung/dynamicrouter/DynamicRouterBean.java index 3df861d2b2..8bc455353b 100644 --- a/apache-libraries-2/src/main/java/com/baeldung/dynamicrouter/DynamicRouterBean.java +++ b/apache-libraries-2/src/main/java/com/baeldung/dynamicrouter/DynamicRouterBean.java @@ -20,8 +20,8 @@ public class DynamicRouterBean { return "mock:directDynamicRouter"; } else if (body.equalsIgnoreCase("seda") && invoked == 1) { return "mock:sedaDynamicRouter"; - } else if (body.equalsIgnoreCase("book") && invoked == 1) { - return "mock:bookDynamicRouter"; + } else if (body.equalsIgnoreCase("file") && invoked == 1) { + return "mock:fileDynamicRouter"; } return null; } diff --git a/apache-libraries-2/src/test/java/dynamicrouter/DynamicRouterRouteUnitTest.java b/apache-libraries-2/src/test/java/dynamicrouter/DynamicRouterRouteUnitTest.java index fa8cab99a0..6401fa4be2 100644 --- a/apache-libraries-2/src/test/java/dynamicrouter/DynamicRouterRouteUnitTest.java +++ b/apache-libraries-2/src/test/java/dynamicrouter/DynamicRouterRouteUnitTest.java @@ -21,7 +21,6 @@ public class DynamicRouterRouteUnitTest extends CamelTestSupport { template.send("direct:dynamicRouter", exchange -> exchange.getIn() .setBody("mock")); - context.start(); MockEndpoint.assertIsSatisfied(context); } @@ -45,18 +44,17 @@ public class DynamicRouterRouteUnitTest extends CamelTestSupport { template.send("direct:dynamicRouter", exchange -> exchange.getIn() .setBody("seda")); - MockEndpoint.assertIsSatisfied(context); } @Test void givenDynamicRouter_whenMockEndpointExpectedMessageCountOneAndBookAsMessageBody_thenMessageSentToDynamicRouter() throws InterruptedException { - MockEndpoint mockDynamicEndpoint = getMockEndpoint("mock:bookDynamicRouter"); + MockEndpoint mockDynamicEndpoint = getMockEndpoint("mock:fileDynamicRouter"); mockDynamicEndpoint.expectedMessageCount(1); template.send("direct:dynamicRouter", exchange -> exchange.getIn() - .setBody("book")); + .setBody("file")); MockEndpoint.assertIsSatisfied(context); } From 4288f99d1064f0a666a5fb392cdeb8a32a9a3bd2 Mon Sep 17 00:00:00 2001 From: michaelin007 Date: Fri, 9 Feb 2024 08:50:46 +0000 Subject: [PATCH 04/11] https://jira.baeldung.com/browse/BAEL-5235 --- .../dynamicrouter/DynamicRouterBean.java | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/apache-libraries-2/src/main/java/com/baeldung/dynamicrouter/DynamicRouterBean.java b/apache-libraries-2/src/main/java/com/baeldung/dynamicrouter/DynamicRouterBean.java index 8bc455353b..a28c3959a4 100644 --- a/apache-libraries-2/src/main/java/com/baeldung/dynamicrouter/DynamicRouterBean.java +++ b/apache-libraries-2/src/main/java/com/baeldung/dynamicrouter/DynamicRouterBean.java @@ -6,22 +6,23 @@ import java.util.Map; public class DynamicRouterBean { public String route(String body, @ExchangeProperties Map properties) { - int invoked = 0; - Integer current = (Integer) properties.get("invoked"); - if (current != null) { - invoked = current; - } - invoked++; + int invoked = (int) properties.getOrDefault("invoked", 0) + 1; + properties.put("invoked", invoked); - if (body.equalsIgnoreCase("mock") && invoked == 1) { - return "mock:dynamicRouter"; - } else if (body.equalsIgnoreCase("direct") && invoked == 1) { - return "mock:directDynamicRouter"; - } else if (body.equalsIgnoreCase("seda") && invoked == 1) { - return "mock:sedaDynamicRouter"; - } else if (body.equalsIgnoreCase("file") && invoked == 1) { - return "mock:fileDynamicRouter"; + if (invoked == 1) { + switch (body.toLowerCase()) { + case "mock": + return "mock:dynamicRouter"; + case "direct": + return "mock:directDynamicRouter"; + case "seda": + return "mock:sedaDynamicRouter"; + case "file": + return "mock:fileDynamicRouter"; + default: + break; + } } return null; } From ff272d2dde18ba208e74c3ce8391c686effb7d60 Mon Sep 17 00:00:00 2001 From: Ana Peterlic Date: Sat, 17 Feb 2024 06:59:18 +0100 Subject: [PATCH 05/11] Change log level --- .../src/main/java/com/baeldung/logging/LoggingAspect.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-aop-2/src/main/java/com/baeldung/logging/LoggingAspect.java b/spring-aop-2/src/main/java/com/baeldung/logging/LoggingAspect.java index 6641b70eec..82b52bea25 100644 --- a/spring-aop-2/src/main/java/com/baeldung/logging/LoggingAspect.java +++ b/spring-aop-2/src/main/java/com/baeldung/logging/LoggingAspect.java @@ -28,13 +28,13 @@ public class LoggingAspect { public void logBefore(JoinPoint joinPoint) { Object[] args = joinPoint.getArgs(); String methodName = joinPoint.getSignature().getName(); - logger.info(">> {}() - {}", methodName, Arrays.toString(args)); + logger.debug(">> {}() - {}", methodName, Arrays.toString(args)); } @AfterReturning(value = "publicMethodsFromLoggingPackage()", returning = "result") public void logAfter(JoinPoint joinPoint, Object result) { String methodName = joinPoint.getSignature().getName(); - logger.info("<< {}() - {}", methodName, result); + logger.debug("<< {}() - {}", methodName, result); } @AfterThrowing(pointcut = "publicMethodsFromLoggingPackage()", throwing = "exception") @@ -47,9 +47,9 @@ public class LoggingAspect { public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable { Object[] args = joinPoint.getArgs(); String methodName = joinPoint.getSignature().getName(); - logger.info(">> {}() - {}", methodName, Arrays.toString(args)); + logger.debug(">> {}() - {}", methodName, Arrays.toString(args)); Object result = joinPoint.proceed(); - logger.info("<< {}() - {}", methodName, result); + logger.debug("<< {}() - {}", methodName, result); return result; } } From c96bfc17634741f7bdd8c72674085ef96c71f11b Mon Sep 17 00:00:00 2001 From: Ana Peterlic Date: Sat, 17 Feb 2024 18:13:10 +0100 Subject: [PATCH 06/11] Update GreetingServiceWithoutAOP.java --- .../java/com/baeldung/logging/GreetingServiceWithoutAOP.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-aop-2/src/main/java/com/baeldung/logging/GreetingServiceWithoutAOP.java b/spring-aop-2/src/main/java/com/baeldung/logging/GreetingServiceWithoutAOP.java index eee90af669..f13c70f93b 100644 --- a/spring-aop-2/src/main/java/com/baeldung/logging/GreetingServiceWithoutAOP.java +++ b/spring-aop-2/src/main/java/com/baeldung/logging/GreetingServiceWithoutAOP.java @@ -10,9 +10,9 @@ public class GreetingServiceWithoutAOP { private static final Logger logger = LoggerFactory.getLogger(GreetingServiceWithoutAOP.class); public String greet(String name) { - logger.info(">> greet() - {}", name); + logger.debug(">> greet() - {}", name); String result = String.format("Hello %s", name); - logger.info("<< greet() - {}", result); + logger.debug("<< greet() - {}", result); return result; } } From 6a80f8562525a059953f9059f584fa53bd3dc0bf Mon Sep 17 00:00:00 2001 From: Wynn Teo <49014791+wynnteo@users.noreply.github.com> Date: Mon, 19 Feb 2024 03:47:45 +0800 Subject: [PATCH 07/11] Bael 7489 (#15828) * BAEL-7490 read write file in separate thread * Change the to try resources * Update the code to sync with article * BAEL-7489 first draft * Change to spring-kafka-3 module * moved to another repo --- .../HandleInstanceAlreadyExistsException.java | 56 ++++++++ .../kafka/kafkaexception/KafkaAppMain.java | 12 ++ ...imulateInstanceAlreadyExistsException.java | 123 ++++++++++++++++++ 3 files changed, 191 insertions(+) create mode 100644 spring-kafka-3/src/main/java/com/baeldung/spring/kafka/kafkaexception/HandleInstanceAlreadyExistsException.java create mode 100644 spring-kafka-3/src/main/java/com/baeldung/spring/kafka/kafkaexception/KafkaAppMain.java create mode 100644 spring-kafka-3/src/main/java/com/baeldung/spring/kafka/kafkaexception/SimulateInstanceAlreadyExistsException.java diff --git a/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/kafkaexception/HandleInstanceAlreadyExistsException.java b/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/kafkaexception/HandleInstanceAlreadyExistsException.java new file mode 100644 index 0000000000..1de39987b8 --- /dev/null +++ b/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/kafkaexception/HandleInstanceAlreadyExistsException.java @@ -0,0 +1,56 @@ +package com.baeldung.spring.kafka.kafkaexception; + +import java.lang.management.ManagementFactory; +import java.util.Properties; +import java.util.UUID; + +import javax.management.MBeanServer; +import javax.management.ObjectName; + +import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.common.serialization.StringSerializer; + +public class HandleInstanceAlreadyExistsException { + + public static void generateUniqueClientIDUsingUUIDRandom() { + Properties props = new Properties(); + props.put("bootstrap.servers", "localhost:9092"); + props.put("key.serializer", StringSerializer.class); + props.put("value.serializer", StringSerializer.class); + + String clientId = "my-producer-" + UUID.randomUUID(); + props.setProperty("client.id", clientId); + KafkaProducer producer1 = new KafkaProducer<>(props); + + clientId = "my-producer-" + UUID.randomUUID(); + props.setProperty("client.id", clientId); + KafkaProducer producer2 = new KafkaProducer<>(props); + } + + public static void closeProducerProperlyBeforeReinstantiate() { + Properties props = new Properties(); + props.put("bootstrap.servers", "localhost:9092"); + props.put("client.id", "my-producer"); + props.put("key.serializer", StringSerializer.class); + props.put("value.serializer", StringSerializer.class); + + KafkaProducer producer1 = new KafkaProducer<>(props); + producer1.close(); + + producer1 = new KafkaProducer<>(props); + } + + public static void useUniqueObjectName() throws Exception { + MBeanServer mBeanServer1 = ManagementFactory.getPlatformMBeanServer(); + MBeanServer mBeanServer2 = ManagementFactory.getPlatformMBeanServer(); + + ObjectName objectName1 = new ObjectName("kafka.server:type=KafkaMetrics,id=metric1"); + ObjectName objectName2 = new ObjectName("kafka.server:type=KafkaMetrics,id=metric2"); + + MyMBean mBean1 = new MyMBean(); + mBeanServer1.registerMBean(mBean1, objectName1); + + MyMBean mBean2 = new MyMBean(); + mBeanServer2.registerMBean(mBean2, objectName2); + } +} diff --git a/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/kafkaexception/KafkaAppMain.java b/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/kafkaexception/KafkaAppMain.java new file mode 100644 index 0000000000..14d6b71b10 --- /dev/null +++ b/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/kafkaexception/KafkaAppMain.java @@ -0,0 +1,12 @@ +package com.baeldung.spring.kafka.kafkaexception; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class KafkaAppMain { + + public static void main(String[] args) { + SpringApplication.run(KafkaAppMain.class, args); + } +} diff --git a/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/kafkaexception/SimulateInstanceAlreadyExistsException.java b/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/kafkaexception/SimulateInstanceAlreadyExistsException.java new file mode 100644 index 0000000000..d454d317f2 --- /dev/null +++ b/spring-kafka-3/src/main/java/com/baeldung/spring/kafka/kafkaexception/SimulateInstanceAlreadyExistsException.java @@ -0,0 +1,123 @@ +package com.baeldung.spring.kafka.kafkaexception; + +import java.lang.management.ManagementFactory; +import java.util.Properties; + +import javax.management.Attribute; +import javax.management.AttributeList; +import javax.management.AttributeNotFoundException; +import javax.management.DynamicMBean; +import javax.management.InvalidAttributeValueException; +import javax.management.MBeanAttributeInfo; +import javax.management.MBeanConstructorInfo; +import javax.management.MBeanException; +import javax.management.MBeanInfo; +import javax.management.MBeanNotificationInfo; +import javax.management.MBeanOperationInfo; +import javax.management.MBeanServer; +import javax.management.ObjectName; +import javax.management.ReflectionException; + +import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.common.serialization.StringDeserializer; +import org.apache.kafka.common.serialization.StringSerializer; +import org.springframework.stereotype.Service; + +@Service +public class SimulateInstanceAlreadyExistsException { + + public static void jmxRegistrationConflicts() throws Exception { + // Create two instances of MBeanServer + MBeanServer mBeanServer1 = ManagementFactory.getPlatformMBeanServer(); + MBeanServer mBeanServer2 = ManagementFactory.getPlatformMBeanServer(); + + // Define the same ObjectName for both MBeans + ObjectName objectName = new ObjectName("kafka.server:type=KafkaMetrics"); + + // Create and register the first MBean + MyMBean mBean1 = new MyMBean(); + mBeanServer1.registerMBean(mBean1, objectName); + + // Attempt to register the second MBean with the same ObjectName + MyMBean mBean2 = new MyMBean(); + mBeanServer2.registerMBean(mBean2, objectName); + } + + public static void duplicateConsumerClientID() { + Properties props = new Properties(); + props.put("bootstrap.servers", "localhost:9092"); + props.put("client.id", "my-consumer"); + props.put("group.id", "test-group"); + props.put("key.deserializer", StringDeserializer.class); + props.put("value.deserializer", StringDeserializer.class); + + // Simulating concurrent client creation by multiple threads + for (int i = 0; i < 3; i++) { + new Thread(() -> { + KafkaConsumer consumer = new KafkaConsumer<>(props); + }).start(); + } + } + + public void duplicateProducerClientID() throws Exception { + Properties props = new Properties(); + props.put("bootstrap.servers", "localhost:9092"); + props.put("client.id", "my-producer"); + props.put("key.serializer", StringSerializer.class); + props.put("value.serializer", StringSerializer.class); + + KafkaProducer producer1 = new KafkaProducer<>(props); + // Attempting to create another producer using same client.id + KafkaProducer producer2 = new KafkaProducer<>(props); + } + + public static void unclosedProducerAndReinitialize() { + Properties props = new Properties(); + props.put("bootstrap.servers", "localhost:9092"); + props.put("client.id", "my-producer"); + props.put("key.serializer", StringSerializer.class); + props.put("value.serializer", StringSerializer.class); + + KafkaProducer producer1 = new KafkaProducer<>(props); + // Attempting to reinitialize without proper close + producer1 = new KafkaProducer<>(props); + } +} + +class MyMBean implements DynamicMBean { + + @Override + public Object getAttribute(String attribute) throws AttributeNotFoundException, MBeanException, ReflectionException { + return null; + } + + @Override + public void setAttribute(Attribute attribute) throws AttributeNotFoundException, InvalidAttributeValueException, MBeanException, ReflectionException { + + } + + @Override + public AttributeList getAttributes(String[] attributes) { + return null; + } + + @Override + public AttributeList setAttributes(AttributeList attributes) { + return null; + } + + @Override + public Object invoke(String actionName, Object[] params, String[] signature) throws MBeanException, ReflectionException { + return null; + } + + @Override + public MBeanInfo getMBeanInfo() { + MBeanAttributeInfo[] attributes = new MBeanAttributeInfo[0]; + MBeanConstructorInfo[] constructors = new MBeanConstructorInfo[0]; + MBeanOperationInfo[] operations = new MBeanOperationInfo[0]; + MBeanNotificationInfo[] notifications = new MBeanNotificationInfo[0]; + return new MBeanInfo(MyMBean.class.getName(), "My MBean", attributes, constructors, operations, notifications); + } +} From bac8dd053630174dc448cd5310c8b855f9284ae2 Mon Sep 17 00:00:00 2001 From: Bipin kumar Date: Mon, 19 Feb 2024 13:13:39 +0530 Subject: [PATCH 08/11] [JAVA-28926] Changes made to upgrade lightrun to Spring Boot 3 (#15880) --- lightrun/lightrun-tasks-service/pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lightrun/lightrun-tasks-service/pom.xml b/lightrun/lightrun-tasks-service/pom.xml index 773c81a9d5..c27ef103b9 100644 --- a/lightrun/lightrun-tasks-service/pom.xml +++ b/lightrun/lightrun-tasks-service/pom.xml @@ -48,6 +48,7 @@ org.apache.activemq artemis-jms-server + ${activemq.version} org.springframework.boot @@ -65,4 +66,8 @@ + + 2.32.0 + + \ No newline at end of file From a407c2f01543573752cd05ca2d31ff5885980064 Mon Sep 17 00:00:00 2001 From: Amit Pandey Date: Mon, 19 Feb 2024 19:26:56 +0530 Subject: [PATCH 09/11] JAVA-24962 - Modifications to make client work with EJB deployed in Wildfly. (#15753) --- spring-ejb-modules/spring-ejb-client/pom.xml | 12 ++++++++++++ .../springejbclient/SpringEjbClientApplication.java | 4 ++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/spring-ejb-modules/spring-ejb-client/pom.xml b/spring-ejb-modules/spring-ejb-client/pom.xml index b3a65db32b..a94a2e96e0 100644 --- a/spring-ejb-modules/spring-ejb-client/pom.xml +++ b/spring-ejb-modules/spring-ejb-client/pom.xml @@ -50,6 +50,18 @@ io.undertow undertow-servlet + + org.wildfly + wildfly-naming-client + + + org.jboss + jboss-ejb-client + + + org.wildfly.common + wildfly-common + diff --git a/spring-ejb-modules/spring-ejb-client/src/main/java/com/baeldung/springejbclient/SpringEjbClientApplication.java b/spring-ejb-modules/spring-ejb-client/src/main/java/com/baeldung/springejbclient/SpringEjbClientApplication.java index 554fac3417..1f04dcb113 100644 --- a/spring-ejb-modules/spring-ejb-client/src/main/java/com/baeldung/springejbclient/SpringEjbClientApplication.java +++ b/spring-ejb-modules/spring-ejb-client/src/main/java/com/baeldung/springejbclient/SpringEjbClientApplication.java @@ -21,7 +21,7 @@ public class SpringEjbClientApplication { Properties jndiProps = new Properties(); jndiProps.put("java.naming.factory.initial", "org.jboss.naming.remote.client.InitialContextFactory"); jndiProps.put("jboss.naming.client.ejb.context", true); - jndiProps.put("java.naming.provider.url", "http-remoting://localhost:8080"); + jndiProps.put("java.naming.provider.url", "remote+http://localhost:8080"); return new InitialContext(jndiProps); } @@ -37,7 +37,7 @@ public class SpringEjbClientApplication { @SuppressWarnings("rawtypes") private String getFullName(Class classType) { - String moduleName = "spring-ejb-remote/"; + String moduleName = "ejb:/spring-ejb-remote/"; String beanName = classType.getSimpleName(); String viewClassName = classType.getName(); From b4bbf687344f8d859e90d4dd133f5524a542687f Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Mon, 19 Feb 2024 17:39:32 +0100 Subject: [PATCH 10/11] JAVA-29311: migrate spring-security-web-login-2 to parent-boot-3. (#15913) --- .../spring-security-web-login-2/pom.xml | 8 +++++-- .../securityconfig/SpringSecurityConfig.java | 6 ++--- .../SimpleSecurityConfiguration.java | 24 +++++++++---------- .../ManualLogoutIntegrationTest.java | 6 ++--- 4 files changed, 24 insertions(+), 20 deletions(-) diff --git a/spring-security-modules/spring-security-web-login-2/pom.xml b/spring-security-modules/spring-security-web-login-2/pom.xml index a44543a6ba..be2352b299 100644 --- a/spring-security-modules/spring-security-web-login-2/pom.xml +++ b/spring-security-modules/spring-security-web-login-2/pom.xml @@ -10,8 +10,9 @@ com.baeldung - spring-security-modules + parent-boot-3 0.0.1-SNAPSHOT + ../../parent-boot-3 @@ -29,7 +30,7 @@ org.thymeleaf.extras - thymeleaf-extras-springsecurity5 + thymeleaf-extras-springsecurity6 org.springframework @@ -56,4 +57,7 @@ + + com.baeldung.manuallogout.ManualLogoutApplication + \ No newline at end of file diff --git a/spring-security-modules/spring-security-web-login-2/src/main/java/com/baeldung/logoutredirects/securityconfig/SpringSecurityConfig.java b/spring-security-modules/spring-security-web-login-2/src/main/java/com/baeldung/logoutredirects/securityconfig/SpringSecurityConfig.java index ae2cdc20ec..99059112bc 100644 --- a/spring-security-modules/spring-security-web-login-2/src/main/java/com/baeldung/logoutredirects/securityconfig/SpringSecurityConfig.java +++ b/spring-security-modules/spring-security-web-login-2/src/main/java/com/baeldung/logoutredirects/securityconfig/SpringSecurityConfig.java @@ -1,20 +1,20 @@ package com.baeldung.logoutredirects.securityconfig; -import javax.servlet.http.HttpServletResponse; - import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.web.SecurityFilterChain; +import jakarta.servlet.http.HttpServletResponse; + @Configuration @EnableWebSecurity public class SpringSecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { - http.authorizeRequests(authz -> authz.mvcMatchers("/login") + http.authorizeHttpRequests(authz -> authz.requestMatchers("/login") .permitAll() .anyRequest() .authenticated()) diff --git a/spring-security-modules/spring-security-web-login-2/src/main/java/com/baeldung/manuallogout/SimpleSecurityConfiguration.java b/spring-security-modules/spring-security-web-login-2/src/main/java/com/baeldung/manuallogout/SimpleSecurityConfiguration.java index 3991d9a264..92ee4a84a6 100644 --- a/spring-security-modules/spring-security-web-login-2/src/main/java/com/baeldung/manuallogout/SimpleSecurityConfiguration.java +++ b/spring-security-modules/spring-security-web-login-2/src/main/java/com/baeldung/manuallogout/SimpleSecurityConfiguration.java @@ -5,9 +5,6 @@ import static org.springframework.security.web.header.writers.ClearSiteDataHeade import static org.springframework.security.web.header.writers.ClearSiteDataHeaderWriter.Directive.EXECUTION_CONTEXTS; import static org.springframework.security.web.header.writers.ClearSiteDataHeaderWriter.Directive.STORAGE; -import javax.servlet.ServletException; -import javax.servlet.http.Cookie; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Bean; @@ -20,11 +17,14 @@ import org.springframework.security.web.authentication.logout.HeaderWriterLogout import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler; import org.springframework.security.web.header.writers.ClearSiteDataHeaderWriter; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.Cookie; + @Configuration @EnableWebSecurity public class SimpleSecurityConfiguration { - private static Logger logger = LoggerFactory.getLogger(SimpleSecurityConfiguration.class); + private static final Logger logger = LoggerFactory.getLogger(SimpleSecurityConfiguration.class); @Order(4) @Configuration @@ -32,8 +32,8 @@ public class SimpleSecurityConfiguration { @Bean public SecurityFilterChain filterChainLogoutOnRequest(HttpSecurity http) throws Exception { - http.antMatcher("/request/**") - .authorizeRequests(authz -> authz.anyRequest() + http.securityMatcher("/request/**") + .authorizeHttpRequests(authz -> authz.anyRequest() .permitAll()) .logout(logout -> logout.logoutUrl("/request/logout") .addLogoutHandler((request, response, auth) -> { @@ -53,8 +53,8 @@ public class SimpleSecurityConfiguration { @Bean public SecurityFilterChain filterChainDefaultLogout(HttpSecurity http) throws Exception { - http.antMatcher("/basic/**") - .authorizeRequests(authz -> authz.anyRequest() + http.securityMatcher("/basic/**") + .authorizeHttpRequests(authz -> authz.anyRequest() .permitAll()) .logout(logout -> logout.logoutUrl("/basic/basiclogout")); return http.build(); @@ -67,8 +67,8 @@ public class SimpleSecurityConfiguration { @Bean public SecurityFilterChain filterChainAllCookieClearing(HttpSecurity http) throws Exception { - http.antMatcher("/cookies/**") - .authorizeRequests(authz -> authz.anyRequest() + http.securityMatcher("/cookies/**") + .authorizeHttpRequests(authz -> authz.anyRequest() .permitAll()) .logout(logout -> logout.logoutUrl("/cookies/cookielogout") .addLogoutHandler(new SecurityContextLogoutHandler()) @@ -92,8 +92,8 @@ public class SimpleSecurityConfiguration { @Bean public SecurityFilterChain filterChainClearSiteDataHeader(HttpSecurity http) throws Exception { - http.antMatcher("/csd/**") - .authorizeRequests(authz -> authz.anyRequest() + http.securityMatcher("/csd/**") + .authorizeHttpRequests(authz -> authz.anyRequest() .permitAll()) .logout(logout -> logout.logoutUrl("/csd/csdlogout") .addLogoutHandler(new HeaderWriterLogoutHandler(new ClearSiteDataHeaderWriter(SOURCE)))); diff --git a/spring-security-modules/spring-security-web-login-2/src/test/java/com/baeldung/manuallogout/ManualLogoutIntegrationTest.java b/spring-security-modules/spring-security-web-login-2/src/test/java/com/baeldung/manuallogout/ManualLogoutIntegrationTest.java index a9ad907c30..528bb5e80f 100644 --- a/spring-security-modules/spring-security-web-login-2/src/test/java/com/baeldung/manuallogout/ManualLogoutIntegrationTest.java +++ b/spring-security-modules/spring-security-web-login-2/src/test/java/com/baeldung/manuallogout/ManualLogoutIntegrationTest.java @@ -9,9 +9,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpSession; - import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -22,6 +19,9 @@ import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpSession; + @RunWith(SpringRunner.class) @WebMvcTest(SimpleSecurityConfiguration.class) public class ManualLogoutIntegrationTest { From c90cd8ace873779d9d3f93f556c97ebf68da5962 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Mon, 19 Feb 2024 19:28:46 +0200 Subject: [PATCH 11/11] [JAVA-30178] Upgraded byte-buddy version in main pom.xml (#15860) --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6de6042906..f87e8689e1 100644 --- a/pom.xml +++ b/pom.xml @@ -1167,7 +1167,7 @@ 2.2 1.3 4.4.0 - 1.14.6 + 1.14.11