[ https://issues.apache.org/jira/browse/CAMEL-21614?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17913357#comment-17913357 ]
Jannik Schmeier commented on CAMEL-21614: ----------------------------------------- Thanks, I will deploy by the end of this week and let you know next week if anything popped up. > 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 > Assignee: Nicolas Filotto > Priority: Major > Fix For: 4.8.4, 4.10.0 > > > 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 java.base@21.0.2/java.util.TimerThread.mainLoop(Timer.java:566) > at java.base@21.0.2/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)