Dear experts,

We are using Dubbo as service registry in our cluster.

Our DTOs are mainly using Avro for serialization/deserialization.
Fortunately, Dubbo also supports Avro serialization.

However, as to provide generality in our service APIs, we use GenericRecord as 
the DTO type to return for mainly every service method.

When running, we notice that Dubbo-Serialization-Avro is only accepting to 
serialize/deserialize SpecificRecord, the stack trace is as follows:

org.apache.avro.AvroRuntimeException: Not a Specific class: class 
org.apache.avro.generic.GenericData$Record
        at 
org.apache.avro.specific.SpecificData.createSchema(SpecificData.java:403)
        at 
org.apache.avro.reflect.ReflectData.createSchema(ReflectData.java:605)
        at 
org.apache.avro.specific.SpecificData$3.computeValue(SpecificData.java:335)
        at 
org.apache.avro.specific.SpecificData$3.computeValue(SpecificData.java:332)
        at java.lang.ClassValue.getFromHashMap(ClassValue.java:227)
        at java.lang.ClassValue.getFromBackup(ClassValue.java:209)
        at java.lang.ClassValue.get(ClassValue.java:115)
        at 
org.apache.avro.specific.SpecificData.getSchema(SpecificData.java:346)
        at 
org.apache.avro.reflect.ReflectDatumWriter.<init>(ReflectDatumWriter.java:47)
        at 
org.apache.avro.reflect.ReflectDatumWriter.<init>(ReflectDatumWriter.java:43)
        at 
org.apache.dubbo.common.serialize.avro.AvroObjectOutput.writeObject(AvroObjectOutput.java:100)
        at 
org.apache.dubbo.rpc.protocol.dubbo.DubboCodec.encodeResponseData(DubboCodec.java:203)
        at 
org.apache.dubbo.remoting.exchange.codec.ExchangeCodec.encodeResponse(ExchangeCodec.java:283)
        at 
org.apache.dubbo.remoting.exchange.codec.ExchangeCodec.encode(ExchangeCodec.java:71)
        at 
org.apache.dubbo.rpc.protocol.dubbo.DubboCountCodec.encode(DubboCountCodec.java:40)
        at 
org.apache.dubbo.remoting.transport.netty4.NettyCodecAdapter$InternalEncoder.encode(NettyCodecAdapter.java:70)
        at 
io.netty.handler.codec.MessageToByteEncoder.write(MessageToByteEncoder.java:107)
        at 
io.netty.channel.AbstractChannelHandlerContext.invokeWrite0(AbstractChannelHandlerContext.java:738)
        at 
io.netty.channel.AbstractChannelHandlerContext.invokeWrite(AbstractChannelHandlerContext.java:730)
        at 
io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:816)
        at 
io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:723)
        at 
io.netty.handler.timeout.IdleStateHandler.write(IdleStateHandler.java:302)
        at 
io.netty.channel.AbstractChannelHandlerContext.invokeWrite0(AbstractChannelHandlerContext.java:738)
        at 
io.netty.channel.AbstractChannelHandlerContext.invokeWrite(AbstractChannelHandlerContext.java:730)
        at 
io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:816)
        at 
io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:723)
        at 
io.netty.channel.ChannelDuplexHandler.write(ChannelDuplexHandler.java:106)
        at 
org.apache.dubbo.remoting.transport.netty4.NettyServerHandler.write(NettyServerHandler.java:100)
        at 
io.netty.channel.AbstractChannelHandlerContext.invokeWrite0(AbstractChannelHandlerContext.java:738)
        at 
io.netty.channel.AbstractChannelHandlerContext.invokeWrite(AbstractChannelHandlerContext.java:730)
        at 
io.netty.channel.AbstractChannelHandlerContext.access$1900(AbstractChannelHandlerContext.java:38)
        at 
io.netty.channel.AbstractChannelHandlerContext$AbstractWriteTask.write(AbstractChannelHandlerContext.java:1081)
        at 
io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask.write(AbstractChannelHandlerContext.java:1128)
        at 
io.netty.channel.AbstractChannelHandlerContext$AbstractWriteTask.run(AbstractChannelHandlerContext.java:1070)
        at 
io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163)
        at 
io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404)
        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:465)
        at 
io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884)
        at 
io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
        at java.lang.Thread.run(Thread.java:748)

We wonder if there is any solution to allow the serialization of GenericRecord?

Best regards
Tien Dat PHAN

Reply via email to