Apache camel 具有异步处理的Camel Reslet组件
我的要求如下:Apache camel 具有异步处理的Camel Reslet组件,apache-camel,Apache Camel,我的要求如下: 接受包含XML的HTTP POST请求到特定URL 执行必要的操作,例如将请求XML保存到文件中 验证传入的XML是否与相应的架构匹配 如果模式验证失败,则使用HTTP 400响应代码同步响应 如果模式验证通过,则使用HTTP 200响应代码同步响应 传递XML消息以进行进一步处理 当此进一步处理完成时,使用HTTP 200响应代码异步响应调用方 这是我当前配置路由的方式: onException(IOException.class)
- 接受包含XML的HTTP POST请求到特定URL
- 执行必要的操作,例如将请求XML保存到文件中
- 验证传入的XML是否与相应的架构匹配
- 如果模式验证失败,则使用HTTP 400响应代码同步响应
- 如果模式验证通过,则使用HTTP 200响应代码同步响应
- 传递XML消息以进行进一步处理
- 当此进一步处理完成时,使用HTTP 200响应代码异步响应调用方
onException(IOException.class)
.log(LoggingLevel.INFO, "Schema validation error on incoming message: ${id}")
.handled(true)
.maximumRedeliveries(0)
.process(schemaValidationErrorProcessor);
from("restlet:http://localhost:" + portNum + "/api/XX/XXX?restletMethod=POST")
.log(LoggingLevel.INFO, "Received message")
.convertBodyTo(String.class)
.multicast()
.parallelProcessing()
.to(SAVE_REQUEST_TO_FILE_QUEUE, PROCESS_PROVISIONING_REQUEST_QUEUE);
from(SAVE_REQUEST_TO_FILE_QUEUE)
.log(LoggingLevel.INFO, "Storing message: ${id}")
.to("file://" + requestLogFolder);
from(PROCESS_PROVISIONING_REQUEST_QUEUE)
.log(LoggingLevel.INFO, "Processing provisioning request: ${id}")
.process(requestGate)
.choice()
.when(header(SYSTEM_STATUS_HEADER).isEqualTo(true))
.unmarshal(xmlParser)
.inOnly("bean:requestHandler?method=handle")
.when(header(SYSTEM_STATUS_HEADER).isEqualTo(false))
.log(LoggingLevel.INFO, "Intentially dropping message")
.endChoice();
模式验证部分是通过.unmarshal(xmlParser)行实现的(我在别处配置了一个JaxbDataFormat对象,其中设置了模式)。当模式验证失败时,将抛出一个IOException,并由我的schemaValidationErrorProcessor处理,该处理器将HTTP 400添加到响应中
这一切都很好
我遇到的问题是传递XML消息以进行进一步处理。基本上,我需要异步完成这项工作,因为当模式验证通过时,我需要以200响应同步响应。我需要做的处理在.inoOnly(“bean:requestHandler?method=handle”)行中
我天真地认为,将bean的路由设置为inOnly会将其设置为异步,并且主路由不会等待响应。然而,当requestHandler.handle方法抛出异常时,情况并非如此,异常会被抛出回REST端点的调用方。我不希望发生这种情况,因为我希望所有这些处理都在“后台”完成,因为消费者已经收到200条回复
因此,我的问题是,我将如何实现这种行为?我曾考虑过使用队列等,但如果可能的话,我希望避免使用此类组件。使用Camel-Websocket组件异步响应调用方 从:
你是说你响应了两次,一次同步,一次异步,这在最好的情况下是奇怪的,在最坏的情况下是不可能的。您可以使用WebSocket之类的东西或类似于抽象的氛围将消息不断推送到客户机,但所有消息都是异步的(在您的情况下,这可能是一件好事)。要获得Camel中的异步行为,请参见:它们是我们的业务需求。客户希望得到一个同步响应,以表明我们已成功接收到他们的消息,并且当我们成功处理消息时,他们希望得到一个异步回调。
from("activemq:topic:newsTopic")
.routeId("fromJMStoWebSocket")
.to("websocket://localhost:8443/newsTopic?sendToAll=true&staticResources=classpath:webapp");