使用驼峰休息服务触发长时间操作

时间:2016-11-08 14:22:20

标签: apache-camel activemq jbossfuse

我想使用camel rest调用触发一个长操作。由于操作需要大量时间,因此请求将超时并在客户端显示错误消息。我不希望这种情况发生。

所以,我试图使用队列解决这个问题,如下所示:

<bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
   <property name="brokerURL" value="tcp://0.0.0.0:61616" />
   <property name="userName" value="admin"/>
   <property name="password" value="admin"/>
</bean>

<camelContext xmlns="http://camel.apache.org/schema/blueprint" trace="true">
    <route>
        <from uri="cxfrs:bean:rsprovider" />
        <setBody>
             <simple>${header.operationName}</simple>
        </setBody>
        <to uri="activemq:queue:myqueue"/>
        <!-- Send immediate response to client as, the processing will take a while -->
        <setBody>
            <simple>Received feeder service request to ${header.operationName}. Request will be processed soon.</simple>
        </setBody>
    </route>

    <route>
      <from uri="activemq:queue:myqueue"/>
      <convertBodyTo type="java.lang.String"/>
      <recipientList>
            <simple>direct-vm:operation-${body}</simple>
        </recipientList>
    </route>
</camelContext>

但是,似乎添加到队列是同步的,并且没有按时收到响应。如何使此队列异步?我尝试将?jms.useAsyncSend=true附加到队列网址。但那没用。

1 个答案:

答案 0 :(得分:0)

您应该尝试asyncConsumer

 <from uri="activemq:queue:myqueue?asyncConsumer=true"/>
  

Camel 2.9:JmsConsumer是否处理Exchange   异步。如果启用,则JmsConsumer可以拾取下一个   来自JMS队列的消息,而前一条消息正在   异步处理(由异步路由引擎)。这个   表示消息可能不是100%严格按顺序处理。如果   禁用(默认情况下),然后Exchange完全处理   JmsConsumer将从JMS队列中拾取下一条消息。注意:如果   已启用事务处理,然后asyncConsumer=true无法运行   异步,因为事务必须同步执行(Camel   3.0可能支持异步事务。)

同时检查异步请求回复API

http://camel.apache.org/async.html

Future<Object> future = template.asyncRequestBody("activemq:queue:myqueue", "<YOUR_MESSAGE>");