Java 使用rest和MQ的驼峰路由触发序列

Java 使用rest和MQ的驼峰路由触发序列,java,rest,apache-camel,ibm-mq,spring-bean,Java,Rest,Apache Camel,Ibm Mq,Spring Bean,我已经公开了一个rest端点,希望按照以下步骤处理输入请求: 从rest调用获取消息 验证消息(restRequestValidationProcessor) 已向呼叫方应用发送确认响应(rest呼叫发起方使用bean:restCallResponserService) 将原始消息发送到mq进行处理(ref:mqueendpoint) 一旦消息进入mq,另一条路由就会触发消息处理 目前正在以以下方式进行尝试: <restConfiguration component="servlet" b

我已经公开了一个rest端点,希望按照以下步骤处理输入请求:

  • 从rest调用获取消息
  • 验证消息(
    restRequestValidationProcessor
  • 已向呼叫方应用发送确认响应(rest呼叫发起方使用
    bean:restCallResponserService
  • 将原始消息发送到mq进行处理(
    ref:mqueendpoint
  • 一旦消息进入mq,另一条路由就会触发消息处理
  • 目前正在以以下方式进行尝试:

    <restConfiguration component="servlet" bindingMode="off">
    <rest path="/">
     <post uri="/messages" >
     <to uri="direct:handleRestCall" />
     </post>
    </rest>
    
    <route>
    <from uri="direct:handleRestCall" />
      <process ref="restRequestValidationProcessor" />
        <to uri="ref:mqueueEndpoint" />
        <to uri="bean:restCallResponserService?method=generateSuccessResponse"/>
        <onException>
        <exception>java.lang.Exception</exception>
         <handled>
         <constant>true</constant>
         </handled>
          <process ref="exceptionProcessor"></process>
        </onException>
    </route>
    
    <route>
     <from uri="ref:csQueueEndpoint" />
      <process ref="msgProcessor"></process>
    </route>
    
    
    java.lang.Exception
    真的
    
    问题是——客户端应用程序(SOAPUI)等待的时间比需要的时间要长。我希望客户端不等待实际的消息处理,但它看起来消息已经开始处理,客户端并没有得到确认。在我看来,由于MQ处理是异步的,所以在队列处理路由(下面代码段中的第二个路由)之前,
    restCallResponser()
    应该触发,客户端将得到响应,后台队列路由将执行。。使用下面的配置不会发生这种情况


    有人能建议如何实现吗?

    由于路由也是并行运行的,所以无法确保客户端在消息处理开始或完成之前有响应


    需要调查generateSuccessResponse的延迟响应。在方法中记录开始和结束的时间,并查看其中的延迟在哪里。

    generateSuccessResponse除了一个字符串“message received”(消息已接收)用于确认和在exchange正文中设置外,没有其他内容。有多种实现方法。取决于您的应用程序。最简单的方法是在
    code
    code
    的第一行中设置延迟。如果不能接受,请考虑这两条路由之间的同步。您可以定义一个同步映射,并在第一条路由的末尾将消息放入其中。在第二条路由中,启动的进程接收传入消息并在映射中查找该消息。如果未找到,请稍等片刻,然后反复尝试,直到找到并处理。然后从映射中删除消息。