[Logo] Terracotta Discussion Forums (LEGACY READ-ONLY ARCHIVE)
  [Search] Search   [Recent Topics] Recent Topics   [Members]  Member Listing   [Groups] Back to home page 
[Register] Register / 
[Login] Login 
[Expert]
TCNonPortableObjectError这个是什么问题?  XML
Forum Index -> Terracotta 中文社区 Go to Page: 1, 2 Next 
Author Message
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)
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文件及用例!
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>
aason

journeyman

Joined: 02/25/2010 19:25:06
Messages: 17
Offline

不好意思,网络有点慢, 发多了一次.(这个内容是编辑了的)
aason

journeyman

Joined: 02/25/2010 19:25:06
Messages: 17
Offline

transient-fields 这个怎样找出来?
aason

journeyman

Joined: 02/25/2010 19:25:06
Messages: 17
Offline

能给点帮助吗? 或者给点思路! 谢谢!
dongen

master

Joined: 01/19/2010 19:07:23
Messages: 78
Offline

1,首先我想知道你是要做DSO吗?如果是的话,你要明确哪些对象是要共享的,哪些是不需要的。建议你看看dso文档。建议你弄个Eclipse插件来配置tc-config.xml文件,这样会方便点。
2,如果是session集群的话。在terracotta3.2.1新版本中就不用那么多的配置了。
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里面标签的意思吧。
dongen

master

Joined: 01/19/2010 19:07:23
Messages: 78
Offline

我自己翻译部分tc-config-reference.xml文件。大家一起研究。
 Filename tc-config-reference.xml [Disk] Download
 Description
 Filesize 32 Kbytes
 Downloaded:  376 time(s)

aason

journeyman

Joined: 02/25/2010 19:25:06
Messages: 17
Offline

dongen,你真是好人, 我再仔细研究研究, 但是公司不能给太多时间我们去做这个事情, 其实我就只需要简单的SESSION复制,可它就是把对象都共享了.
而且是一共享就不得了, 因为我用的是HIBERNATE实体类做SESSIN,现在都不知道要不加与其它的在有关联, 只要一个一个排查了.
dongen

master

Joined: 01/19/2010 19:07:23
Messages: 78
Offline

我大致明白你的意思了,你的意思就是将session共享到各个web容器上?这样你使用最新的terracotta3.2.1版本。不需要配置任何的<application>和<dso>就可以session复制了,只需要定义<server>和<client>就行。但是前提是session里的数据和对象必须实现序列化接口。
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>
dongen

master

Joined: 01/19/2010 19:07:23
Messages: 78
Offline

我给你留言了。在你的Private Messages里。
lima

consul
[Avatar]
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容器做好相应的配置就行。

老马
aason

journeyman

Joined: 02/25/2010 19:25:06
Messages: 17
Offline

看了老马的回复, 可以这么简单, 有点兴奋, 不过这两天没在公司没时间去搞, 回去再实践一下, 有问题的话再请教老马哥.
 
Forum Index -> Terracotta 中文社区 Go to Page: 1, 2 Next 
Go to:   
Powered by JForum 2.1.7 © JForum Team