天天看點

Velocity緩存與穿透(轉)parse($tool.getPath(xxx.vm));

原文 http://fantaxy025025.iteye.com/blog/2283904

主題 Java

總評:隻是标記一下這種用法hack方法。這種場景下用這種方法還是比較雷人的。

Velocity緩存與穿透

/**

*原創:

*Author:Water.DH(黃俊傑)

Date :2010-04-18/

前言:

Velocity作為一款簡單易用的web應用模闆架構,深受廣大java開發者的喜愛,更多資訊使用搜尋”Velocity”;來獲得。

場景:

Web應用在開發階段,是不需要配置velocity緩存的,這樣修改了vm模闆後可以立馬生效,調試起來也比較友善。正式上線後,為了提升性能,我們還是需要開啟Velocity緩存,這樣vm模闆不需要每次通路的時候重新編譯,直接從vm緩存中擷取。經過測試,在大型Web應用中cpu負載可以降低10%左右。

配置:

web應用中velocity.properties中增加配置如下:

resource.loader=file

file.resource.loader.class=org.apache.velocity.tools.view.servlet.WebappLoader

file.resource.loader.cache=true //緩存開關

file.resource.loader.modificationCheckInterval=3600 //機關秒

模闆緩存1小時。

問題:

很好,現在我們web應用都加上了velocity緩存了,但是頁面公共部分有了小修改(比如頂部導航),本來隻要釋出一個vm模闆檔案就可以了, 但是為了讓模闆立馬生效,我還得重新啟動web服務, 一台兩台還好說,我靠,可是如果涉及多個應用和幾百台伺服器呢?

方案:

把公用的vm模闆打上版本号,通過中間的系統管理起來,有了更新後,發送消息給相應的web應用。

web應用這時候要比對版本号,看是否要從中間系統中拉最新的版本内容。

OK,拉到新的模闆了,怎麼樣利用起來呢?

velocity語言中,有個#parse(“/WEB-INF/tpl/xxx.vm”)函數,用于載入指定路徑下的vm檔案,這時候我們通過注入工具類的方式,來動态替換這個路徑。

比如:

parse($tool.getPath(xxx.vm));

那其實$tool.getPath(xxx.vm)輸出的是帶版本号的新位址”/WEB-INF/tpl/xxx_v1102.vm”,這樣就達到了透過vm緩存的效果。

我們把工具類整合成一個用戶端,實作新版本擷取,曆史檔案管理,脫機管理,高并發優化等功能,達到了既不影響性能又簡便地集中控制釋出的目的。

http://www.tuicool.com/articles/f6Rz63