我想使用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
附加到队列网址。但那没用。
答案 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>");