Apache camel Apache Camel路由超时

Apache camel Apache Camel路由超时,apache-camel,activemq,atomikos,Apache Camel,Activemq,Atomikos,我有两条骆驼路线,用XML配置并粘贴在下面:- 一号干线: <camel:route id="statementsArchivingPollRoute"> <camel:from uri="timer://tempQueue?fixedRate=true&amp;period=30s&amp;delay=30s"/> <camel:transacted ref="PROPAGATION_REQUIRED"> <ca

我有两条骆驼路线,用XML配置并粘贴在下面:-

一号干线:

<camel:route id="statementsArchivingPollRoute">
    <camel:from uri="timer://tempQueue?fixedRate=true&amp;period=30s&amp;delay=30s"/>
    <camel:transacted ref="PROPAGATION_REQUIRED">
    <camel:process ref="statementsArchivingRequestZipProcessor"/>
    <camel:choice>
        <camel:when>
            <camel:simple>${body.size} >= 1</camel:simple>
            <camel:split>
                <camel:simple>${body}</camel:simple>
                <camel:marshal ref="archiveFileInterfaceMetadataMapper"/>
                <camel:to pattern="InOnly"
                          uri="activemq:{{ccs.activemq.queue.prefix}}.sr.archive.bulk.ingestion.req?jmsMessageType=Text"/>
            </camel:split>
            <camel:log loggingLevel="INFO" message="Archiving content was processed"/>
        </camel:when>
        <camel:otherwise>
            <camel:log loggingLevel="INFO" message="No archiving content to process"/>
        </camel:otherwise>
    </camel:choice>
    </camel:transacted>
</camel:route>
超时会导致进程自身重复,而下游服务最终会被每条消息调用多次,而不是一次

我不明白为什么调用路由2的次数会导致它超时。我认为,对于从activemq排队的每条消息,都会启动一个路由实例。如果一条消息需要很长时间才能完成,那么我可以理解,但很明显,超时时间是基于所有消息被取消排队的累计时间


我对骆驼相当陌生,我显然从建筑的角度误解了一些东西。我将非常感谢任何关于如何阻止这些超时发生的指导。谢谢您的阅读。

乔恩,您可能需要尝试以下内容进行调查

  • 禁用/注释第二条路线。使用activemq的目的是使进程异步,这意味着第一个路由不应该由于第二个路由而产生任何影响。如果这在没有路线2的情况下有效,那么问题出在其他地方

  • 如果您发现第一个路由在没有第二个路由的情况下运行良好,那么下一步就是尝试在第二个路由中设置较少的线程数。可以放1或2个线程,看看是否有帮助。我认为这是activemq上的争用,而不是这些路由配置

  • 检查要推送到activemq的负载大小。如果您要将非常大的消息发布到activemq,这也可能会产生影响,因为项目数量很大,而且每个项目都很大,这会导致activemq中出现争用,并且事务所用的时间超过超时设置


  • 如果要将大型数据集推送到activemq,则可能需要重新查看设计。将有效负载保存在某个持久性区域(db/file/cache)中,并发送仅包含对有效负载和某些元数据的引用的通知事件。然后,第二条路由可以从事件中获取引用,并从路由1保存负载的位置检索负载。

    我不是骆驼事务的专家,但我认为您遇到了一个问题,因为您进行了一个包含您所做一切的事务。通常,当您有一个消费者并使其具有事务性时,该交易是消费者收到的每一笔交易。在此实例中,您的事务交换是每个计时器实例。它需要是事务性的吗?如果你不再做交易,它能正常工作吗?@Screwtape这是一个很好的建议,我认为你是对的。我删除了transaction标记并重试,但出现了以下错误:“AtomikosTransactionRequiredJMSException:您正在使用的JMS会话需要调用线程的JTA事务上下文,但找不到。”因此,它显然需要这样做。所以我把它放回原处,但删除了“需要传播”的参考。不幸的是,这给出了与原始帖子完全相同的行为!但我肯定认为这是一个值得关注的方向。非常感谢-我会围绕这个做更多的搜索。嗯。。。如果您的第一个路由在队列生成器上显示“InOnly”,那么我就不会期望您需要在第二个路由中完成所有内容才能在第一个路由中完成事务。我注意到您的计时器被设置为固定速率-是否您有太多记录要写入队列,以至于在下一次交换开始之前您还没有完成第一次交换?这可能是个问题。否则我就难倒了。@是的,我就是这么想的!没有,队列中只有几条记录,所以我也很困惑。但是非常感谢你的关注——你至少给了我研究的方向!:)考虑到1可以在没有2的情况下工作,我认为您需要掌握事务策略。请参阅:这意味着您遇到的问题与所需的传播完全一样,因为这将父事务扩展到目标消费者。也许您需要新的传播,或者可能不支持,这还不清楚如何从SpringXML中指定。我试过1。这已经证实,没有第二条路线,第一条路线没有问题。关于3,有效负载大小应该不是问题——它是一个简单的POJO,具有大约7个属性。我将尝试2,但我不确定如何为单个路由配置线程数。你能建议怎么做吗?我认为节流可能是根本原因。我想知道是否可以在队列本身而不是路由上配置解队列延迟。将继续调查!现在我们知道1号公路本身是可以的,你可以单独运行2号公路。第一次注释路由2,以便将消息推送到队列中。然后重新启动,路线2打开,路线1已注释。如果你看到超时,那么你已经缩小了范围。查看activemq组件的camel文档,您将发现一些有趣的设置选项。还可以试着拆下油门。可能是因为它阻塞了线程并导致Atomikos超时。将暂停/限制放在ot事务边界之外而不是在事务块中使用是有意义的。这些都是很好的建议。所以我把路线2注释掉,路线1运行良好。我将路线1注释掉,重新激活路线2并重新启动。路由2开始将消息出列,我仍然看到超时消息。所以我现在知道问题出在2号公路上,谢谢你带我到那里。我觉得一定是油门开了。但如果我拆下油门,几乎肯定会导致下游出现问题。我将不得不重新考虑设计,或者尝试找到另一种方式来限制信息。欢迎您提供更多建议:)尝试移出if事务范围。它不应位于transact块内。想想别的办法
    <camel:route id="statementsArchivingBulkIngestionRequestRoute">
        <camel:from uri="activemq:{{ccs.activemq.queue.prefix}}.sr.archive.bulk.ingestion.req"/>
        <camel:throttle timePeriodMillis="4000">
        <camel:constant>1</camel:constant>
        <camel:setExchangePattern pattern="InOnly"/>
        <camel:unmarshal ref="archiveFileInterfaceMetadataMapper"/>
        <camel:bean ref="archiveFileEntryTransformer" method="transform"/>
        <camel:setHeader headerName="CamelHttpMethod">
            <camel:constant>POST</camel:constant>
        </camel:setHeader>
        <camel:toD uri="{{ccs.bulk.ingestion.service.ingest.archive.file}}"/>
        </camel:throttle>
    </camel:route>
    
    Atomikos:12] c.a.icatch.imp.ActiveStateHandler        : Timeout/setRollbackOnly of ACTIVE coordinator !