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

发布于 2021-11-27 10:40:09 字数 2715 浏览 683 评论 2

最近使用了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 "";
	}



如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

屌丝范 2021-11-29 09:35:38

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

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

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

爱的故事 2021-11-29 07:19:10

模板模式,把重复的代码抽出来当个模板。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文