[
https://issues.apache.org/jira/browse/CAMEL-19154?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
geyipeng updated CAMEL-19154:
-----------------------------
Description:
* This thread concurrency problem seems difficult to solve through debug, but
it should be related to the DequeQue extension of
org.apache.camel.impl.engine.DefaultUnitOfWork#routes that is non-thread safe
---------------------------------------------{-}2023.3.16{-}----------------------------------------
I'm sure this is a concurrent thread safety problem, because I inherited
DefaultUnitOfWork and rewritten the pushRoute (Route route) method. After
changing it to synchronized, the error disappears, but I don't know if there
will be performance problems
in RouteBuilder add:
{color:#FF0000}getContext().adapt(DefaultCamelContext.class).setUnitOfWorkFactory(new
MyUnitOfFactory());{color}
{code:java}
public class MyUnitOfWork extends DefaultUnitOfWork {
public MyUnitOfWork(Exchange exchange) {
super(exchange);
}
public MyUnitOfWork(Exchange exchange, Logger logger, InflightRepository
inflightRepository, boolean allowUseOriginalMessage, boolean useBreadcrumb) {
super(exchange, logger, inflightRepository, allowUseOriginalMessage,
useBreadcrumb);
}
public MyUnitOfWork(Exchange exchange, InflightRepository inflightRepository,
boolean allowUseOriginalMessage, boolean useBreadcrumb) {
super(exchange, inflightRepository, allowUseOriginalMessage, useBreadcrumb);
}
@Override
public synchronized void pushRoute(Route route) {
super.pushRoute(route);
}
}
public class MyUnitOfFactory extends DefaultUnitOfWorkFactory {
private InflightRepository inflightRepository;
private boolean usedMDCLogging;
private String mdcLoggingKeysPattern;
private boolean allowUseOriginalMessage;
private boolean useBreadcrumb;
@Override
public UnitOfWork createUnitOfWork(Exchange exchange) {
UnitOfWork answer;
if (usedMDCLogging) {
answer = new MDCUnitOfWork(
exchange, inflightRepository, mdcLoggingKeysPattern,
allowUseOriginalMessage, useBreadcrumb);
} else {
answer = new MyUnitOfWork(exchange, inflightRepository,
allowUseOriginalMessage, useBreadcrumb);
}
return answer;
}
@Override
public void afterPropertiesConfigured(CamelContext camelContext) {
// optimize to read configuration once
inflightRepository = camelContext.getInflightRepository();
usedMDCLogging = camelContext.isUseMDCLogging() != null &&
camelContext.isUseMDCLogging();
mdcLoggingKeysPattern = camelContext.getMDCLoggingKeysPattern();
allowUseOriginalMessage
= camelContext.isAllowUseOriginalMessage() != null ?
camelContext.isAllowUseOriginalMessage() : false;
useBreadcrumb = camelContext.isUseBreadcrumb() != null ?
camelContext.isUseBreadcrumb() : false;
}
}{code}
!image-2023-03-15-20-22-22-192.png!
was:
* This thread concurrency problem seems difficult to solve through debug, but
it should be related to the DequeQue extension of
org.apache.camel.impl.engine.DefaultUnitOfWork#routes that is non-thread safe
----------------------------------------------2023.2.16-----------------------------------------
I'm sure this is a concurrent thread safety problem, because I inherited
DefaultUnitOfWork and rewritten the pushRoute (Route route) method. After
changing it to synchronized, the error disappears
!image-2023-03-15-20-22-22-192.png!
> DefaultUnitOfWork may have thread security issues when I use dynamicrouter
> --------------------------------------------------------------------------
>
> Key: CAMEL-19154
> URL: https://issues.apache.org/jira/browse/CAMEL-19154
> Project: Camel
> Issue Type: Bug
> Components: came-core
> Affects Versions: 3.20.2
> Reporter: geyipeng
> Priority: Major
> Attachments: image-2023-03-15-20-22-22-192.png
>
>
> * This thread concurrency problem seems difficult to solve through debug, but
> it should be related to the DequeQue extension of
> org.apache.camel.impl.engine.DefaultUnitOfWork#routes that is non-thread safe
> ---------------------------------------------{-}2023.3.16{-}----------------------------------------
> I'm sure this is a concurrent thread safety problem, because I inherited
> DefaultUnitOfWork and rewritten the pushRoute (Route route) method. After
> changing it to synchronized, the error disappears, but I don't know if there
> will be performance problems
> in RouteBuilder add:
> {color:#FF0000}getContext().adapt(DefaultCamelContext.class).setUnitOfWorkFactory(new
> MyUnitOfFactory());{color}
> {code:java}
> public class MyUnitOfWork extends DefaultUnitOfWork {
> public MyUnitOfWork(Exchange exchange) {
> super(exchange);
> }
> public MyUnitOfWork(Exchange exchange, Logger logger, InflightRepository
> inflightRepository, boolean allowUseOriginalMessage, boolean useBreadcrumb) {
> super(exchange, logger, inflightRepository, allowUseOriginalMessage,
> useBreadcrumb);
> }
> public MyUnitOfWork(Exchange exchange, InflightRepository inflightRepository,
> boolean allowUseOriginalMessage, boolean useBreadcrumb) {
> super(exchange, inflightRepository, allowUseOriginalMessage, useBreadcrumb);
> }
> @Override
> public synchronized void pushRoute(Route route) {
> super.pushRoute(route);
> }
> }
> public class MyUnitOfFactory extends DefaultUnitOfWorkFactory {
> private InflightRepository inflightRepository;
> private boolean usedMDCLogging;
> private String mdcLoggingKeysPattern;
> private boolean allowUseOriginalMessage;
> private boolean useBreadcrumb;
> @Override
> public UnitOfWork createUnitOfWork(Exchange exchange) {
> UnitOfWork answer;
> if (usedMDCLogging) {
> answer = new MDCUnitOfWork(
> exchange, inflightRepository, mdcLoggingKeysPattern,
> allowUseOriginalMessage, useBreadcrumb);
> } else {
> answer = new MyUnitOfWork(exchange, inflightRepository,
> allowUseOriginalMessage, useBreadcrumb);
> }
> return answer;
> }
> @Override
> public void afterPropertiesConfigured(CamelContext camelContext) {
> // optimize to read configuration once
> inflightRepository = camelContext.getInflightRepository();
> usedMDCLogging = camelContext.isUseMDCLogging() != null &&
> camelContext.isUseMDCLogging();
> mdcLoggingKeysPattern = camelContext.getMDCLoggingKeysPattern();
> allowUseOriginalMessage
> = camelContext.isAllowUseOriginalMessage() != null ?
> camelContext.isAllowUseOriginalMessage() : false;
> useBreadcrumb = camelContext.isUseBreadcrumb() != null ?
> camelContext.isUseBreadcrumb() : false;
> }
> }{code}
> !image-2023-03-15-20-22-22-192.png!
--
This message was sent by Atlassian Jira
(v8.20.10#820010)