Avro RPC с существующим Java-интерфейсом - PullRequest
0 голосов
/ 07 марта 2019

Я новичок в 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 происходит гораздо больше, но, как я уже сказал, я бы хотел этого избежать.

...