[ 
https://issues.apache.org/jira/browse/CAMEL-21614?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Nicolas Filotto reassigned CAMEL-21614:
---------------------------------------

    Assignee: Nicolas Filotto

> 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
>
> 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)

Reply via email to