使用文件端点时如何将值存储到某些持久对象中

时间:2019-06-24 05:33:44

标签: rest spring-boot apache-camel spring-camel

由于属性和标头在File端点中不可用,因此我不确定如何将值存储到某些持久对象中以便在度量处理器中进行检索/使用。

使用Spring Boot 2.0.3下的Camel Core 2.22.1,Spring Boot启动程序2.22.1,我构建了一个处理器,可以解析文件中的指标,但是无法访问属性或属性中的计时器(或任何值)标头。我可以以内联方式或以拦截方式触发处理器,它将执行但会尝试从标头或道具中获取值时抛出错误(现在我知道为什么)

RouteBuilder.java

    @Override
    public void configure() throws Exception {
        from("file:func/input")
        .unmarshal().json(JsonLibrary.Jackson, Options.class)
        .process(optionsToHeaders)
        .process(functionEngineProcessor)
        .to("file:func/output?tempPrefix=.inprogress/");        

FileReceiverRouteBuilder.java

    @Override
    public void configure() throws Exception {
        rest("/func")
            .post("/process")
            .consumes(MediaType.TEXT_PLAIN_VALUE)
            .route().routeId("func-upload-route")
            .setHeader(Exchange.FILE_NAME, () -> UUID.randomUUID().toString())  // use a UUID for inprocess filename
            .to("file:uploads")
            .setBody((ex) -> buildOptions(ex))   // appends  json as function.options
            .marshal().json(JsonLibrary.Jackson, true)
            .log(LoggingLevel.INFO, "function.options: ${in.body}")
            .to("file:func/input")
            .setBody((ex) -> new ProcessResponse((String) ex.getIn().getHeader(Exchange.FILE_NAME)))
            .marshal().json(JsonLibrary.Jackson, true);

        rest("/func")
            .get("status/{token}")
            .route().routeId("get-generated-func-file")
            .choice()
                .when((ex) -> Paths.get("function/output", (String) ex.getIn().getHeader("token")).toFile().exists())
                    .to("direct:func-return-file-content")
                .otherwise()
                    .setHeader(Exchange.HTTP_RESPONSE_CODE, constant("202"));    /// send 202 until file complete

        from("direct:func-return-file-content")
            .log("returning file content")
            .setBody((ex) -> Paths.get("func/output", (String) ex.getIn().getHeader("token")).toFile())
            .setHeader(Exchange.CONTENT_TYPE, constant(MediaType.TEXT_PLAIN_VALUE));

OptionsToHeadersProcessor将文件名和Config选项放入json。

public class OptionsToHeadersProcessor implements Processor{

    public static final String PROCESS_PROFILE = "PROCESS_PROFILE";
    public static final String FILE_NAME = "FILE_NAME";

    @Override
    public void process(Exchange exchange) throws Exception {
        Options options = exchange.getIn().getBody(Options.class);
        exchange.getIn().setHeader(FILE_NAME, options.getInputFile());
        exchange.getIn().setHeader(PROCESS_PROFILE, options.getConfiguration());  //as header

    }

处理正常,文件正在返回等。我们让log4j为服务执行日志附加(rollingfile),

但是,我们现在想通过生成有关每个已处理文件的统计数据集来进行增强。 统计信息必须包括:-  进程开始时间,结束时间和持续时间,  一个或多个方法计时-也开始,结束持续时间(从主函数EngineProcessor内部)  总共有关输入文件组成的数据(例如字节/行),以及文件中特定部分的数据。

在将它们发送到文件中之前,我们还需要将所有这些统计信息编译成一个(json)文本捆绑包,作为json的一行。

这最后一个要求引起最多的问题;我认为您可以看到,如果我需要将开始时间,结束时间和持续时间放在一起以记录它们(即使使用log4j), 我需要在处理器之间保留开始时间值,以便统计处理器可以计算最终的结束时间和持续时间。

我尝试在FileReceiverRouteBuilder.java中第一个端点定义之前使用拦截器:

        interceptSendToEndpoint("direct:func*")
        .log(LoggingLevel.INFO, "intercepted sendto output for metrics")
        .process(metricsProcessor);

但是,度量标准处理器无法从标头(甚至是PROCESS_PROFILE或FILE_NAME)中检索不到任何内容,因为文件端点显然不保留属性或标头。
“令牌”是可检索的,但这与客户端REST签名相关,我无法在没有太多干扰的情况下扩展它。

因此,由于属性和标头不可用,因此我不确定如何将值存储到某个持久对象中以便在度量处理器中进行检索/使用。 我当前的阅读似乎暗示JMS是实现此目标的一种方法?我是骆驼等的新手,我想看看是否缺少明显的东西。

任何帮助,不胜感激!

0 个答案:

没有答案