最近做NC和其他系统对接,客户要求使用Thrift接口服务,关于NC是否支持Thrift接口服务部署,下面给出NC63部署Thrift的样例。不一定是最好的实现方式。
一、NC开发环境添加jar包
具体添加哪些jar包,请参考另一篇博文 http://blog.csdn.net/qq_32553271/article/details/70161540
二、创建NC后台任务
package nc.thrift.server.service;
import org.apache.thrift.protocol.TBinaryProtocol.Factory;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TThreadPoolServer;
import org.apache.thrift.server.TThreadPoolServer.Args;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TTransportException;
import nc.bs.pub.pa.PreAlertObject;
import nc.bs.pub.taskcenter.BgWorkingContext;
import nc.bs.pub.taskcenter.IBackgroundWorkPlugin;
import nc.thrift.server.thrift.HelloWorldService;
import nc.thrift.server.thrift.HelloWorldService.Processor;
import nc.vo.pub.BusinessException;
/**
* 启动Thrift Service
* @author dingxm
*
*/
public class StartServer implements IBackgroundWorkPlugin{
/**
* 后台任务配置立即执行
*/
@Override
public PreAlertObject executeTask(BgWorkingContext arg0)
throws BusinessException {
StartThriftServiceThread thriftThread = new StartThriftServiceThread();
new Thread(thriftThread).start();
System.out.println("Thrift Server Started!");
return null;
}
}
为了防止线程阻塞引起一些列问题,这里创建多线程类用于启动Thrfit服务。
package nc.thrift.server.service;
import nc.thrift.server.thrift.HelloWorldService;
import nc.thrift.server.thrift.HelloWorldService.Processor;
import org.apache.thrift.protocol.TBinaryProtocol.Factory;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TThreadPoolServer;
import org.apache.thrift.server.TThreadPoolServer.Args;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TTransportException;
/**
* 多线程类启动Thrift Server
* @author dingxm
*
*/
public class StartThriftServiceThread implements Runnable {
@Override
public void run() {
startServer();
}
/**
* 启动Thrift服务器
*/
private void startServer() {
try {
//定义传输的socket,设置服务端口为6789
TServerSocket serverTransport = new TServerSocket(6789);
//设置协议工厂为TBinaryProtocol.Factory
Factory proFactory = new Factory(true,true);
//关联处理器与Hello服务的实现
HelloWorldService.Processor processor = new Processor(new HelloServiceImpl());
//定义服务端的参数值
Args args = new Args(serverTransport);
args.processor(processor);
args.protocolFactory(proFactory);
TServer server = new TThreadPoolServer(args);
//服务端开启服务
server.serve();
} catch (TTransportException e) {
e.printStackTrace();
}
}
}
三、NC中配置后台任务
1、后台任务类型注册
新增后台任务
2、后台任务部署
四、Thrift Client调用测试
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;
import org.junit.Test;
import thrift.HelloWorldService;
/**
* 客户端实现
* @author dingxm
* 创建客户端基本步骤:
* 1、创建Transport
* 2、创建TProtocol
* 3、基于TTransport和TProtocol创建 Client
* 4、调用Client的相应方法
*/
public class ClientTest {
@Test
public void startClient() {
// 设置调用的服务地址为本地,端口为6789
try {
TTransport transport = new TSocket("localhost", 6789);
transport.open();
// 数据传输协议有:二进制协议、压缩协议、JSON格式协议
// 这里使用二进制协议
// 协议要和服务端一致
TProtocol protocol = new TBinaryProtocol(transport);
HelloWorldService.Client client = new HelloWorldService.Client(protocol);
// 调用服务器端的服务方法
System.out.println(client.sayHello("Jack!"));
// 关闭
transport.close();
} catch (TTransportException e) {
e.printStackTrace();
} catch (TException e) {
e.printStackTrace();
}
}
}
测试输出:Hello Jack!
NC部署Thrift成功!
关于Thrift的用法可以参考:http://blog.csdn.net/qq_32553271/article/details/70161540