【问题标题】:Mule FailedToQueueEventException Quartz connectionMule FailedToQueueEventException 石英连接
【发布时间】:2020-04-11 02:57:39
【问题描述】:

我有以下石英入站组件来触发 kafka 事件。但它似乎正在抛出 SEDA queue Exception。

<quartz:connector name="myQuartzConnector" validateConnections="true">
    <receiver-threading-profile maxThreadsActive="1"/>
</quartz:connector>

<flow name="quartz-scheduler-kafka-consumer-trigger-flow">
    <quartz:inbound-endpoint jobName="Trigger-Kafka-Consumer-Quartz-Job" repeatInterval="1" responseTimeout="10000" connector-ref="myQuartzConnector" doc:name="Quartz">
        <quartz:event-generator-job/>
    </quartz:inbound-endpoint>
    <component class="org.my.myKafkaCOnsumer" doc:name="Java KafkaConsumer"/>
</flow>

Quartz 用于触发 Kafka 消费流。直到 Kafka 消费者连接在 Java 组件中结束,控制才会返回到调度程序。 Kafka 消费者连接永远不会结束,因为它处于递归 while(true) 循环中。碰巧,如果 Kafka 连接结束,quartz 调度程序应该重新触发重新打开 kafka 连接的 java 组件。

Message               : The queue for 'SEDA Stage quartz-scheduler-kafka-consumer-trigger-flow.stage1' did not accept new event within 30000 MILLISECONDS.
Payload               : {NullPayload}
Payload Type          : org.mule.transport.NullPayload
Element               : null @ message-gateway-profile-update-api:null:null
--------------------------------------------------------------------------------
Root Exception stack trace:
org.mule.api.service.FailedToQueueEventException: The queue for 'SEDA Stage quartz-scheduler-kafka-consumer-trigger-flow.stage1' did not accept new event within 30000 MILLISECONDS.
    at org.mule.processor.SedaStageInterceptingMessageProcessor.enqueue(SedaStageInterceptingMessageProcessor.java:139)
    at org.mule.processor.SedaStageInterceptingMessageProcessor.processNextAsync(SedaStageInterceptingMessageProcessor.java:102)
    at org.mule.processor.AsyncInterceptingMessageProcessor.process(AsyncInterceptingMessageProcessor.java:103)
    at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:27)

Flow snapshot

【问题讨论】:

    标签: mule mule-component mule-esb


    【解决方案1】:

    该错误是因为 Quartz 端点设置为触发速度快于流处理消息的速度。此流具有默认处理策略queued-asynchronous, which means that the events triggered by the Quartz endpoint are sent to a SEDA queue,然后由流线程在可用时进行处理。 Quartz 端点设置为每 1 ms 重复一次,这是非常低的。在那段时间处理组件的机会很小。当流使用的线程池耗尽时,SEDA 队列开始被填满。当队列中的元素超过默认超时以获取线程执行时,您会收到错误消息。 KB https://help.mulesoft.com/s/article/Error-The-queue-for-SEDA-queue-name-did-not-accept-new-event-within-30000-MILLISECONDS

    中描述了此问题

    您可以将流处理策略更改为同步以重用来自连接器的队列来执行并避免排队,但repeatInterval 似乎不切实际地小。

    附带说明,Quartz connector 很久以前就已被弃用。它已被Poll scope 取代。

    【讨论】:

      【解决方案2】:

      控制不会返回到计划中

      这是不正确的说法。调度程序不知道之前的流程是如何结束的。事实上,旧流程继续执行,新流程的事件开始。 如果您将 logger 作为调度程序之后的第一个组件放在流的开头,您可以看到它。

      实际上,由于您正在收听消息,因此它应该不是调度程序。侦听器应该是流的源头。它应该是这样的:

      <flow name="quartz-scheduler-kafka-consumer-trigger-flow">
          <component class="org.my.myKafkaCOnsumer" doc:name="Java KafkaConsumer"/>
      </flow>
      

      这里有更多关于多个时间表https://simpleflatservice.com/mule4/Multipleschedules.html

      【讨论】:

      • 是的,你是对的。我收回那个特定的陈述。但我不想看到这个超时异常。在这种情况下,任何帮助都会很有用。由于防火墙问题,我现在无法打开您提供的链接。
      • 什么超时异常?我没有看到。如果您正在谈论收听消息并超时......它不应该是这样的。侦听器应该是流的来源而不是调度器。我已经更新了我的答案。
      • 我的项目使用 Mule 3+ 并且没有升级到 Mule 4 的可能性。Mule 3 中支持的 Kafka 侦听器不提供手动偏移提交的方法。我想完全控制提交,因此使用 java 组件来轮询 kafka。 java层打开Kafka连接后,会进入递归while(true)循环,轮询kafka并将记录传递给子流处理。 Quartz 用于启动 api 部署流程。如果连接在 java 组件中结束,则应重新触发 java。此重新触发将不是基于时间的。请问还有其他组件可以实现吗?
      • 听起来不错的设计。我会做同样的事情。但是由于您在石英调度程序中遇到了这个问题(并且您实际上并没有使用它),那么您应该仔细检查它的设置。我可以推荐 start delay=0 和间隔 1,000,000 个月吗?在这种情况下,调度程序将只运行一次,您将完全控制 Java 组件。顺便说一句 - 单独的调度程序流程和执行流程。在这种情况下,问题将很清楚它属于哪里。我还会仔细检查在您的情况下如何重新触发。之后所有的问题都是连接太多 - 找到它们在哪里。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-12
      • 1970-01-01
      • 2012-11-04
      • 2012-07-18
      相关资源
      最近更新 更多