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所提供的, 同時在註冊時, 就不存密碼, 且需要更改使用者自行變更密碼的程式