實際的 Web Application 中,緩存 (cache) 是不可或缺的事。 JBoss Seam 當然也提供了多種緩存服務。在這系列的文中我會講講最高層,最易應用和最易理解的 PojoCache 以及 Page Fragment Cache 。
基本的 Web App
在使用緩存之前,我們首先建立一個 Hello World 程式作為藍本 (源碼 svn)。
- 設定 Seam 的 Page Action
在 resources/WEB-INF/pages.xml 加入以下一句:
<page view-id="/index.xhtml" action="#{complexWork.work}" />
這會讓 seam 在顯示 index.xhtml 前先執行 complexWork.work method。
- 設定業務邏輯,這裡我們使用 Stateful Session Bean (SFSB)。
@Stateful 代表這是個 SFSB。@Name 指定了它在 seam 中的名字,我們以後可以用 complexWork 在 seam 中稱呼它。work() 是我們的主要業務邏輯 ,它會等待一秒以模擬一些繁重的工作,再把 message 設定為 “Hello, World”。@Out annotation 會讓 seam 知道我們想在頁面上看到 message。
src/action/hk/reality/seam/cache/action/ComplexWork.java
src/action/hk/reality/seam/cache/action/ComplexWorkBean.java
- 設定 view:
沒有甚麼值得一談的,只是把 message 顯示出來:
view/index.xhtml
- Deploy 後到 http://127.0.0.1:8080/cachetest/index.seam 可以看到結果:
留意 console ,每次 refresh 網頁 SFSB 也在重新工作:
接著我們要為 SFSB 加入緩存 。
使用 PojoCache
PojoCache 是 seam 內置的 Java 物件緩存組件。PojoCache 支援 JTA transaction manager,isolation level,replication,overflowing, eviction policy 等功能,要完整設定並不簡單。但要讓它可以供 seam 應用則不難,首先要在 resources 下加入設定檔 treecache.xml 。(源碼 svn)
這個設定檔中值得留意的是 Eviction Policy 。 Eviction Policy 是指 PojoCache 移除 cache 中的規則。現在 PojoCache 只支援 LRU (Least Recently Used) policy。現在的設定下,在 “/message” region 中最多可存放 100 個物件,每個物件最多可以保留 10 秒。詳細的設定可以參考 JBoss TreeCache Manual 中的 LRU eviction policy。
接著在需要 PojoCache 的 component 中指定 Injection :
留意改動後的 work() 方法,使用 pojoCache 就如一般的 Map 一樣簡單。
使用 PojoCache 後再到 index.seam,會發現只有第一次啟動網頁時需要較長時間。
在之後十秒內再 refresh 網頁幾乎不用任何等待,這是由於我們設定了緩存有 10 秒的壽命。
在此我們己經成功設定 seam 使用 PojoCache 了!以下將會討論使用 Page Fragment Cache 以及手動移除 Cache 的方法。
直接在 component 中使用 PojoCache 讓我們可以在物件的層次控制緩存,雖然這可以很強大和靈活,但如果每個物件都要特別地作緩存,那業務的源碼就會充滿著緩存代碼,難以維護。這時候我們可以用 Page Fragment Cache。
(源碼 svn)
打開 view 的檔案 view/index.xhtml,加入 seam 的 <s:cache> tag。Seam 的 Page Fragment Cache 同樣是用 PojoCache 去實現,s:cache tag 中的 region 和 key 跟 PojoCache 中用法完全一樣。
同時在 SFSB 的 interface 和 implementation 加入方法 getMoreMessage():
public String getMoreMessage(){
log.info("retrieve moreMessage()");
return "Hello, again! (this message is component cached)";
}
運行的效果如下:
留意 console 的輸出:
在第一次之顯示之後,gerMoreMessage() 方法就沒有再被呼叫過,這是由於整個被 s:cache 包圍的組件也被緩存了。
手動移除過期物件
要留意 PojoCache 並不像 Hibernate 的 second level cache,更改了的物件並不會自動把有關的 PojoCache 和 page fragment 自動 invalidate 掉。除了指定 Eviction Policy外,一些對更新敏感的資料需要用手動的方法移除。PojoCache 容許我們手動用 Region 和 Key 指定移除特定的緩存。
(源碼 svn)
public String flush(){
log.info("flush cache");
try {
pojoCache.remove("/message", "complexTask");
pojoCache.remove("/message", "complexTask2");
} catch (CacheException ex) {
log.warn("Unexpected error while remove cache... #0 #1, error=#2", "complexTask", "complexTask2", ex.getMessage());
}
return "/index.xhtml";
}
使用 flush() 方法後指定的兩個緩存就會被移除。
加入移除緩存按鍵的主頁:
使用 flush() 後的 console ,是我們其待的結果:在 flush 後原本的 cache 不見了。
回顧及後話
這一篇中我們試驗了Seam 的以下功能:
- 使用和設定 PojoCache 去緩存任何物件;
- 使用 Page Fragment Cache 去緩存頁面的組件;
- 手動移除過期的緩存
有一些東西我是沒有討論的,例如這裡只有講最簡單的本地緩存,Transaction Manager 和不同 Isolation Level 在應用中的影響等等…這些應用就得等高人指教了。
在 Seam 中使用 PojoCache 並不困難,基本的 Seam 己包括所有需要的組件。然而,實際應用前我們必需要先設定它,這卻是異常神秘和讓人困惑的。在 Seam 的文件中有關緩存的課題我們只能找到這一句:JBossCache 有許多嚇人和讓人困惑的設定,我們不會在此討論。詳情請參考 JBossCache 的文件。然而就算你讀完 JBoss Cache User Guide 也不可能讓你設定好 seam 中的 PojoCache,因為JBoss Cache 中的例子根本不能用在 seam 中。
在網路和 JBoss 的網站上可以找到大量過時的資料,究竟 JBossCache,TreeCache 和 PojoCache有何分別?究竟怎樣才能讓我的 Hello World Seam Application 可以使用到最簡單的緩存?最後我由討論區上一篇孤獨的文章,加上 seam 的 blog example , Seam 的源碼以及 TreeCache 的文檔中才慢慢找出個頭緒來… 回頭己是花了兩天。
希望這篇記錄有助以後需要最簡單 Seam 緩存的人。
延申閱讀
請直接在我的 del.icio.us看看。
P.S. 在 Rails 中要 page fragment cache 只要在 view 中加入兩句,不用設定甚麼 xml 啊…
<% cache do %>
… content …
<% end %>
分享到:
相关推荐
Jboss cache.pdf介绍了如何配置和使用JBoss Cache,包括集群设置、缓存策略等内容。 **6. JFreeChart** JFreeChart 是一个Java库,用于创建各种图表,如折线图、饼图、柱状图等。JFreeChart-1.0.5-Ch.chm提供了...
1. **Faces Context增强**: 在Seam 2.0中,对JSF的Faces Context进行了扩展,提供了更多的上下文信息和操作。 2. **CDI支持**: 虽然Seam 2.0发布时,Contexts and Dependency Injection (CDI)规范还未正式发布,但...
整理自jboss seam 中文站,压缩为chm格式,便于广大jboss seam爱好者阅读,所有版权归jboss seam中文站所有。
标题中的“Jboss seam3 实战”表明,本文将重点介绍JBoss Seam框架的第三个版本的实际应用。JBoss Seam是一个开源的Java EE框架,它通过依赖注入和会话模型,简化了基于Java EE的企业级应用开发。Seam框架为开发者...
本书聚焦于JBoss Seam框架,旨在为读者提供一个全面、深入的理解,以掌握其在企业级应用开发中的应用与优势。 ### JBoss Seam框架概览 JBoss Seam是一个开源的应用框架,它基于Java EE标准,但通过引入一系列创新...
在Seam中,一切皆组件,无论你是倾向于采用分层架构(如J2EE)还是简单的架构,都可以得到支持。组件可以是无状态或有状态的,有状态的组件可与多种预定义上下文关联,如业务流程上下文或方法上下文,这为Seam赋予了...
这一节主要介绍了如何在JBoss AS和Tomcat服务器上运行Seam示例,帮助开发者熟悉Seam的基本配置和运行环境。 1. **在JBoss AS上运行示例**:首先需要安装配置JBoss AS服务器,然后导入Seam项目到服务器中进行部署。 ...
- **工作原理**:深入探讨了示例中使用的 Seam 特性,如事件处理机制和页面流。 ##### 1.4 Seam 和 jBPM:待办事项列表示例 - **代码理解**:展示了如何集成 Seam 和 jBPM 这两个框架,实现一个简单的待办事项列表...
在接下来的学习过程中,您可以利用这个环境来实践各种 JBoss Seam 示例项目,从而深入理解其特性和应用场景。同时,随着实践经验的积累,您还可以尝试使用 JFreeChart 和 Flex 等工具进一步丰富您的应用,提高用户...
7. **API和配置**:通过官方参考文档,深入研究Seam的配置选项和API使用,解决实际开发中的问题。 这些书籍将帮助你成为一名精通JBoss Seam的开发专家,无论你是初学者还是有经验的开发者,都能从中受益匪浅。在...
除了整合EJB 3.0和JSF之外,Seam还能够扩展其他一系列开源框架,例如jBPM、JBoss Rules (Drools)、JBoss Portal 和 JBoss Microcontainer等。这不仅使得Seam能够成为一个高度集成的平台,还能够利用这些框架的功能来...
**1.9.3 在 RESTful 应用中使用“推送”式 MVC** - **实时更新**:通过“推送”式 MVC 实现页面内容的实时更新。 - **WebSocket**:使用 WebSocket 技术实现服务器与客户端之间的双向通信。 #### 第九部分:开始...
在本文“百度地图API在JBoss Seam中的研究与应用”中,作者探讨了如何将百度地图API集成到JBoss Seam应用程序框架中,以构建弱电管道管理系统。JBoss Seam是一个强大的框架,它集成了EJB(Enterprise JavaBeans)、...
- **组件**:Seam中的组件是UI组件的扩展,可以包含行为逻辑。 - **转换器**:用于在对象和UI组件之间转换数据。 - **验证器**:检查用户输入是否符合特定规则。 - **事件**:用于组件间通信,触发特定的动作或工作...
- **推模式MVC**:讨论了如何在RESTful应用中使用Seam的“推送”模式实现更复杂的MVC交互。 ##### 2.10 在JBoss上运行Seam示例 - **使用JSF 1.2 RI**:提供了如何在JBoss平台上使用JSF 1.2参考实现来部署和运行...
Seam为持久化集成了JPA和Hibernate 3,为轻量化的异步性集成了EJB Timer Service和Quartz,为工作流集成了jBPM,为业务规则集成了JBoss规则,为电子邮件集成了Meldware Mail,为完整的文本搜索集成了Hibernate ...
[TipTec Development] JSF & Facelets & JBoss Seam 核心技术 (英文版) [TipTec Development] Essential JSF, Facelets & JBoss Seam (E-Book) ☆ 出版信息:☆ [作者信息] Kent Ka Iok Tong [出版机构] TipTec ...
作为Hibernate的创造者Gavin King的作品,Seam在设计之初就考虑到了ORM的最佳实践,它在整个Web交互生命周期中管理持久上下文,避免了DTO等技术的使用,提高了代码的整洁性和可维护性。 总的来说,JBoss Seam是一个...