thrift java多线程非阻塞同步/异步调用实例

本文由larrylgq编写,转载请注明出处:http://blog.csdn.net/larrylgq/article/details/7497342

作者:吕桂强

邮箱:larry.lv.word@gmail.com


首先创建thrift文件

namespace java thriftservice Hello{  string helloString(1:string para)}
执行thrift -gen java test.thrift会生成一个Hello.java文件
将Hello.java文件拷贝至IDE
server端代码:


package com.thrift.test.thrift;

import org.apache.thrift.TProcessorFactory;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.server.THsHaServer;
import org.apache.thrift.server.TServer;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TNonblockingServerSocket;
import org.apache.thrift.transport.TTransportException;

/**
 * @author 吕桂强
 * @email larry.lv.word@gmail.com
 * @version 创建时间:2012-4-24 下午8:14:50
 */
public class Server {
	public final static int PORT = 8989;

	@SuppressWarnings({ "rawtypes", "unchecked" })
	private void start() {
		try {
			TNonblockingServerSocket socket = new TNonblockingServerSocket(PORT);
			final Hello.Processor processor = new Hello.Processor(new HelloImpl());
			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);
			server.serve();
			System.out.println("#服务启动-使用:非阻塞&高效二进制编码");
		} catch (TTransportException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String args[]) {
		Server srv = new Server();
		srv.start();
	}
}



client端代码:

package com.thrift.test.Async;

import java.io.IOException;

import org.apache.thrift.TApplicationException;
import org.apache.thrift.TException;
import org.apache.thrift.async.TAsyncClientManager;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.protocol.TProtocolFactory;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TNonblockingSocket;
import org.apache.thrift.transport.TNonblockingTransport;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;

/**
 * @author 吕桂强
 * @email larry.lv.word@gmail.com
 * @version 创建时间:2012-4-24 下午8:17:38
 */
public class Client {
	public static final String address = "127.0.0.1";
	public static final int port = 8989;
	public static final int clientTimeout = 30000;

	public static void main_syn() {
		TTransport transport = new TFramedTransport(new TSocket(address, port, clientTimeout));
		TProtocol protocol = new TCompactProtocol(transport);
		Hello.Client client = new Hello.Client(protocol);

		try {
			transport.open();
			System.out.println(client.helloString("larry"));

		} catch (TApplicationException e) {
			System.out.println(e.getMessage() + " " + e.getType());
		} catch (TTransportException e) {
			e.printStackTrace();
		} catch (TException e) {
			e.printStackTrace();
		}
		transport.close();
	}

	public static void main_asy() throws Exception {
		try {
			TAsyncClientManager clientManager = new TAsyncClientManager();
			TNonblockingTransport transport = new TNonblockingSocket(address, port, clientTimeout);
			TProtocolFactory protocol = new TCompactProtocol.Factory();
			Hello.AsyncClient asyncClient = new Hello.AsyncClient(protocol, clientManager, transport);
			System.out.println("Client calls .....");
			MyCallback callBack = new MyCallback();
			asyncClient.helloString("larry", callBack);

			while (true) {
				Thread.sleep(1);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) throws Exception {
		main_asy();
	}
}

client使用到的回调函数:

package com.thrift.test.Async;

import org.apache.thrift.TException;
import org.apache.thrift.async.AsyncMethodCallback;

import com.thrift.test.Async.Hello.AsyncClient.helloString_call;

/**
 * @author 吕桂强
 * @email larry.lv.word@gmail.com
 * @version 创建时间:2012-4-25 上午11:17:32
 */
public class MyCallback implements AsyncMethodCallback<helloString_call> {

	// 返回结果
	@Override
	public void onComplete(helloString_call response) {
		System.out.println("onComplete");
		try {
			System.out.println(response.getResult().toString());
		} catch (TException e) {
			e.printStackTrace();
		}
	}

	// 返回异常
	@Override
	public void onError(Exception exception) {
		System.out.println("onError");
	}

}





评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值