jetty实例
package com.jetty; import java.io.IOException; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.eclipse.jetty.continuation.Continuation; import org.eclipse.jetty.continuation.ContinuationSupport; import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.AbstractHandler; import org.eclipse.jetty.server.nio.SelectChannelConnector; import org.eclipse.jetty.util.thread.QueuedThreadPool; import com.annotation.HBean; import com.annotation.annoBean.AnnotationBeanLoader; public class JettyServer { private final ExecutorService es = Executors.newCachedThreadPool(); public void start(String host,int port) throws Exception{ Server server = new Server();//服务 //TCP监听 SelectChannelConnector appBeanConn = new SelectChannelConnector(); appBeanConn.setUseDirectBuffers(false); appBeanConn.setHost(host); appBeanConn.setPort(port); appBeanConn.setThreadPool(new QueuedThreadPool(20)); appBeanConn.setName("appBeans"); server.addConnector(appBeanConn); //处理类 server.setHandler(new HttpAppBeanHandler()); server.start(); server.join(); } private class HttpAppBeanHandler extends AbstractHandler{ private static final String CALLTYPE = "calltype"; Map<String, Class<HBean>> map; public HttpAppBeanHandler() throws Exception{ map = AnnotationBeanLoader.loadHandlerBean(); } public void invokeBean(String id,HttpServletRequest request,HttpServletResponse response) throws InstantiationException, IllegalAccessException{ HBean bean = map.get(id).newInstance();//获取bean bean.init(request,response);//初始化bean bean.response(request,response);//相应bean } @Override public void handle(String str, final Request baseRequest, final HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException { // String method = request.getMethod(); final String callType = (String) request.getAttribute(CALLTYPE); final Continuation continuation = ContinuationSupport.getContinuation(request); if(continuation.isExpired()){ response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,"http bean invocation timeout"); Future<?> f = (Future<?>) request.getAttribute("KEY_INVOCATION_FUTURN"); if(f != null) f.cancel(true); }else{ continuation.setTimeout(1000*3); continuation.suspend(response); Future<?> f = es.submit(new Runnable() { @Override public void run() { try { invokeBean(callType, request, response); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } continuation.complete(); }//run });//future } } } }
server使用httphandler,在handler中根据请求id,分发到处理业务的实体bean接口上
/** * 处理实体类接口 * @author y */ public interface HBean { /** * 初始化bean * @param request * @param response */ void init(HttpServletRequest request,HttpServletResponse response); /** * 相应 * @param request * @param response */ void response(HttpServletRequest request,HttpServletResponse response); }
实体bean用注释作为id区分,加载获取指定目录下的所有类,用注释“包名”-“id"作为实体bean的id
/** * 定义处理bean的ID注解 * 包含ID前缀包,ID名称 * ID前缀包默认值"com.dz" * @author y */ @Target(ElementType.TYPE)//放在哪 @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited public @interface HBID { public String id(); public String catalog() default "com.dz"; }
加载子类目录 http://blackproof.iteye.com/blog/2015036
jetty的continuation分析 http://blog.csdn.net/kobejayandy/article/details/11874353
扫描二维码关注公众号,回复:
558024 查看本文章