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