Could not find an outbound channel adapter for channel outboundChannel

I have a few processes that use [Send event task] elements. Most of these processes work as intended, but those which start with a timer event tend to fail. These processes generally look something like this:

image

Timer jobs get started, but an Event Task fails most of the time. Then it retries twice, sometimes successfully, sometimes not.

The same thing happens when there is a User Task.
image
There is a form attached to the User task, users fill it in, then click on the button Complete. In most times the following Event Task fails and retries twice.

This never happens if there is no timer or User Task before the event task, i.e., Start event or Start signal event are used.

The error:

org.flowable.common.engine.api.FlowableException: Could not find an outbound channel adapter for channel outboundChannel
	at org.flowable.eventregistry.impl.DefaultOutboundEventProcessor.sendEvent(DefaultOutboundEventProcessor.java:54)
	at org.flowable.eventregistry.impl.DefaultEventRegistry.sendEventOutbound(DefaultEventRegistry.java:87)
	at org.flowable.engine.impl.bpmn.behavior.SendEventTaskActivityBehavior.execute(SendEventTaskActivityBehavior.java:111)
	at org.flowable.engine.impl.jobexecutor.AsyncSendEventJobHandler.execute(AsyncSendEventJobHandler.java:52)
	at org.flowable.job.service.impl.asyncexecutor.DefaultJobManager.executeJobHandler(DefaultJobManager.java:542)
	at org.flowable.job.service.impl.asyncexecutor.DefaultJobManager.executeMessageJob(DefaultJobManager.java:470)
	at org.flowable.job.service.impl.asyncexecutor.DefaultJobManager.execute(DefaultJobManager.java:308)
	at org.flowable.job.service.impl.cmd.ExecuteAsyncRunnableJobCmd.execute(ExecuteAsyncRunnableJobCmd.java:85)
	at org.flowable.job.service.impl.asyncexecutor.ExecuteAsyncRunnable$2.execute(ExecuteAsyncRunnable.java:130)
	at org.flowable.job.service.impl.asyncexecutor.ExecuteAsyncRunnable$2.execute(ExecuteAsyncRunnable.java:127)
	at org.flowable.engine.impl.interceptor.CommandInvoker$1.run(CommandInvoker.java:59)
	at org.flowable.engine.impl.interceptor.CommandInvoker.executeOperation(CommandInvoker.java:107)
	at org.flowable.engine.impl.interceptor.CommandInvoker.executeOperations(CommandInvoker.java:81)
	at org.flowable.engine.impl.interceptor.CommandInvoker.execute(CommandInvoker.java:64)
	at org.flowable.engine.impl.interceptor.BpmnOverrideContextInterceptor.execute(BpmnOverrideContextInterceptor.java:26)
	at org.flowable.common.engine.impl.interceptor.TransactionContextInterceptor.execute(TransactionContextInterceptor.java:53)
	at org.flowable.common.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:83)
	at org.flowable.common.spring.SpringTransactionInterceptor.lambda$execute$0(SpringTransactionInterceptor.java:57)
	at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)
	at org.flowable.common.spring.SpringTransactionInterceptor.execute(SpringTransactionInterceptor.java:57)
	at org.flowable.common.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:30)
	at org.flowable.common.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:56)
	at org.flowable.common.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:51)
	at org.flowable.job.service.impl.asyncexecutor.ExecuteAsyncRunnable.executeJob(ExecuteAsyncRunnable.java:127)
	at org.flowable.job.service.impl.asyncexecutor.ExecuteAsyncRunnable.run(ExecuteAsyncRunnable.java:115)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)

I use flowable 6.6.0, which is built as a Spring Boot application.

There is only one outbound channel, it is used by all my processes(those which have this problem and those which do not). The channel looks like this:

{
  "key": "outboundChannel",
  "category": "channel",
  "name": "outboundChannel",
  "description": "Outbound channel",
  "channelType": "outbound",
  "type": "rabbit",
  "serializerType": "json",
  "routingKey":"WorkerQueue"
}

Its location: …\src\main\resources\eventregistry\

Also, all of these processes use one and the same outbound event:

{
  "key": "outboundEvent",
  "name": "outboundEvent",
  "outboundChannelKeys": [
    "outboundChannel"
  ],
  "correlationParameters": [],
  "payload": [
    {
      "name": "task",
      "type": "string"
    },
    {
      "name": "email",
      "type": "string"
    }
  ]
}

Any suggestions on what could be the root of the problem and how to fix it?

The exception is strange: it states no channel adapter is configured for the rabbitmq queue, while I can see from your config you have configured this.

When does this exception occur? Does it happen all the time when using a timer event? Or only on e.g. bootup (in which case it could be a race condition)?

@joram

When does this exception occur?

We have a few daily processes. Each day some of them get stuck with the error.

Does it happen all the time when using a timer event?

It does not happen all the time, hard to say exactly how often, but I’d say about 60-70% of the time.

Or only on e.g. bootup (in which case it could be a race condition)?

That’s probably not the case, since the engine is always up and running(with occasional restarts).