2017-06-22 70 views
0

我有一个Spring-Boot/Camel微服务,它通过Restful POST接受带有各种头部参数(1)的XML,通过存储在类路径(2)上的静态xQuery文件转换XML,然后基于结果的值检索使用SQL的关系数据库中的一组XSL模板(3)。然后使用xQuery(4)对这些模板进行转换和组装,然后在将POST方法中的原始转换后的XML在发送到外部服务(6)之前使用转换/组装的XSL模板(5)进行转换。在Camel Spring-Boot微服务中实现静态缓存?

通过将各种步骤的主体存储为交换属性,包括使用处理器从数据库中获取静态XSL模板,现在可以完成所有这些工作。交换属性可以从我的xQuery访问,所以一切都很好。在各个步骤中,我还用临时存储为交换属性的值替换主体。这一切似乎对我来说很笨拙......

我真正的问题是什么是在应用程序启动过程中缓存所有XSL模板的最佳方式,以便后续调用数据库是不必要的?它们是静态的,数量少于10个。我只是想将它们存储在启动时执行的路径中的处理器的经典​​单例中,然后使用步骤3中使用的处理器访问它们以将交换变量设置为我需要的模板。有没有更好的方法来做到这一点?

回答

0

我选择做一个Spring bean来握住我的XSL模板,然后在我的RouteBuilder类这样做,所以它会在启动时高速缓存的模板,使它们对其他途径访问:

@Autowired 
XSLTemplates xslTemplates; 

@Override 
public void configure() throws Exception { 
    // get the templates from the database upon app startup and store 
    from("timer://mytimer?repeatCount=1") 
     .to("sql:select ID, XSL_TEMPLATE from table").split() 
     .simple("${body}") 
     .process(new Processor() { 
      public void process(Exchange exchange) throws Exception { 
       Map<String, Object> row = exchange.getIn().getBody(Map.class); 
       if (row.get("ID").toString().equals("fooTemplate")) { 
        xslTemplates.setFooTemplate(row.get("XSL_TEMPLATE).toString()); 
       } else... everything else 

      } 
     });