以下是我的測試過程:
加上<distributable />到WEB-INF/web.xml
在WEB-INF/config/jforum-custom.conf,加上:
cache.engine.implementation = ${cache.engine.jboss}
在iptables中加上48866這個udp port
重新啟動JForum,出現下列的錯誤訊息:
HTTP Status 500 -
type Exception report
message
description The server encountered an internal error () that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: Servlet.init() for servlet jforum threw exception
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:567)
org.apache.catalina.ha.tcp.ReplicationValve.invoke(ReplicationValve.java:347)
org.apache.catalina.ha.session.JvmRouteBinderValve.invoke(JvmRouteBinderValve.java:210)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291)
org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:769)
org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:698)
org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:891)
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
java.lang.Thread.run(Thread.java:619)
root cause
java.lang.NoClassDefFoundError: javax/transaction/SystemException
net.jforum.cache.JBossCacheEngine.init(JBossCacheEngine.java:73)
net.jforum.ConfigLoader.startCacheEngine(ConfigLoader.java:230)
net.jforum.JForumBaseServlet.init(JForumBaseServlet.java:113)
net.jforum.JForum.init(JForum.java:91)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:567)
org.apache.catalina.ha.tcp.ReplicationValve.invoke(ReplicationValve.java:347)
org.apache.catalina.ha.session.JvmRouteBinderValve.invoke(JvmRouteBinderValve.java:210)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291)
org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:769)
org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:698)
org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:891)
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
java.lang.Thread.run(Thread.java:619)
root cause
java.lang.ClassNotFoundException: javax.transaction.SystemException
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
net.jforum.cache.JBossCacheEngine.init(JBossCacheEngine.java:73)
net.jforum.ConfigLoader.startCacheEngine(ConfigLoader.java:230)
net.jforum.JForumBaseServlet.init(JForumBaseServlet.java:113)
net.jforum.JForum.init(JForum.java:91)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:567)
org.apache.catalina.ha.tcp.ReplicationValve.invoke(ReplicationValve.java:347)
org.apache.catalina.ha.session.JvmRouteBinderValve.invoke(JvmRouteBinderValve.java:210)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291)
org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:769)
org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:698)
org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:891)
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
java.lang.Thread.run(Thread.java:619)
主要是找不到javax.transaction.SystemException這個類別,
用
http://www.findjar.com/搜尋一下,找到了一些包含這個類別的jar檔,以jboss-j2ee.jar為例,可以用下列方式來補上
wget
http://ncu.dl.sourceforge.net/sourceforge/jboss/jboss-4.2.3.GA-jdk6.zip
unzip jboss-4.2.3.GA-jdk6.zip
cp jboss-4.2.3.GA/jboss-4.2.3.GA/server/all/lib/jboss-j2ee.jar /home/andowson/www/WEB-INF/lib/.
重新啟動JForum後,可以正常顯示了,但是在log檔內卻出現下列的錯誤訊息:
Target exception: org.jgroups.ChannelException: failed loading class: java.lang.ClassNotFoundException: [Ljava.lang.Object;
org.jgroups.ChannelException: failed loading class: java.lang.ClassNotFoundException: [Ljava.lang.Object;
at org.jgroups.conf.ClassConfigurator.init(ClassConfigurator.java:92)
at org.jgroups.conf.ClassConfigurator.getInstance(ClassConfigurator.java:112)
at org.jgroups.stack.ProtocolStack.<init>(ProtocolStack.java:48)
at org.jgroups.JChannel.<init>(JChannel.java:254)
at org.jgroups.JChannel.<init>(JChannel.java:234)
at org.jboss.cache.TreeCache._createService(TreeCache.java:1212)
at org.jboss.cache.TreeCache.startService(TreeCache.java:1242)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at bsh.Reflect.invokeMethod(Unknown Source)
at bsh.Reflect.invokeObjectMethod(Unknown Source)
at bsh.Name.invokeMethod(Unknown Source)
at bsh.BSHMethodInvocation.eval(Unknown Source)
at bsh.BSHPrimaryExpression.eval(Unknown Source)
at bsh.BSHPrimaryExpression.eval(Unknown Source)
at bsh.Interpreter.run(Unknown Source)
at bsh.Interpreter.main(Unknown Source)
利用
http://www.jforum.net/posts/list/1306.page#5605這個網址提供的測試方法測了一下:
export CACHE_LIB=/home/andowson/www/WEB-INF/lib
export JFORUM=/home/andowson/www/WEB-INF
export CLASSPATH=.:$JFORUM/classes:$CACHE_LIB/commons-logging-api.jar:$CACHE_LIB/bsh-2.0b4.jar:$CACHE_LIB/jboss-j2ee.jar:$CACHE_LIB/jboss-remoting.jar:$CACHE_LIB/jgroups-all-2.2.9-beta2.jar:$CACHE_LIB/jboss-cache-1.2.4.jar:$CACHE_LIB/jboss-jmx.jar:$CACHE_LIB/jboss-minimal.jar:$CACHE_LIB/jboss-common.jar:$CACHE_LIB/jboss-system.jar:$CACHE_LIB/log4j-1.2.12.jar:$CACHE_LIB/concurrent.jar:$JFORUM/lib/jcaptcha-core-1.0-RC1.jar:$JFORUM/lib/jcaptcha-engine-1.0-RC1.jar:$JFORUM/lib/jcaptcha-all-1.0-RC2.0.1.jar
java bsh.Interpreter
show();
import org.jboss.cache.*;
import org.jboss.cache.aop.*;
org.apache.log4j.xml.DOMConfigurator.configure("/home/andowson/www/WEB-INF/log4j.xml");
cache = new TreeCache();
config = new PropertyConfigurator();
config.configure(cache, "/home/andowson/www/WEB-INF/config/jboss-cache-cluster.xml");
cache.startService();
cache.put("level1", "key1", "value1");
exit();
結果也是一樣,利用
org.jgroups.ChannelException: failed loading class: java.lang.ClassNotFoundException: [Ljava.lang.Object;(google)這個錯誤訊息找到了這個網頁:
http://www.jboss.org/index.html?module=bb&op=viewtopic&p=4124237#4124237
發現是JDK 1.6的問題,解決的方法如果不降回JDK 1.5的話有兩種方法:
一種是在java啟動時加上-Dsun.lang.ClassLoader.allowArraySyntax=true的參數
另一種是換成新版的jgroups.jar
用方法一測了一下:
java -Dsun.lang.ClassLoader.allowArraySyntax=true bsh.Interpreter
確實可以跑了,不過還是在JForum群組設定時有問題
換成較新版本的JGroups
wget
http://ncu.dl.sourceforge.net/sourceforge/javagroups/JGroups-2.7.0.GA.bin.zip
unzip JGroups-2.7.0.GA.bin.zip
cp JGroups-2.7.0.GA.bin/jgroups-all.jar /home/andowson/www/WEB-INF/lib/jgroups-all-2.7.0.GA.jar
mv /home/andowson/www/WEB-INF/lib/jgroups-all-2.2.9-beta2.jar /tmp
重新啟動後,再去新增版面,結果就如同moder所說的,新增的版面無法顯示,只有重新啟動JForum後才行。
結論:
JForum不支援JBoss Cache用在Tomcat Cluster架構中。請用原先預設的DefaultCacheEngine。
備註:在EhCacheEngine.java的開頭可以找到一段註解:
* The rest of the application seems to make some invalid assumptions about how
* things are cached. Those assumptions might be benign, but it is hard to tell
* without deep testing. Until this is finished the JBossCacheEngine should be
* configured in a local mode.
看來是不建議使用JBossCacheEngine在JForum上線環境中。
然後跟Rafael討論,他說他也沒在上線環境用過JBossCacheEngine。