Author |
Message |
03/11/2010 21:32:07
|
aason
journeyman
Joined: 02/25/2010 19:25:06
Messages: 17
Offline
|
在产生SESSION时, 发生以下错误, 不解, 能有人来解释下吗?
com.tc.exception.TCNonPortableObjectError:
*******************************************************************************
Attempt to share an instance of a non-portable class by passing it as an argumen
t to a method of a
logically-managed class. This unshareable class has super-classes that are
uninstrumented. Subclasses of uninstrumented classes cannot be shared.
For more information on this issue, please visit our Troubleshooting Guide at:
http://terracotta.org/kit/troubleshooting
Thread : http-8080-3
JVM ID : VM(0)
Logically-managed class name : java.util.HashMap
Logical method name : put(Object,Object)
Unshareable class : org.edu.scut.lab24.uam.hibernate
.User
Classes to add to the <includes> configuration: org.dom4j.tree.AbstractEntity, o
rg.dom4j.tree.AbstractNode
Under most circumstances, you should only be adding classes for your
application. If you are adding classes for frameworks or code not written by
you, then you should consider finding a Terracotta Integration Module (TIM)
that matches the framework you are using.
As an example, if the non-portable class listed below is
net.sf.ehcache.CacheManager, you should consider using the ehcache TIM.
It is possible that some or all of the super classes above are truly
non-portable, the solution is then to mark the referring field(s) as
transient.
Action to take:
1) Reconfigure to include the unshareable super-class(es)
* edit your tc-config.xml file
* locate the <dso> element
* add this snippet inside the <dso> element
<instrumented-classes>
<include>
<class-expression>org.dom4j.tree.AbstractEntity</class-expression>
</include>
<include>
<class-expression>org.dom4j.tree.AbstractNode</class-expression>
</include>
</instrumented-classes>
* if there is already an <instrumented-classes> element present, simply add
the new includes inside it
*******************************************************************************
at com.tc.object.ClientObjectManagerImpl.throwNonPortableException(Clien
tObjectManagerImpl.java:783)
at com.tc.object.ClientObjectManagerImpl.checkPortabilityOfLogicalAction
(ClientObjectManagerImpl.java:756)
at com.tc.object.tx.ClientTransactionManagerImpl.logicalInvoke(ClientTra
nsactionManagerImpl.java:504)
at com.tc.object.TCObjectLogical.logicalInvoke(TCObjectLogical.java:17)
at com.tc.object.bytecode.ManagerImpl.logicalInvoke(ManagerImpl.java:283
)
at com.tc.object.bytecode.ManagerUtil.logicalInvoke(ManagerUtil.java:312
)
at java.util.HashMap.put(Unknown Source)
at com.terracotta.session.SessionData.bindAttribute(SessionData.java:359
)
at com.terracotta.session.SessionData.__tc_wrapped_setAttributeReturnOld
(SessionData.java:255)
at com.terracotta.session.SessionData.setAttributeReturnOld(SessionData.
java)
at com.terracotta.session.SessionData.setAttribute(SessionData.java:247)
at org.edu.scut.lab24.web.controller.LoginController.login(LoginControll
er.java:146)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.directwebremoting.impl.DefaultRemoter$1.doFilter(DefaultRemoter.j
ava:740)
at org.directwebremoting.impl.DefaultRemoter.execute(DefaultRemoter.java
:744)
at org.directwebremoting.impl.DefaultRemoter.execute(DefaultRemoter.java
:593)
at org.edu.scut.lab24.web.dwr.SessionDwrRemote.execute(SessionDwrRemote.
java:61)
at org.directwebremoting.dwrp.BaseCallHandler.handle(BaseCallHandler.jav
a:90)
at org.directwebremoting.servlet.UrlProcessor.handle(UrlProcessor.java:1
20)
at org.directwebremoting.servlet.DwrServlet.doPost(DwrServlet.java:141)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl
icationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF
ilterChain.java:206)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerR
equestFilter.java:70)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl
icationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF
ilterChain.java:206)
at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.do
FilterInternal(OpenSessionInViewFilter.java:198)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerR
equestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl
icationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF
ilterChain.java:206)
at com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilt
er.java:119)
at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilte
r.java:55)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl
icationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF
ilterChain.java:206)
at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.j
ava:176)
at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:14
5)
at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewri
ter.java:92)
at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewrit
eFilter.java:381)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl
icationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF
ilterChain.java:206)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterIntern
al(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerR
equestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl
icationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF
ilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperV
alve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextV
alve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.j
ava:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.j
ava:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineVal
ve.java:109)
at org.terracotta.modules.tomcat.tomcat_5_5.SessionValve55.tcInvoke(Sess
ionValve55.java:68)
at org.terracotta.modules.tomcat.tomcat_5_5.SessionValve55.invoke(Sessio
nValve55.java:55)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.jav
a:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java
:849)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.proce
ss(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:45
4)
at java.lang.Thread.run(Thread.java:619)
|
|
|
03/11/2010 21:46:50
|
dongen
master
Joined: 01/19/2010 19:07:23
Messages: 78
Offline
|
初步看来是你的共享类里有引用jar包的field,将不需要共享的field设置为
<transient-fields>
<field-name>com.your.Class.not_need_shared_field</field-name>
</transient-fields>
另外请你帖出你的tc-config.xml文件及用例!
|
|
|
03/11/2010 21:55:01
|
aason
journeyman
Joined: 02/25/2010 19:25:06
Messages: 17
Offline
|
谢谢!tc-config.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!--
All content copyright Terracotta, Inc., unless otherwise indicated. All rights reserved.
-->
<!-- This is a Terracotta configuration file that has been pre-configured
for use with Tomcat.
For more information, please see the product documentation.
-->
<tc:tc-config xmlns:tc="http://www.terracotta.org/config"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.terracotta.org/schema/terracotta-5.xsd">
<!-- Tell DSO where the Terracotta server can be found -->
<servers>
<server host="192.168.0.67" name="server1">
<dso-port>9510</dso-port>
<data>%(user.home)/tools/terracotta/82/server-data</data>
<logs>%(user.home)/tools/terracotta/82/server-logs</logs>
<l2-group-port>9530</l2-group-port>
</server>
<server host="192.168.10.30" name="server2">
<dso-port>9510</dso-port>
<data>%(user.home)/tools/terracotta/85/server-data</data>
<logs>%(user.home)/tools/terracotta/85/server-logs</logs>
<l2-group-port>9530</l2-group-port>
</server>
<ha>
<mode>networked-active-passive</mode>
<networked-active-passive>
<election-time>5</election-time>
</networked-active-passive>
</ha>
</servers>
<!-- Tell DSO where to put the generated client logs -->
<clients>
<!-- <logs>%(user.home)/terracotta/client-logs</logs> -->
<modules>
<module name="tim-tomcat-6.0" version="2.1.0"/>
<module name="tim-session-common" version="2.1.0"/>
<module name="tim-tomcat-common" version="2.1.0"/>
<module name="tim-tomcat-5.5" version="2.1.0"/>
</modules>
</clients>
<application>
<dso>
<instrumented-classes>
<include>
<class-expression>*..*</class-expression>
</include>
</instrumented-classes>
<additional-boot-jar-classes>
<include>java.lang.String$CaseInsensitiveComparator</include>
<include>java.util.Locale</include>
<include>java.util.TimeZone</include>
</additional-boot-jar-classes>
<!-- Declare which web application context names should use DSO sessions -->
<web-applications>
<web-application session-locking="true" >terracottaweb</web-application>
<web-application session-locking="true" >sxweb</web-application>
</web-applications>
</dso>
</application>
</tc:tc-config>
|
|
|
03/11/2010 21:55:23
|
aason
journeyman
Joined: 02/25/2010 19:25:06
Messages: 17
Offline
|
不好意思,网络有点慢, 发多了一次.(这个内容是编辑了的)
|
|
|
03/11/2010 22:32:23
|
aason
journeyman
Joined: 02/25/2010 19:25:06
Messages: 17
Offline
|
transient-fields 这个怎样找出来?
|
|
|
03/12/2010 00:02:22
|
aason
journeyman
Joined: 02/25/2010 19:25:06
Messages: 17
Offline
|
能给点帮助吗? 或者给点思路! 谢谢!
|
|
|
03/12/2010 01:20:46
|
dongen
master
Joined: 01/19/2010 19:07:23
Messages: 78
Offline
|
1,首先我想知道你是要做DSO吗?如果是的话,你要明确哪些对象是要共享的,哪些是不需要的。建议你看看dso文档。建议你弄个Eclipse插件来配置tc-config.xml文件,这样会方便点。
2,如果是session集群的话。在terracotta3.2.1新版本中就不用那么多的配置了。
|
|
|
03/12/2010 01:39:23
|
dongen
master
Joined: 01/19/2010 19:07:23
Messages: 78
Offline
|
比如你配置的
<include>
<class-expression>*..*</class-expression>
</include>
意思就是将你>terracottaweb 和sxweb里所有的类都共享了。这样一来你terracottaweb类必然要应用jar包的api哪些jar也要共享进来。TCNonPortableObjectError的意思就是你还有一些类需要共享进来(也就是这些需要共享的类要配置到tc-config.xml中来)。
你这个问题解决方法是:找到真正要集群的那个类(要<instrumented-classes> )。这个类里要分布式共享的field比如一个map,这个map要(<root>)。其他不需要集群的类将它声明成(<transient-fields >)。好好理解下tc-config-reference.xml里面标签的意思吧。
|
|
|
03/12/2010 01:42:46
|
dongen
master
Joined: 01/19/2010 19:07:23
Messages: 78
Offline
|
我自己翻译部分tc-config-reference.xml文件。大家一起研究。
Filename |
tc-config-reference.xml |
Download
|
Description |
|
Filesize |
32 Kbytes
|
Downloaded: |
376 time(s) |
|
|
|
03/12/2010 23:28:11
|
aason
journeyman
Joined: 02/25/2010 19:25:06
Messages: 17
Offline
|
dongen,你真是好人, 我再仔细研究研究, 但是公司不能给太多时间我们去做这个事情, 其实我就只需要简单的SESSION复制,可它就是把对象都共享了.
而且是一共享就不得了, 因为我用的是HIBERNATE实体类做SESSIN,现在都不知道要不加与其它的在有关联, 只要一个一个排查了.
|
|
|
03/14/2010 18:56:11
|
dongen
master
Joined: 01/19/2010 19:07:23
Messages: 78
Offline
|
我大致明白你的意思了,你的意思就是将session共享到各个web容器上?这样你使用最新的terracotta3.2.1版本。不需要配置任何的<application>和<dso>就可以session复制了,只需要定义<server>和<client>就行。但是前提是session里的数据和对象必须实现序列化接口。
|
|
|
03/14/2010 20:04:42
|
aason
journeyman
Joined: 02/25/2010 19:25:06
Messages: 17
Offline
|
现在我用了V3.2.1,不做<web-applications> 的话两台机的SESSION是共享不到的, 但做了<web-applications>的话,必须使用dso, dongen能不能贴个tc-config.xml参考一下?
谢谢!
我的SERVERS是这样的:
<servers>
<server host="192.168.0.67" name="server1">
<dso-port>9510</dso-port>
<data>%(user.home)/tools/terracotta/82/server-data</data>
<logs>%(user.home)/tools/terracotta/82/server-logs</logs>
<l2-group-port>9530</l2-group-port>
</server>
<server host="192.168.10.30" name="server2">
<dso-port>9510</dso-port>
<data>%(user.home)/tools/terracotta/85/server-data</data>
<logs>%(user.home)/tools/terracotta/85/server-logs</logs>
<l2-group-port>9530</l2-group-port>
</server>
<ha>
<mode>networked-active-passive</mode>
<networked-active-passive>
<election-time>5</election-time>
</networked-active-passive>
</ha>
</servers>
|
|
|
03/14/2010 20:17:21
|
dongen
master
Joined: 01/19/2010 19:07:23
Messages: 78
Offline
|
我给你留言了。在你的Private Messages里。
|
|
|
03/16/2010 13:10:19
|
lima
consul
Joined: 06/22/2009 10:12:31
Messages: 361
Offline
|
用3.2.1完全不需要配置tc-config.xml.
只需要拷贝 session/terracotta-session-1.0.0.jar到相应的目录。然后配置filter或者valve就可以了。
文档在这里:
http://terracotta.org/documentation/ga/product-documentation-11.html#341161552_pgfId-1010080
是英文的。不过非常简单。只要注意针对你用的web容器做好相应的配置就行。
老马
|
|
|
03/16/2010 17:34:59
|
aason
journeyman
Joined: 02/25/2010 19:25:06
Messages: 17
Offline
|
看了老马的回复, 可以这么简单, 有点兴奋, 不过这两天没在公司没时间去搞, 回去再实践一下, 有问题的话再请教老马哥.
|
|
|
|