我学习使用的hadoop源码是2.2版本,里面有一个相关Protocol Buffers的Jar包叫protobuf-java-2.5.0.jar。
使用protobuf生成的java类会import protobuf-java-2.5.0.jar中的类。所以Jar包的版本和protoc.exe版本必须一致。
可以去https://github.com/google/protobuf/releases?after=v2.6.0 找到protoc-2.5.0-win32.zip下载。
注:有一点要说明,你当然可以下载任意的版本,自己利用maven编译出来这个jar也是可以的。
1.下载后配置环境变量。
略
2.我们新建一个包proto,里面编写一个proto文件
option java_package="com.eg3";
option java_outer_classname="PersonProto";
message Person{
required string name = 1;
required int32 id = 2;
optional string email =3;
message PhoneNumber{
required string number = 1;
optional int32 type = 2;
}
repeated PhoneNumber phone = 4;
}
3.cmd命令中敲入如下代码,生成我们需要的java类
D:\>protoc -I=D:\workspaces\study\hadooptest\src\proto\ --java_out=D:\workspaces\study\hadooptest\src\ D:\workspaces\study\hadooptest\src\proto\person.proto
4.可以测试了,我定义一个Server和一个Client。这样Server生成一个person实例,而Client去获取这个person实例
package com.eg3;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.ProtocolSignature;
import org.apache.hadoop.ipc.RPC;
import com.eg3.PersonProto.Person;
public class Server {
interface ClientProtocol extends org.apache.hadoop.ipc.VersionedProtocol{
public static final long versionID = 1L;//不写出错
Person print();
}
public static class ClientProtocolImpl implements ClientProtocol{
@Override
public ProtocolSignature getProtocolSignature(String arg0, long arg1,
int arg2) throws IOException {
// TODO Auto-generated method stub
return null;
}
@Override
public long getProtocolVersion(String arg0, long arg1)
throws IOException {
// TODO Auto-generated method stub
return ClientProtocol.versionID;
}
@Override
public Person print() {
Person p = Person.newBuilder()
.setName("a")
.setEmail("b")
.setId(1)
.addPhone(Person.PhoneNumber.newBuilder()
.setNumber("11")
.setType(0))
.addPhone(Person.PhoneNumber.newBuilder()
.setNumber("22")
.setType(1))
.build();
return p;
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
org.apache.hadoop.ipc.RPC.Server server = new RPC.Builder(conf)
.setProtocol(ClientProtocol.class).setInstance(new ClientProtocolImpl())
.setBindAddress("127.0.0.1").setPort(12701).setNumHandlers(2).build();
server.start();
}
}
package com.eg3;
import java.net.InetSocketAddress;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import com.eg3.PersonProto.Person;
import com.eg3.Server.ClientProtocol;
public class Client {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
InetSocketAddress addr = new InetSocketAddress("127.0.0.1",12701);
ClientProtocol proxy =(ClientProtocol)RPC.getProxy(ClientProtocol.class,ClientProtocol.versionID,addr,conf);
System.out.println(((Person)proxy.print()).getEmail());
}
}