10/17/2005

同時使用用戶數與TPS的關係

一般應用伺服器公佈的容量規劃(Capacity Planning)文件多是以TPS(每秒交易量; 交易的定義依測試標準而不同)計算, 但大部分的使用者需求是從多少個同時使用者(Concurrent Users)來衡量, 這有個簡單的算式來轉換TPS與同時連線使用者的關係:

同時連線使用者人數 = (ETT x TPS) + TPS
ETT(Estimated Think Time): 預估的思考時間, 二個連續動作的休息時間

依據這個算式, 如果二顆Sun Sparc 750Mhz的CPU在95%的利用率下, 可以榨出55.76 TPS, 假設思考的停留時間為4秒, 則同時連線人數可支撐到278.8 (4*55.76+55.76).

1/17/2005

Workshop中幾個安控屬性的意義

在Workshop時, 屬性編輯視窗在特定的檔案開啟後, 會有一個security小節, 這些設定一樣是用Javadoc Annotation寫在原始碼, 例如:
  • Web Services , Java Control 與 JPD : @common:security
  • Java Page Flow : @jpf:controller 與 @jpf:action
  • EJBGen : @ejbgen:role-mapping

簡單的說明一下這些屬性的意義, 詳細內容還是要參考手冊!


roles-allowed : 准許設定的角色可以使用物件, 這些角色必須已經定義在web.xml或ejb-jar.xml 。在@jpf:controller設定的是套用到整個class, 可存取所有methods, 若在@jpf:action設定, 算是擴充(再加上原來@jpf:controller的部份);同樣原理也適用在@common:security。

roles-referenced : 不適用於JCX或JPF檔。代表在程式中會用到的角色, 列在此則會在DD中增加security-role-ref的設定, 例如在JWS中設定, 則在編譯後的EJB Jar檔裡, ejb-jar.xml中會多一筆security-role-ref, 且在weblogic-ejb-jar.xml中該角色被設定為externally-defined。

run-as : 代表設定的這個角色有權利存取其他資源, 當存取該資源時, 會用設定的角色名稱, 因此使用設定的檔案編譯完成DD檔會多一筆相關的角色設定, 且是externally-defined。如果run-as-principal沒有設定, 則此屬性同時代表principal與角色名稱。

single-principal : 如果設定為true, 則使用此服務時, 在對話中的所有動作都必須由同一個principal來做。

callback-roles-allowed : 定義當JWS呼叫控制項後, 誰可回呼JWS的Callback介面, 而此控制項必須實作ExternalCallbackTarget介面。

1/10/2005

BPM如何處理交易中的錯誤

在WebLogic Integration 8.1中, 所有的流程都是至少有一個全域交易(Global Transaction), 萬一有錯誤(Exception)發生, 流程引擎會怎麼運作呢? 下面這張圖是基本的演算法:

很清楚地, 只有在沒被標示成Roll-Back Only, 而且Exception Hanlder沒有產生錯誤的情況下, 流程會繼續跑下去(Resume), 否則都Rollbacked, 流程進入Aborted狀態。

問題來了, 如果流程被設定成"freeze on failure"時, 會如何? 答案是: 交易會被Roll-backed, 而且不會執行Exception Handler, 流程進入凍結狀態! 如果又希望在Rollbacked前, Exception Handler可以被執行的話 (例如做補償交易), 可以將其"execute on rollback"屬性設成"true" 。

Exception的處理, 影響到整個流程的設計, 請千萬小心!

原始文件在 http://e-docs.bea.com/workshop/docs81/doc/en/integration/wfguide/wfguideException.html 可取得。

1/04/2005

使用WebLogic Server叢集時, 程式寫作上要注意什麼?

在BEA快三年, 這也是常被問的問題之一! 除了需要根據WebLogic Server的規定, 在部署時做設定, 的確有些常犯的錯誤, 但當了解原理與J2EE規格後, 通常應該不會有此疑問。叢集可以容錯轉移的基本原理是, 透過網路讓不同的JVM互相溝通, 備份資料, 並且看看誰已經死了, 不要再去打擾它。

所以在Servlet/JSP寫作上, 要注意:
  1. 放到Session的資料都要Serializable, 不然怎麼備份?
  2. 只用setAttribute跟removeAttribute修改Session裡的資料, 因為WebLogic只監控這二個方法
  3. 小心放到Session的資料, 因為它需要做網路複製的動作, 會影響整體效能, 更重要的, 目前還沒有好的方法知道Session裡有哪些資料, 哪些是不Serializable, 大小, 除非買工具來做
  4. 小心使用Frames! 有可能每個開發人員都在自己的Frame裡產生Session, 而系統不會幫這些Frames做同步, 在叢集環境裡就會搞死人! 所以最簡單的方法是有一個Frameset的其中一個Frame產生Session, 之後用其他的Frameset的一個Frame來修改Session資料

對Stateless Session Bean來說, 最重要的是idempotent, 也就是同樣資料餵進去, 不管幾次, 再哪一台Server, 都有一樣的結果, 這樣就可以做容錯轉移, 像新增物品到購物籃的程式, 本質上就不行!

對Stateful Session Bean而言, 跟HTTP Session 一樣, 注意要被放的狀態需要可以序列化!

以上說明都是來自http://e-docs.bea.com/wls/docs81/cluster/failover.html#1032777 .

關於叢集所提供的負載平衡與容錯轉移功能

很多人會問二個問題 : 1) 為什麼使用叢集後, 負載沒有平衡? 2) Servlet收到Client要求, 呼叫同一部WLS instance裡的EJB, EJB物件死了, 怎麼沒有轉移到其他部執行?

回答這些問題前, 先解釋二個名詞, 在叢集部署時, 最簡單的有二種情況, 第一種是Web Container跟EJB Container在同一個WLS Instance裡, 這我們叫Basic Architecture或2-Tier Architecture; 第二種稱為Multi-Tier Architecture, 這種狀況是Web Container與EJB Container跑在不同的機器上。

首先, 先回答第一個問題, 這通常發生在2-Tier Architecture中, 而且應用程式均部署再每一台伺服器, 負載不平均有可能是因為EJB的呼叫不平均, 為什麼? 根據文件, 我可能已經指定一種演算法(Round-Robin, Weight-Based, Parameter-Based或Random)了, 理論上EJB呼叫應該均勻分配, 不是嗎? 答案不是的! WebLogic 會最佳化這個腳本, 因為Servlet跟EJB在同一個WebLogic Server Instance裡都有了, 何必遠求浪費時間呢? 這就跟我們要吃鼎泰豐一樣, 既然台灣都有了, 何必跑到日本吃, 有比較便宜嗎? 所以當這些物件被放在一起時, 就不會根據指定的負載平衡演算法來走, 而是找本地的, 詳細說明在這裡http://e-docs.bea.com/wls/docs81/cluster/load_balancing.html#1008605的Optimization for Collocated Objects小節。除了這個原因, 也可能是其他因素, 例如我們觀察的時間太短, 負載平衡應該是在較長的時間中的統計結果。

第一個問題其實已經說明第二個問題, 注意在叢集運作裡, 其實是以WLS Instance為單位, 更簡單的說是JVM, 負載透過平均分散在不同的JVM以達到平衡的效果。跟第一個問題同樣的設定腳本, Servlet呼叫的EJB物件無法使用, 請問有這樣的狀況嗎? 會有這樣的狀況通常Web Container也跟著掛了, 更可能連JVM都有問題了, 怎麼可能有問題的Servlet再去呼叫其他台可用的EJB? 所以區分的界限是在OS的Process是否正常。當然隨著技術演進, 這樣的設計可能過時, 但很清楚的是, 天下沒有白吃的午餐, 當要求越多, 付出也會越多。

因此, 要充分達到我們的理想, 就要使用Multi-Tier架構, Web App獨立一層, EJB獨立一層, 這樣富在就能夠根據演算法分配, 所有的EJB使用都是遠端的, 當有非應用程式的錯誤時, 就可以轉移到其他伺服器上執行, 雖然達到目標且更有彈性與伸縮性, 但是增加了管理上的難度。

12/21/2004

常見的問題

同樣的問題, 一定會從不同人的嘴巴發問, 這是歷史的必然. 所以當你看到這一篇, 有人會很慶幸少了一件事:)

12/13/2004

誰是小惡魔 (Diablo) ?

WebLogic Server 9.0 內部代號小惡魔 (Diablo), 有用不完的精力, 所以也不會休息 (Non-Stop Application Server), 預計在12/16提供測試版下載, 在這先來介紹一下:)

標準

  • JDK 5.0 (1.5)
  • J2EE 1.4 & 1.3 (JSF還不是J2EE標準的一個部份, 要小心觀察它未來的變化!)

Core (Reliability & Availability)

  • 自動調整伺服器, 以更有效利用資源
  • 負荷超載預防: 拒絕服務, 暫停或停機
  • Node Manager支援多個Domain且可重新啟動Admin Server
  • 叢集與叢集間在MAN互相同步複製備援 (In-Memory)
  • 叢叢與叢集間在WAN非同步複製備援 (Persistence)
  • Singleton服務移轉 (當有錯誤時)
  • 應用伺服器有問題時, 並使用共用磁碟時, 可包含IP位址移轉到其他機器

管理

  • "Live" 伺服器版本更新 : 跨叢集更新版本, 不用停機 (Disruption-Free)
  • 新的問題診斷架構 (Diagnostic Framework) : Server Snapshot, 多種通知方式 (Email, SNMP, JMX)
  • Portal-based的管理介面 : 模組化, 簡化客製, 可將部分功能當成Portal的組件
  • 批次變更 (Batch Change), 與共管處理 (Lock Management)
  • 支援JSR-88部署計畫
  • WLST : Scripting工具離線或線上修改設定

部署

  • "Live" 應用程式更新 : 舊版與新版同時跑 (side-by-side), 新的流量會導到新版, 也同供Rollback功能
  • JSR-88部署計畫, 支援Application Release Lifecycle
  • 自動退休政策 : 慢慢退下 (Graceful), 還是時辰到了!
  • 版本管理

JDBC

  • JDBC 3.0, Rowset (JSR-114), JSR-77
  • 可使用JSR-88部署全域或專用(application-scope)的DataSource
  • Profiling, Debugging, JDBC子系統 Core Dump, 註冊Callbacks
  • 新的有用統計資料
  • Multipool支援XA Datasources
  • Connection Pool錯誤偵測: 超過容忍時間後, 測試失敗就清空

JMS

  • Store and Forward : 暫存訊息在本地端, 當遠端可接收時, 保證送達
  • Unit of Order : 訊息可依序被處理
  • 全域, 專有, 或獨立的JMS資源部署
  • 訊息管理 : 檢視瀏覽所有訊息(包含隱藏的), 刪除, 移動, 匯入/匯出
  • 暫停/繼續訊息處理, MDB暫停/繼續
  • JMS C API (Windows, HP, Solaris)
  • 訊息生命週期紀錄
  • 訊息壓縮
  • 效能提昇

Security

  • JSR-168熱身 : SSO framework, 提供Servlet Authentication Filter
  • JACC (JSR-115) : 抽插式授權模組
  • 支援應用程式版本管理
  • 可根據時間, 原則, HTTP Request及HTTP Session屬性, 上下文資訊授權
  • 可設定的RDBMS Realm
  • Windows Provide及SPNEGO SSO支援
  • 支援SAML : OASIS 單一簽入(SSO)標準
  • Auditing : SOAP訊息內容, HTTP Request/Response, SAML Token, WLI訊息資料
  • Web Service Security支援 : WS Digest, SAML Profile

XML與Web Services

  • SOAP 1.1, WSDL 1.2, UDDI 2.0
  • WSEE (JSR-109), JAX-RPC 1.1, , JSR-181, , SAAJ 1.2, JAX-R
  • WS-I Basic Profile 1.0, WS-Policy, WS-Reliable Messaging, WS-Addressing, WS-Buffering, WS-Conversation, WS-Callback
  • Cluster Routing
  • XMLBean v2

WebLogic 8.1 SP4

WebLogic 8.1 SP4英文版在12/9提供公開下載, 除了維修現有臭蟲之外, 還加強了Workshop的處理速度, 與WebLogic Integration及WebLogic Portal的效能及伸縮性, 另外補了一些"How-to"的文件.

WebLogic Portal
  • Look and Feel Editor
  • 新文件: 效能調校, Best Practice, WSRP, Inter-portelt等

WebLogic Integration

  • 提供同步用戶端呼叫非同步資源 (Sync/Async SOAP Servlet)
  • 資料庫事件產生器 (取代Database Adapter)
  • 可根據行事曆制定事件產生器
  • 強化File Control
  • 新的控制項 (Controls) : Dynamic Transformation, XML MetaData Cach
  • WLI Console 可提止所有流程事例

WebLogic Server

  • 支援MySQL
  • 新的Message Bridge設定助理
  • SPNEGO : 登入Windows 2000/2003 AD Domain之後, 當使用WebLogic服務時, 不必再做一次HTTP認證

另外, Oracle RAC (9i, 10g) 支援整個WebLogic Platform, 但因為Oracle RAC的限制, 導致目前在WebLogic也有些限制:

  • XA只提供Failover (Driver-level), 沒法負載平衡, 因為Oracle RAC要求分散式交易要在同一個資料庫主機
  • Non-XA : 透過Multipool, 可支援負載平衡與容錯轉移, 但是Multipool不支援XA, WLI與WLP目前也不支援Multipool

WebLogic 與 Oracle RAC 完整整合預計在明年1月, 應該會有理想的HA與LB功能.


12/10/2004

WLS 8.1 Certified Administrator

剛考完WLS 8.1 Certified Administrator認證, 比重比較大的部份是Cluster, Performance Tuning, JMS, LDAP與Security, Application Deployment, JMS, Node Manager及Network Channel. 大概有六成, 其他安裝跟基本管理大概一成.

填空題有三題, 應該都是必考的:
  1. Sever Life-Cycle
  2. 各類Heuristic Transaction Exception
  3. JMS File Store Synchronization Write Policy解釋 : Disabled, Cache-Flush, Direct-Write

雖然每一題都認為是答對的, 但是還是沒有滿分:(


12/09/2004

如何產生JVM Thread Dump

產生JVM Thread Dump是檢查多執行緒應用最好的方法, WebLogic支援幾種方法:
  1. 在Windows, 找到執行WebLogic Server的命令視窗, 按下[Ctrl]+[Break]
  2. 如果WebLogic Server是用NT Service執行, 可以使用%WL_HOME%\common\bin\beasvc.exe -svcname:"the_service_name" -dump指令, 結果會產生在設定服務時, -log:所設定的目錄
  3. 在Unix, 找到WebLogic Server的PID, 執行$kill -3 PID, 記得要重導STDOUT到檔案
  4. WebLogic提供工具產生Thread Dump, 語法如下:
    $java weblogic.Admin -url -username -[adminUser] password [adminPass] THREAD_DUMP
  5. 如果用JRockit, 則可以在Management Console取得Thread Stack Dump.

簡單吧! 但是有時候JVM有臭蟲時, 可能就生不出Thread Dump了!


如何閱讀Blog

簡單的來說, 要閱讀Blog有幾種方式:
  1. 直接連到該網站, 例如http://mybea.blogspot.com
  2. 使用RSS/Atom Reader, 網路上有些免費的軟體可以用, 例如FeedReader;如果不想安裝軟體, 可以用這個網站http://www.bloglines.com , 它具有類似我的最愛的功能, 可以自動抓多個Blogs (blogrolls)
  3. 如果不喜歡開瀏覽器, 喜歡讀email, 那可以寫信給我, 我會邀請你加入Mailing-list (這是使用Google Groups的功能)
本站的Site Feed網址是 http://mybea.blogspot.com/atom.xml .

12/07/2004

如何使用File Control讀取FTP Server

WebLogic Workshop內建的File Control可以存取本地檔案與FTP Server上的檔案, 但是在設定連接FTP Server需要點技巧(文件沒講清楚的!).

測試環境: WebLogic Integration 8.1 SP3 + FileZilla Server 0.9.4d beta

[注意] 使用其他FTP Server, 要先用ftp命令測通(需要使用帳戶與密碼的), 不然浪費時間, 例如FtpGo就不能用.

File Control的設定內容應該長類似這樣:

/**
* A custom file control.
* @jc:file directory-name="/ftpdir"
* ftp-password="weblogic"
* ftp-user-name="weblogic"
* create-mode="rename-old" ftp-host-name="localhost"
* file-mask="mytest.txt"
*/
public interface FtpCtrl extends FileControl,com.bea.control.ControlExtension

什麼樣的設定才會讓系統認為不是抓本地檔案, 而是FTP Server上的呢? 注意了, ftp-host-name + ftp-user-name + ftp-password 通通要設, 不然是抓本地端的, 而directory-name指的是在FTP Server上哪一個目錄, 要存取的檔案放在file-mask中, 當然這些屬性都可以透過File Control的setProperties()動態改變:)

一點小秘訣, 受用一整天:P

12/03/2004

如何安裝Roller在WebLogic Server 8.1 SP3

Blog使用者已超過1億, 但多數還是使用PHP, Perl等語言為平台, 所以這裡介紹以Java為主的組合.


使用的軟體包含:



Roller 使用了OSS 與 Java 的很多Framework, 涵蓋Struts, Hibernate, Velocity, JSTL 等, 只要有Web Container 理論上都可以跑, 實際測試後是需要微調的, 原來預設是用Tomcat, 但很順利的, 只要調整一部分設定, 修修小臭蟲, 也可以順利運作.


依照 Roller Installation Guid 1.0 的步驟, 我做了幾項修正:


步驟一


安裝WebLogic Server 8.1 SP3 後, 使用 Configuration Wizard新增一個 Basic WebLogic Server Domain, 這時 CATALINA_HOME 指的就是新產生的Domain的目錄


步驟二


乖乖遵照指示, 解壓縮Roller安裝檔, 例如解到C:\roller


步驟三


接著用 MySQL Query Browser 產生一個 UTF-8 編碼的資料庫, 與法如下


CREATE DATABASE roller
CHARACTER SET utf8
COLLATE utf8_general_ci;


然後執行createdb.sql


步驟四



  • 下載 MySQL 的 JDBC Driver : Connect/J. 我使用的版本是mysql-connector-java-3.0.16-ga-bin.jar

  • 然後把 mysql-connector-java-3.0.16-ga-bin.jar 加到startWebLogic.cmd的Classpath中

(我先跳過安裝JavaMail)
我們先做第七個步驟, 把 JDBC 連線搞定



  • 執行startWebLogic.cmd, 等WebLogic Server啟動完成, 連進去管理主控台, 預設是http://localhost:7001/console

  • 在左邊的Applet選擇Services->JDBC->Connection Pools, 新增一個MySQL Connection Pool, 操作步驟請看這裡, 注意: 在Properties中, 加一行characterEncoding=utf8, 因為中文XP的編碼是MS950, 在新文章打中文存入MySQL會變成亂碼, 因為它是UTF-8的編碼

  • 下一步, 在它隔壁的DataSources新增一個Data Soruce, 也請看這裡; 注意: JNDI Name 要是 jdbc/rollerdb, 不要勾選Honor Global Transactions

步驟五


完全不要理Installation Guide說什麼, 跟著我做



  • 在WEB-INF產生一個weblogic.xml檔, 內容如下:



<!DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN" "http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd">
<weblogic-web-app>


<security-role-assignment>
<role-name>admin</role-name>
<principal-name>admin</principal-name>
</security-role-assignment>


<security-role-assignment>
<role-name>editor</role-name>
<principal-name>editor</principal-name>
</security-role-assignment>


<reference-descriptor>
<resource-description>
<res-ref-name>jdbc/rollerdb</res-ref-name>
<jndi-name>jdbc/rollerdb</jndi-name>
</resource-description>
</reference-descriptor>
</weblogic-web-app>



  • 找到login.jsp, 移除<%@ page language="java" errorPage="/error.jsp" contentType="text/html; charset=UTF-8" %>這一行, 不然登入時在WebLogic Server會出現這個錯誤...



####<2004/12/2 下午07時21分12秒 CST> <Error> <HTTP> <kevin> <myserver> <ExecuteThread: '13' for queue: 'weblogic.kernel.Default'> <<WLS Kernel>> <> <BEA-101020> <[ServletContext(id=42241185,name=roller,context-path=/roller)] Servlet failed with Exception
weblogic.servlet.jsp.JspException: (line 1): page directive language at /taglibs.jsp:1 previously defined at /login.jsp:1
at weblogic.servlet.jsp.JspLexer.jspException(Ljava.lang.String;)V(JspLexer.java:712)
at weblogic.servlet.jsp.JspLexer.mPAGE_DIRECTIVE_BODY(ZZ)V(JspLexer.java:5193)
at weblogic.servlet.jsp.JspLexer.mPAGE_DIRECTIVE(Z)V(JspLexer.java:4948)
at weblogic.servlet.jsp.JspLexer.mDIRECTIVE(Z)V(JspLexer.java:4770)
at weblogic.servlet.jsp.JspLexer.mSTANDARD_THING(Z)V(JspLexer.java:2143)
at weblogic.servlet.jsp.JspLexer.mTOKEN(Z)V(JspLexer.java:1929)
at weblogic.servlet.jsp.JspLexer.nextToken()Lantlr.Token;(JspLexer.java:1802)
at weblogic.servlet.jsp.JspLexer.parse()V(JspLexer.java:963)
at weblogic.servlet.jsp.JspLexer.parseJspCode(Ljava.io.Reader;I)V(JspLexer.java:1209)
at weblogic.servlet.jsp.JspLexer.parseJspCode(Ljava.io.Reader;Ljava.lang.String;)V(JspLexer.java:1183)
at weblogic.servlet.jsp.JspLexer.buildTimeInclude(Ljava.lang.String;)V(JspLexer.java:934)
at weblogic.servlet.jsp.JspLexer.mINCLUDE_DIRECTIVE(Z)V(JspLexer.java:5017)
at weblogic.servlet.jsp.JspLexer.mDIRECTIVE(Z)V(JspLexer.java:4775)
at weblogic.servlet.jsp.JspLexer.mSTANDARD_THING(Z)V(JspLexer.java:2143)
at weblogic.servlet.jsp.JspLexer.mTOKEN(Z)V(JspLexer.java:1929)
at weblogic.servlet.jsp.JspLexer.nextToken()Lantlr.Token;(JspLexer.java:1802)
at weblogic.servlet.jsp.JspLexer.parse()V(JspLexer.java:963)
at weblogic.servlet.jsp.JspLexer.parseJspCode(Ljava.io.Reader;I)V(JspLexer.java:1209)
at weblogic.servlet.jsp.JspLexer.parseJspCode(Ljava.io.Reader;Ljava.lang.String;)V(JspLexer.java:1183)
at weblogic.servlet.jsp.JspLexer.buildTimeInclude(Ljava.lang.String;)V(JspLexer.java:934)
at weblogic.servlet.jsp.JspLexer.mINCLUDE_DIRECTIVE(Z)V(JspLexer.java:5017)
at weblogic.servlet.jsp.JspLexer.mDIRECTIVE(Z)V(JspLexer.java:4775)
at weblogic.servlet.jsp.JspLexer.mSTANDARD_THING(Z)V(JspLexer.java:2143)
at weblogic.servlet.jsp.JspLexer.mTOKEN(Z)V(JspLexer.java:1929)
at weblogic.servlet.jsp.JspLexer.nextToken()Lantlr.Token;(JspLexer.java:1802)
at weblogic.servlet.jsp.JspLexer.parse()V(JspLexer.java:963)
at weblogic.servlet.jsp.JspParser.doit()V(JspParser.java:106)
at weblogic.servlet.jsp.JspParser.parse(Ljava.io.Reader;)V(JspParser.java:232)
at weblogic.servlet.jsp.Jsp2Java.outputs([Ljava.lang.Object;)Ljava.util.Enumeration;(Jsp2Java.java:125)
at weblogic.utils.compiler.CodeGenerator.generate([Ljava.lang.Object;)[Ljava.lang.String;(CodeGenerator.java:258)
at weblogic.servlet.jsp.JspStub.compilePage(Lweblogic.servlet.internal.RequestCallback;)V(JspStub.java:388)
at weblogic.servlet.jsp.JspStub.prepareServlet(Lweblogic.servlet.internal.RequestCallback;Z)V(JspStub.java:238)
>


原因: WebLogic Server 不容許JSP程式有些小錯誤, 像這個重複出現二次的directive



  • 修改theme/header.jsp, 將<c:import url="${leftPage}" /> 改為 <c:import url="${leftPage}" charEncoding="UTF-8"/>, 沒做的話, 左邊選單中文會變成亂碼, 這是因為使用JSTL core的import, 卻沒有指定charEncoding

  • 最後一動, 部署Roller, 在管理主控台按左邊Deployments->Web Application Modules, 設定一個新的Web App, 直接指到Roller的目錄 (例如C:\roller), 不會做的看這裡.

步驟六 : 跳過


步驟七 : 已經做了!


步驟八



  • 開啟Roller, 如果是跟著我做, 網址是http://localhost:7001/roller

  • 登錄一個使用者當做管理員, 然後用rollerpw.bat -grant_admin <username> 指定他/她是管理員; 注意: 要記得修改rollerpw.bat的_cp變數, 把MySQL的Connect/J JDBC Driver加入, 還有修改rollerdb.properties, 像這樣:


driverClassName=com.mysql.jdbc.Driver
connectionUrl=jdbc:mysql://localhost:3306/roller


試試看可不可以登入!


步驟九


一定無法登入的啦! 這是因為Roller用DB儲存使用者帳號跟密碼, 而且用標準的j_security_check做認證, 卻寫了一個LoginServlet先攔截將密碼用SHA加密, 再傳到Web Container做認證! 不能登入的主要原因是, WebLogic Server 預設用自己的LDAP儲存庫紀錄使用者跟群組, 而用j_security_check登入時, 是到這個LDAP檢查, 所以有二個問題



1. LDAP上面沒有剛剛註冊的使用者


2. 密碼被加密, WebLogic Server 看沒有


要解決這個問題, 首先要在WebLogic Server 管理主控台新增群組跟使用者



  • 先建立二個群組: admin 與 editor (跟weblogic.xml的principal-name一樣)

  • 用剛剛註冊的使用者名稱, 產生新的使用者, 且密碼一樣

  • 開一個Command Window, 切換到WEB-INF/dbscripts下, 執行 rollerpw -save passwd.properties

  • 編輯passwd.propertis, 修改密碼為明碼

  • rollerpw -restore passwd.properties

  • 檢查MySQL中, rolleruser表格裡passphrase欄位的資料是不是都是明碼了

  • 重新部署Roller

Blog 編輯器

Roller支援XML-RPC介面, 所以可使用Blog編輯器來上傳文章

後續問題報導



  • 使用者註冊時, 無法直接同時在LDAP上新增, 需要手動自己建立, 有幾種解決方案


1. 自己做一個Authetication Provider, 使用Roller的資料做認證


2. 插一個Servlet Filer, 在註冊使用者時, 同時再LDAP上新增



  • 至於密碼是明碼的問題, 如果不自己做Authetication Provider, 需要修改程式, 跳過Roller認證檢查, 只使用WebLogic Server所提供的, 同時在註冊時, 就不存密碼, 且需要更改使用者自行變更密碼的程式