2017-06-22 75 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 

      } 
     });