Jannik Schmeier created CAMEL-21614:
---------------------------------------
Summary: Simple expressions execute forever. Thread is RUNNABLE
for ever. Issue appears with bean expressions inside simple expressions on
SimpleLRUCache
Key: CAMEL-21614
URL: https://issues.apache.org/jira/browse/CAMEL-21614
Project: Camel
Issue Type: Bug
Components: camel-core
Affects Versions: 4.8.2
Environment: jdk-21.0.2+13 (Eclipse Temurin)
Spring Boot 3.3.6
Camel 4.8.2
Reporter: Jannik Schmeier
This is a Follow-Up on this issue: CAMEL-21467
Unfortunately we are still experiencing the same issue with threads getting
stuck in the state RUNNABLE. It seems like the frequency of the issue has
greatly decreased though. We have had it twice in about a month.
Threaddump:
{noformat}
"Camel (camel-1) thread #4 - timer://my-timer" - Thread t@65
java.lang.Thread.State: RUNNABLE
at
org.apache.camel.support.cache.SimpleLRUCache$OperationContext.close(SimpleLRUCache.java:309)
at
org.apache.camel.support.cache.SimpleLRUCache.put(SimpleLRUCache.java:104)
at
org.apache.camel.support.cache.SimpleSoftCache.put(SimpleSoftCache.java:114)
at
org.apache.camel.component.bean.BeanComponent.addBeanInfoToCache(BeanComponent.java:96)
at org.apache.camel.component.bean.BeanInfo.<init>(BeanInfo.java:169)
at
org.apache.camel.component.bean.ConstantBeanHolder.<init>(ConstantBeanHolder.java:50)
at
org.apache.camel.language.bean.BeanExpression.createBeanHolder(BeanExpression.java:303)
at
org.apache.camel.language.bean.BeanExpression.init(BeanExpression.java:175)
at
org.apache.camel.language.bean.BeanLanguage.createExpression(BeanLanguage.java:148)
at
org.apache.camel.language.simple.SimpleExpressionBuilder$KeyedOgnlExpressionAdapter.evaluate(SimpleExpressionBuilder.java:1251)
at
org.apache.camel.support.ExpressionAdapter.evaluate(ExpressionAdapter.java:45)
at
org.apache.camel.support.builder.ExpressionBuilder$62.evaluate(ExpressionBuilder.java:2105)
at
org.apache.camel.support.ExpressionAdapter.evaluate(ExpressionAdapter.java:45)
at org.apache.camel.processor.LogProcessor.process(LogProcessor.java:71)
at
org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$RedeliveryTask.doRun(RedeliveryErrorHandler.java:808)
at
org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$RedeliveryTask.run(RedeliveryErrorHandler.java:714)
at
org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.executeFromQueue(DefaultReactiveExecutor.java:240)
at
org.apache.camel.impl.engine.DefaultReactiveExecutor.executeFromQueue(DefaultReactiveExecutor.java:77)
at
org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.await(DefaultAsyncProcessorAwaitManager.java:95)
at
org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.process(DefaultAsyncProcessorAwaitManager.java:84)
at
org.apache.camel.processor.errorhandler.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:178)
at
org.apache.camel.impl.engine.CamelInternalProcessor.processTransacted(CamelInternalProcessor.java:390)
at
org.apache.camel.impl.engine.CamelInternalProcessor.process(CamelInternalProcessor.java:320)
at org.apache.camel.processor.Pipeline$PipelineTask.run(Pipeline.java:102)
at
org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.executeFromQueue(DefaultReactiveExecutor.java:240)
at
org.apache.camel.impl.engine.DefaultReactiveExecutor.executeFromQueue(DefaultReactiveExecutor.java:77)
at
org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.await(DefaultAsyncProcessorAwaitManager.java:95)
at
org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.process(DefaultAsyncProcessorAwaitManager.java:84)
at
org.apache.camel.support.AsyncProcessorSupport.process(AsyncProcessorSupport.java:32)
at
org.apache.camel.impl.engine.CamelInternalProcessor.processTransacted(CamelInternalProcessor.java:390)
at
org.apache.camel.impl.engine.CamelInternalProcessor.process(CamelInternalProcessor.java:320)
at
org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:102)
at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:208)
at
org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$RedeliveryTask.doRun(RedeliveryErrorHandler.java:808)
at
org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$RedeliveryTask.run(RedeliveryErrorHandler.java:714)
at
org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.executeFromQueue(DefaultReactiveExecutor.java:240)
at
org.apache.camel.impl.engine.DefaultReactiveExecutor.executeFromQueue(DefaultReactiveExecutor.java:77)
at
org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.await(DefaultAsyncProcessorAwaitManager.java:95)
at
org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.process(DefaultAsyncProcessorAwaitManager.java:84)
at
org.apache.camel.processor.errorhandler.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:178)
at
org.apache.camel.impl.engine.CamelInternalProcessor.processTransacted(CamelInternalProcessor.java:390)
at
org.apache.camel.impl.engine.CamelInternalProcessor.process(CamelInternalProcessor.java:320)
at org.apache.camel.processor.Pipeline$PipelineTask.run(Pipeline.java:102)
at
org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.executeFromQueue(DefaultReactiveExecutor.java:240)
at
org.apache.camel.impl.engine.DefaultReactiveExecutor.executeFromQueue(DefaultReactiveExecutor.java:77)
at
org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.await(DefaultAsyncProcessorAwaitManager.java:95)
at
org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.process(DefaultAsyncProcessorAwaitManager.java:84)
at
org.apache.camel.processor.errorhandler.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:178)
at
org.apache.camel.impl.engine.CamelInternalProcessor.processTransacted(CamelInternalProcessor.java:390)
at
org.apache.camel.impl.engine.CamelInternalProcessor.process(CamelInternalProcessor.java:320)
at org.apache.camel.processor.Pipeline$PipelineTask.run(Pipeline.java:102)
at
org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.executeFromQueue(DefaultReactiveExecutor.java:240)
at
org.apache.camel.impl.engine.DefaultReactiveExecutor.executeFromQueue(DefaultReactiveExecutor.java:77)
at
org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.await(DefaultAsyncProcessorAwaitManager.java:95)
at
org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.process(DefaultAsyncProcessorAwaitManager.java:84)
at
org.apache.camel.spring.spi.TransactionErrorHandler.processByErrorHandler(TransactionErrorHandler.java:244)
at
org.apache.camel.spring.spi.TransactionErrorHandler.process(TransactionErrorHandler.java:119)
at
org.apache.camel.spring.spi.TransactionErrorHandler.process(TransactionErrorHandler.java:132)
at
org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$RedeliveryTask.doRun(RedeliveryErrorHandler.java:808)
at
org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$RedeliveryTask.run(RedeliveryErrorHandler.java:714)
at
org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.executeFromQueue(DefaultReactiveExecutor.java:240)
at
org.apache.camel.impl.engine.DefaultReactiveExecutor.executeFromQueue(DefaultReactiveExecutor.java:77)
at
org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.await(DefaultAsyncProcessorAwaitManager.java:95)
at
org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.process(DefaultAsyncProcessorAwaitManager.java:84)
at
org.apache.camel.spring.spi.TransactionErrorHandler.processByErrorHandler(TransactionErrorHandler.java:244)
at
org.apache.camel.spring.spi.TransactionErrorHandler$1.doInTransactionWithoutResult(TransactionErrorHandler.java:207)
at
org.springframework.transaction.support.TransactionCallbackWithoutResult.doInTransaction(TransactionCallbackWithoutResult.java:36)
at
org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)
at
org.apache.camel.spring.spi.TransactionErrorHandler.doInTransactionTemplate(TransactionErrorHandler.java:200)
at
org.apache.camel.spring.spi.TransactionErrorHandler.processInTransaction(TransactionErrorHandler.java:155)
at
org.apache.camel.spring.spi.TransactionErrorHandler.process(TransactionErrorHandler.java:123)
at
org.apache.camel.spring.spi.TransactionErrorHandler.process(TransactionErrorHandler.java:132)
at
org.apache.camel.impl.engine.CamelInternalProcessor.processNonTransacted(CamelInternalProcessor.java:347)
at
org.apache.camel.impl.engine.CamelInternalProcessor.process(CamelInternalProcessor.java:323)
at org.apache.camel.processor.Pipeline$PipelineTask.run(Pipeline.java:102)
at
org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.doRun(DefaultReactiveExecutor.java:199)
at
org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.executeReactiveWork(DefaultReactiveExecutor.java:189)
at
org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.tryExecuteReactiveWork(DefaultReactiveExecutor.java:166)
at
org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:148)
at
org.apache.camel.impl.engine.DefaultReactiveExecutor.scheduleMain(DefaultReactiveExecutor.java:59)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:163)
at
org.apache.camel.impl.engine.CamelInternalProcessor.processNonTransacted(CamelInternalProcessor.java:347)
at
org.apache.camel.impl.engine.CamelInternalProcessor.process(CamelInternalProcessor.java:323)
at
org.apache.camel.component.timer.TimerConsumer.sendTimerExchange(TimerConsumer.java:293)
at
org.apache.camel.component.timer.TimerConsumer$1.doRun(TimerConsumer.java:164)
at
org.apache.camel.component.timer.TimerConsumer$1.run(TimerConsumer.java:136)
at [email protected]/java.util.TimerThread.mainLoop(Timer.java:566)
at [email protected]/java.util.TimerThread.run(Timer.java:516){noformat}
This is basically exactly the second case from my previous issue and seems to
occur in this route:
{code:java}
from(direct(getDeliverRecipientRouteId()))
.routeId(getDeliverRecipientRouteId())
.startupOrder(1)
.policy(txJmsPropagationRequiresNew)
.choice()
.when(not(isPageable))
.log(LoggingLevel.INFO, log, "--- Sending data message to
queue=" + getRecipientQueueName())
.when(currentStatusIs(StockRequestStatus.DATA))
.log(LoggingLevel.INFO, log, "--- Sending data message for
page=${exchangeProperty."
+ Exchange.LOOP_INDEX + "} to queue=" +
getRecipientQueueName())
.otherwise()
.log(LoggingLevel.INFO, log, "--- Sending control message for
status=${exchangeProperty."
+ PROPERTY_REQUEST + ".status} to queue=" +
getRecipientQueueName())
.end()
.convertBodyTo(String.class)
.to(getJmsUriToRecipientQueue()); {code}
Regarding [~davsclaus]'s question in the last issue (which apparently I have
overseen):
The bean referenced via PROPERTY_REQUEST looks something like this:
{code:java}
@Data
@RequiredArgsConstructor
public class MyRequest implements BaseRequest<Long, MyRequestDataType> {
public static final String COLUMN_FROM_REVISION = "FROM_REVISION";
public static final String COLUMN_TO_REVISION = "TO_REVISION";
private Long id;
private RequestStatus status;
private RequestDataType dataType;
private Instant timestamp;
private Long fromRevision;
private Long toRevision;
private String errorMessage;
}{code}
// the implemented interface
{code:java}
public interface BaseRequest<ID, D extends RequestDataType> extends
Serializable {
String COLUMN_ID = "ID";
String COLUMN_STATUS = "STATUS";
String COLUMN_DATATYPE = "DATATYPE";
String COLUMN_FROM = "\"FROM\"";
String COLUMN_TO = "\"TO\"";
String COLUMN_TIMESTAMP = "\"TIMESTAMP\"";
String COLUMN_ERROR_MESSAGE = "ERROR_MESSAGE";
ID getId();
void setId(ID id);
RequestStatus getStatus();
void setStatus(RequestStatus status);
D getDataType();
void setDataType(D dataType);
default Instant getFrom() {
return null;
}
default void setFrom(Instant from) {
// noop
}
default Instant getTo() {
return null;
}
default void setTo(Instant to) {
// noop
}
Instant getTimestamp();
void setTimestamp(Instant instant);
String getErrorMessage();
void setErrorMessage(String errorMessage);
default Map<String, Object> toMap(Exchange exchange) {
Map<String, Object> map = new LinkedHashMap<>();
map.put("id", getId());
map.put("status", getStatus());
map.put("dataType", getDataType().getName());
if (getDataType().isDeltaDeliverable()) {
map.put("from", getFrom().toString());
map.put("to", getTo().toString());
}
map.put("timestamp", getTimestamp().toString());
map.put("errorMessage", getErrorMessage());
return map;
}
} {code}
Are the classes of the contained fields (RequestStatus, RequestDataType) also
relevant for your question?
Regarding clear steps to reproduce, I am unsure whether I can provide. The
issue appeared twice in a month within thousands of invocations of the timer
route and the constellation causing it is not clear to me.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)