orpiske commented on code in PR #9972:
URL: https://github.com/apache/camel/pull/9972#discussion_r1182699209
##########
core/camel-core/src/test/java/org/apache/camel/impl/DefaultEndpointRegistryTest.java:
##########
@@ -68,4 +76,50 @@ public void configure() throws Exception {
assertTrue(reg.isStatic("file:error"));
}
+ //Testing the issue https://issues.apache.org/jira/browse/CAMEL-19295
+ @Test
+ public void testConcurrency() throws InterruptedException {
+
+ SimpleCamelContext context = new SimpleCamelContext();
+ context.start();
+
+ ProducerTemplate producerTemplate = context.createProducerTemplate();
+ EndpointRegistry<NormalizedUri> endpointRegistry =
context.getEndpointRegistry();
+
+ int nThreads = 4;
+ ExecutorService executorService =
Executors.newFixedThreadPool(nThreads);
+ int iterations = 500;
+
+ for (int j = 0; j < iterations; j++) {
+ CountDownLatch allThreadCompletionSemaphore = new
CountDownLatch(nThreads);
+ for (int i = 0; i < nThreads; i++) {
+
+ executorService.submit(() -> {
+
+
producerTemplate.requestBody("controlbus:route?routeId=route1&action=ACTION_STATUS&loggingLevel=off",
null,
+ ServiceStatus.class);
+
producerTemplate.requestBody("controlbus:route?routeId=route2&action=ACTION_STATUS&loggingLevel=off",
null,
+ ServiceStatus.class);
+
producerTemplate.requestBody("controlbus:route?routeId=route3&action=ACTION_STATUS&loggingLevel=off",
null,
+ ServiceStatus.class);
+
producerTemplate.requestBody("controlbus:route?routeId=route4&action=ACTION_STATUS&loggingLevel=off",
null,
+ ServiceStatus.class);
+
producerTemplate.requestBody("controlbus:route?routeId=route5&action=ACTION_STATUS&loggingLevel=off",
null,
+ ServiceStatus.class);
+
+ allThreadCompletionSemaphore.countDown();
+
+ });
Review Comment:
Are you sure this is enough to trigger the issue? It looks a bit sequential
too me. Maybe it would be better to use a Phaser here so that you can ensure
all the requests are sent at the same time.
Additionally, it may be good to do something like:
```
final Endpoint endpoint =
getCamelContext().getEndpoint(""controlbus:route?routeId=route5&action=ACTION_STATUS&loggingLevel=off");
---> do this outside the loop.
/// then, inside the submit:
producerTemplate.sendBody(endpoint, ServiceStatus.class);
```
There is an associated cost with resolving the endpoint when calling via
`producerTemplate.requestBody` using a URI. This may reduce the chance of the
same sections of code running truly concurrently.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]