dangdangdotcom / dubbox

Dubbox now means Dubbo eXtensions, and it adds features like RESTful remoting, Kyro/FST serialization, etc to the Dubbo service framework.
http://dangdangdotcom.github.io/dubbox
Apache License 2.0
4.9k stars 2.06k forks source link

dubbox出现StackOverflowError #250

Open youngsky303 opened 7 years ago

youngsky303 commented 7 years ago

com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method getTest in the service com.asrsc.psp.common.service.test.TestService. Tried 3 times of the providers [192.168.1.250:20880] (1/1) from the registry 192.168.1.151:2181 on the consumer 192.168.1.250 using the dubbo version 2.8.4. Last error is: Failed to invoke remote method: getTest, provider: dubbo://192.168.1.250:20880/com.asrsc.psp.common.service.test.TestService?anyhost=true&application=psp-web&check=false&dubbo=2.8.4&generic=false&interface=com.asrsc.psp.common.service.test.TestService&methods=getTest&pid=3700&revision=0.0.1-SNAPSHOT&side=consumer&timestamp=1484013408295&version=1.0, cause: Failed to send response: Response [id=8, version=2.0.0, status=20, event=false, error=null, result=RpcResult [result=com.asrsc.psp.common.entity.test.TestBean@12602bd, exception=null]], cause: java.lang.StackOverflowError java.lang.StackOverflowError at java.lang.reflect.Field.getInt(Field.java:574) at com.alibaba.com.caucho.hessian.io.JavaSerializer$IntFieldSerializer.serialize(JavaSerializer.java:351) at com.alibaba.com.caucho.hessian.io.JavaSerializer.writeInstance(JavaSerializer.java:263) at com.alibaba.com.caucho.hessian.io.JavaSerializer.writeObject(JavaSerializer.java:227) at com.alibaba.com.caucho.hessian.io.Hessian2Output.writeObject(Hessian2Output.java:408) at com.alibaba.com.caucho.hessian.io.JavaSerializer.writeObject(JavaSerializer.java:203) at com.alibaba.com.caucho.hessian.io.Hessian2Output.writeObject(Hessian2Output.java:408) at com.alibaba.com.caucho.hessian.io.JavaSerializer$FieldSerializer.serialize(JavaSerializer.java:313) at com.alibaba.com.caucho.hessian.io.JavaSerializer.writeInstance(JavaSerializer.java:263) at com.alibaba.com.caucho.hessian.io.JavaSerializer.writeObject(JavaSerializer.java:227) at com.alibaba.com.caucho.hessian.io.Hessian2Output.writeObject(Hessian2Output.java:408) at com.alibaba.com.caucho.hessian.io.JavaSerializer.writeObject(JavaSerializer.java:203) at com.alibaba.com.caucho.hessian.io.Hessian2Output.writeObject(Hessian2Output.java:408) at com.alibaba.com.caucho.hessian.io.JavaSerializer$FieldSerializer.serialize(JavaSerializer.java:313) 这是consumer端的异常日志,需要序列化的bean是TestBean private String name;

private Integer old;

private String address;

@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;

这是TestBean的属性,如果去掉private LocalDateTime createTime;则可以正常运行。感觉是序列化的问题,dubbo默认序列化是Hessian2,修改为fst provider端配置文件代码大致如下:

<dubbo:application name="psp-server"  />
<!-- 使用zookeeper注册中心暴露服务地址 -->
<!--<dubbo:registry protocol="zookeeper" address="192.168.1.151:2181?backup=192.168.1.152:2181,192.168.1.153:2181" />-->
<dubbo:registry address="zookeeper://192.168.1.151:2181"/>
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />
<!--修改dubbo默认序列化方式,这是后加的-->
<dubbo:protocol name="dubbo" serialization="fst" optimizer="com.asrsc.psp.server.service.SerializationOptimizerImpl" />
<!-- 服务接口,此处有个多个服务-->
<dubbo:service interface="com.asrsc.psp.common.service.OrderService"                            ref="orderService" />

在pom文件与dubbox相关的引入:

com.alibaba dubbo 2.8.4
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>dubbo-rpc-rest</artifactId>
        <version>2.8.4</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>dubbo-rpc-webservice</artifactId>
        <version>2.8.4</version>
    </dependency>
    <dependency>
        <groupId>com.101tec</groupId>
        <artifactId>zkclient</artifactId>
        <version>0.2</version>
    </dependency>

    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>3.3.6</version>
        <exclusions>
            <exclusion>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.16</version>
    </dependency>
    <dependency>
        <groupId>de.ruedigermoeller</groupId>
        <artifactId>fst</artifactId>
        <version>1.55</version>
    </dependency>

想使用fst方式序列化,但是错误依然如故,感觉好像是consumer端还是使用hessian2,有没有人遇到过类似问题?

cztchoice commented 6 years ago

旧版本的dubbo使用的hessian 不支持 LocalDateTime序列化,结合这个issue https://github.com/apache/incubator-dubbo/issues/2031

导致出现StackOverflowError,修复方式,就是使用Date替换LocalDateTime,或者使用更新版本的支持Java 8 类型的dubbo