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");