Weblogic集群

时间:2015-08-11 07:50:11

标签: spring jsf serialization weblogic cluster-computing

我们有一个包含几个节点的Weblogic集群,我们在其中部署了一个基于JSF,Richfaces,Hibernate和Spring的Web应用程序。

应用程序似乎运行良好,但我们在日志中每2-3秒出现以下错误:

<Jun 25, 2015 6:08:14 PM CEST> <Error> <Cluster> <BEA-000126> <All session objects should be serializable to replicate. Check the objects in the session. Failed to replicate a non-serializable object.
java.rmi.MarshalException: failed to marshal update(Lweblogic.cluster.replication.ROID;ILjava.io.Serializable;Ljava.lang.Object;); nested exception is:
    java.io.NotSerializableException: <Some @Service class name here>
    at weblogic.rjvm.BasicOutboundRequest.marshalArgs(BasicOutboundRequest.java:92)
    at weblogic.rmi.internal.BasicRemoteRef.invoke(BasicRemoteRef.java:300)
    at weblogic.cluster.replication.ReplicationManager_12120_WLStub.update(Unknown Source)
    at sun.reflect.GeneratedMethodAccessor773.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

我们没有在本地进行集群测试,所以我添加了一段代码来从一个控制器序列化对象,看看序列化在本地环境中是否正常:

ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ObjectOutputStream outputObj;
try {
    outputObj = new ObjectOutputStream(outputStream);
    outputObj.writeObject(service);
    outputObj.close();
    outputStream.close();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

service这里是stacktrace中显示的服务类的实例,用@Autowired注释。

我解决此问题的方法是为NotSerializableException设置断点并实现java.io.Serializable并在调试中抱怨的所有类中添加生成的串行版本UID。由于其中有很多,我最终对所有服务(注释为@Service)和所有存储库类(@Repository)执行了此操作。那些课程不再抱怨了,但现在我JaxWsClientProxy抱怨同样的。

我无法触摸此类,因为它在我的应用程序外部。此外,我在代码中找不到任何引用,所以我可以将它设置为瞬态。即使我找到任何参考文献,我也不确定这样做是否安全。

应用程序运行良好,因此我被建议可以忽略此异常。另一方面,我想知道是否应该在WS集群上复制服务/存储库类,以及正确的方法是什么。

编辑:根据@ sunrise76评论:

  你可以查看以下链接吗?   cxf.547215.n5.nabble.com/session-management-td549278.html。我认为   你的会话不应该是那个jar中类的类型 - sunrise76

我不确定如何使用您传递给我的信息,因此我检查了谁正在实例化此JaxWsClientProxy类。当实例化一个名为clientPEndpoint的bean和另一个名为clientGEndpoint的bean时,结果是Spring。

我检查了项目,并在我们拥有Apache Camel配置的XML上找到了它:

<jaxws:client id="clientPEndpoint"
        address="${ws.endPoint}" 
        serviceClass="<some service class>"
        endpointName="s:Connector" serviceName="s:ConnectorPortType"
        xmlns:s="<some namespace>">
        <jaxws:outInterceptors>
            <bean class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">
                <constructor-arg>
                    <map>
                        <entry key="action" value="UsernameToken" />
                        <entry key="user" value="${ws.user}" />
                        <entry key="passwordType" value="PasswordText" />
                        <entry key="passwordCallbackRef">
                            <ref bean="myPasswordCallback" />
                        </entry>
                    </map>
                </constructor-arg>
            </bean>
            <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" id="logOut" parent="abstractLoggingInterceptor"  />
        </jaxws:outInterceptors>
        <jaxws:inInterceptors> 
            <bean class="org.apache.cxf.interceptor.LoggingInInterceptor" id="logIn" parent="abstractLoggingInterceptor" /> 
        </jaxws:inInterceptors> 
        <jaxws:dataBinding>
            <bean class="org.apache.cxf.jaxb.JAXBDataBinding">
                <property name="extraClass">
                    <list>
                        <value><some ObjectFactory class></value>
                        ..........
                    </list>
                </property>
            </bean>
       </jaxws:dataBinding>
    </jaxws:client>

    <jaxws:client id="clientGEndpoint"
        address="${g.ws.endPoint}"      
        serviceClass="<some service class>"
        endpointName="s:WebServiceService" serviceName="s:WebService"
        xmlns:s="<some namespace>">
        <jaxws:outInterceptors>
            <bean class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">
                <constructor-arg>
                    <map>
                    <entry key="action" value="UsernameToken" />
                        <entry key="user" value="${g.ws.user}" />
                        <entry key="passwordType" value="PasswordText" />
                        <entry key="passwordCallbackRef">
                            <ref bean="gPasswordCallback" />
                        </entry>
                    </map>
                </constructor-arg>
            </bean>
             <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" id="logOut" parent="abstractLoggingInterceptor"  />
        </jaxws:outInterceptors>
        <jaxws:inInterceptors> 
            <bean class="org.apache.cxf.interceptor.LoggingInInterceptor" id="logIn" parent="abstractLoggingInterceptor" /> 
        </jaxws:inInterceptors> 
        <jaxws:dataBinding>
            <bean class="org.apache.cxf.jaxb.JAXBDataBinding">
                <property name="extraClass">
                    <list>
                        <value><some ObjectFactory class></value>
                    </list>
                </property>
            </bean>
       </jaxws:dataBinding>
    </jaxws:client>

我想说这个配置让Spring创建JaxWsClientProxy的实例,但我不完全确定。

无论如何,正如M.Deinum所说,我不确定我应该序列化服务/ DAO的实例,所以也许我应该针对一些Weblogic配置。

1 个答案:

答案 0 :(得分:-2)

你应该检查出Serializable的Class对象(服务),并且其中的变量具有可序列化的能力,例如int可以和ImageView不能。你应该在此变量之前添加瞬态。 NotSerializableException当你想序列化一个没有被标记为Serializable的对象时抛出它。你应该用serializable实现所有类。