package com.midea.cloudSearch.thrift.server; import java.lang.instrument.IllegalClassFormatException; import java.lang.reflect.Constructor; import java.util.Map; import org.apache.thrift.TMultiplexedProcessor; import org.apache.thrift.TProcessor; import org.apache.thrift.server.TServer; import org.apache.thrift.server.TThreadPoolServer; import org.apache.thrift.transport.TServerSocket; import org.springframework.context.support.ClassPathXmlApplicationContext; public class SpringThriftServer { private Map<String, Object> serviceList; private int port; private TServerSocket serverTransport; public Map<String, Object> getServiceList() { return serviceList; } public void setServiceList(Map<String, Object> serviceList) { this.serviceList = serviceList; } public int getPort() { return port; } public void setPort(int port) { this.port = port; } public TServerSocket getServerTransport() { return serverTransport; } public void setServerTransport(TServerSocket serverTransport) { this.serverTransport = serverTransport; } public void init(){ try { serverTransport = new TServerSocket(port); TMultiplexedProcessor mprocessor = new TMultiplexedProcessor(); for(Map.Entry<String, Object> entry : serviceList.entrySet()){ Object obj = entry.getValue(); Class<?> serviceClass = obj.getClass(); // 获取实现类接口 Class<?>[] interfaces = serviceClass.getInterfaces(); TProcessor processor = null; String serviceName = null; for(Class<?> clazz:interfaces){ System.out.println("ThriftServer=========" + clazz.getSimpleName()); String className = clazz.getEnclosingClass().getSimpleName(); serviceName = clazz.getEnclosingClass().getName(); System.out.println("serviceName=========" + serviceName + " " + className); String pname = serviceName + "$Processor"; try { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); Class<?> pclass = classLoader.loadClass(pname); if (!TProcessor.class.isAssignableFrom(pclass)) { continue; } Constructor<?> constructor = pclass.getConstructor(clazz); processor = (TProcessor) constructor.newInstance(obj); System.out.println("processor=========" + processor.getClass().getSimpleName()); mprocessor.registerProcessor(className, processor); break; } catch (Exception e) { e.printStackTrace(); } } if (processor == null) { throw new IllegalClassFormatException("service-class should implements Iface"); } } TServer server = new TThreadPoolServer(new TThreadPoolServer.Args( serverTransport).processor(mprocessor)); System.out.println("Starting server on port 7911 ..."); server.serve(); } catch (Exception e) { e.printStackTrace(); } } public void close(){ serverTransport.close(); } public static void main(String[] args){ try { new ClassPathXmlApplicationContext("classpath:spring-context-thrift-server.xml"); //Thread.sleep(3000000); } catch (Exception e) { e.printStackTrace(); } } }