apache Thrift如何优化java服务端代码(实现一个服务端可调用多个实现类)

bing_chuan 发布于 2015/09/03 22:26
阅读 1K+
收藏 1

最近使用了Thrift框架实现java远程方法调用,但是发现不怎么好扩展,

第一个问题,怎么实现多个接口?

第二个问题Thrift都是靠.thrift文件生成java接口代码,可不可以继承减少重复代码?

我的代码实现,服务端


服务端
public class RPCService implements Runnable {
	// 注册端口
	public static final int SERVER_PORT = 6543;
	
	public void start() {  
		new Thread(new RPCService()).start();  
    } 


	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {  
            TNonblockingServerSocket socket = new TNonblockingServerSocket(SERVER_PORT);  
            final IContentService.Processor<IContentService.Iface> processor = new IContentService.Processor<IContentService.Iface>(new ContentRpcImpl());  
            THsHaServer.Args arg = new THsHaServer.Args(socket);  
            // 高效率的、密集的二进制编码格式进行数据传输  
            // 使用非阻塞方式,按块的大小进行传输,类似于 Java 中的 NIO  
            arg.protocolFactory(new TCompactProtocol.Factory());  
            arg.transportFactory(new TFramedTransport.Factory());  
            arg.processorFactory(new TProcessorFactory(processor));  
            TServer server = new THsHaServer(arg);
            System.out.println("使用非阻塞,高效二进制编码通信.");
            
            server.serve();  
            
        } catch (TTransportException e) {  
            e.printStackTrace();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
	}
}



在程序启动时调用这个线程:new RPCService().start();  


现在服务类已经搞好,问题是下面这段代码,这里是写死的,如果接口实现类(ContentRpcImpl)不止这一个,那如何扩展?总不能写一个接口创建一个服务端吧?跪求大神的如何解决这个问题。

final IContentService.Processor<IContentService.Iface> processor = new IContentService.Processor<IContentService.Iface>(new ContentRpcImpl()); 


客户端代码:

public static final String getRemoveData(int page,int rows){
		try {  
            TTransport transport = new TFramedTransport(new TSocket("localhost", 6543, 30000));  
            // 协议要和服务端一致
            TProtocol protocol = new TCompactProtocol(transport);  
            IContentService.Client client = new IContentService.Client(protocol);
            transport.open();
            String data=client.getContentList(page, rows);
            transport.close();  
            return data;
        } catch (TTransportException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        } catch (TException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }
		return "";
	}



加载中
0
李铁牛
李铁牛
模板模式,把重复的代码抽出来当个模板。
0
LarrySu
LarrySu

第一个问题: 使用TMultiplexedProcessor可以解决.

第二个问题: 可以手动优化thrift生成的java代码,比如删除重复代码.但这样做的弊端就是如果idl修改,再次生成java代码,那就要重新优化.

按理说,自动生成代码使用模板方式会更好,.但可惜的是thrift没有这么干,而是硬编码拼出来的,所以通过idl优化代码的空间极为有限.

返回顶部
顶部