Я новичок в Avro и пытаюсь смоделировать RPC, но вместо того, чтобы начинать с файла протокола Avro и затем генерировать классы Java, я хотел бы взять существующий интерфейс Java, но я столкнулся с некоторым ClassCastException
. Вот мой исходный код:
AvroMsgInterface.java
package de.elcattivo.example.avro;
import org.apache.avro.reflect.ReflectData;
public interface AvroMsgInterface {
public static final org.apache.avro.Protocol PROTOCOL = ReflectData.get().getProtocol(AvroMsgInterface.class);
Person invoke(String ruleset, Person ao);
}
AvroMessageImpl.java
package de.elcattivo.example.avro;
public class AvroMessageImpl implements AvroMsgInterface {
@Override
public Person invoke(String ruleset, Person ao) {
Person result = ao;
result.setName("Jim");
return null;
}
}
AvroTest.java
package de.elcattivo.example.avro;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.util.Arrays;
import javax.xml.validation.SchemaFactory;
import org.apache.avro.Protocol;
import org.apache.avro.Schema;
import org.apache.avro.SchemaBuilder;
import org.apache.avro.ipc.NettyServer;
import org.apache.avro.ipc.NettyTransceiver;
import org.apache.avro.ipc.Responder;
import org.apache.avro.ipc.Server;
import org.apache.avro.ipc.specific.SpecificRequestor;
import org.apache.avro.ipc.specific.SpecificResponder;
import org.apache.avro.reflect.ReflectData;
import example.proto.AOSender;
import example.proto.AvroPerson;
public class AvroTest {
private static Server server;
public static void main(String[] args) throws IOException {
Protocol prot = ReflectData.get().getProtocol(AvroMsgInterface.class);
Responder responder = new SpecificResponder(prot, new AvroMessageImpl());
server = new NettyServer(responder, new InetSocketAddress(InetAddress.getLocalHost(), 65125));
try(NettyTransceiver client = new NettyTransceiver(new InetSocketAddress(InetAddress.getLocalHost(), 65125))) {
AvroMsgInterface proxy = (AvroMsgInterface) SpecificRequestor.getClient(AvroMsgInterface.class, client);
proxy.invoke("test", new Person("John", 42));
} catch (Exception e) {
e.printStackTrace();
}
server.close();
}
}
и наконец Person.java
package de.elcattivo.example.avro;
public class Person {
String name;
Person father;
int id;
public Person(String name, int id) {
this.name = name;
this.id = id;
}
public Person() {}
public Person getFather() {return father;}
public void setFather(Person father) {this.father = father;}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public int getId() {return id;}
public void setId(int id) {this.id = id;}
@Override
public String toString() {
return "Person [name=" + name + ", id=" + id + "]";
}
}
Какие-нибудь предложения, как я могу продолжить? Я знаю, что в автоматически сгенерированных интерфейсах и классах avro происходит гораздо больше, но, как я уже сказал, я бы хотел этого избежать.