client:
public void start() {
try {
System.out.println("开始时间:"+DateUtil.getCurTimeAllData());
//----------------------------------------
ExecutorService exec = Executors.newCachedThreadPool();
// 50个线程可以同时访问
final Semaphore semp = new Semaphore(50);
for (int index = 1; index <= 20000; index++) {
final int NO = index;
Runnable run = new Runnable() {
public void run() {
try {
// 获取许可
semp.acquire();
// System.out.println("发送第" + NO + "笔,时间:"+DateUtil.getCurTimeAllData());
TSocket tSocket = new TSocket("localhost", 7097, 10000);
//使用非阻塞传输方式
TTransport tTransport = new TFramedTransport(tSocket);
//二进制传输协议
TProtocol protocol = new TCompactProtocol(tTransport);
Service.Client client = new Service.Client(protocol);
open(tTransport);
client.report("msg");
close(tTransport);
// 释放
// System.out.println("|第:" + NO + " 个线程释放");
semp.release();
} catch (Exception e) {
e.printStackTrace();
}
}
};
exec.execute(run);
}
// 退出线程池
exec.shutdown();
System.out.println("结束时间:"+DateUtil.getCurTimeAllData());
} catch (Exception e) {
e.printStackTrace();
}
}
server:
public void startServer() {
try {
System.out.println("Server start...");
// 非阻塞式的Transport,配合TFrameTransport使用
TNonblockingServerSocket serverTransport = new TNonblockingServerSocket(7097);
HtServer htServer = new HtServer();
// 关联处理器Processor与Service服务的实现
TProcessor process = new Service.Processor<Service.Iface>(htServer);
//多线程服务模型
// TThreadPoolServer.Args args = new TNonblockingServer.Args(serverTransport);//设置服务类型,TNonblocking是处理多线程比较好的
// TNonblockingServer.Args args = new TNonblockingServer.Args(serverTransport);
// 采用TThreadedSelectorServer.Args配置可并发处理客户端请求
TNonblockingServer.Args args = new TNonblockingServer.Args(serverTransport);
// 指定业务处理器processor
args.processor(process);
args.protocolFactory(new TCompactProtocol.Factory());
args.transportFactory(new TFramedTransport.Factory());
TServer server = new TNonblockingServer(args);
htServer.start();
server.serve();
} catch (Exception e) {
System.out.println("Server start error");
e.printStackTrace();
}
}
main方法启动server服务,然后再启动thrift 客户端模拟发送消息,类需要实现Iface接口,thrift的安装及使用方法请自行百度