下面一个例子以HttpInvokerServiceExporter为例的综合应用
也可以参考http://www.javaeye.com/topic/417767这个帖子
1.JettyDaemon类的start方法
server = new Server(); final SelectChannelConnector connector = new SelectChannelConnector(); connector.setReuseAddress(true); connector.setPort(port); server.addConnector(connector); WebAppContext webAppContext = new WebAppContext(); webAppContext.setContextPath("/"); ServletHolder sh = new ServletHolder(); sh.setName("helloServlt"); sh.setClassName(DispatcherServlet.class.getName()); sh.setInitParameter("contextConfigLocation","classpath:applicationContext-mvc.xml"); sh.setInitOrder(0); webAppContext.addServlet(sh, "*.sv"); webAppContext.setDescriptor("web/WEB-INF/web.xml"); webAppContext.setResourceBase("web"); // webAppContext.setConfigurationDiscovered(true); webAppContext.setParentLoaderPriority(true); server.setHandler(webAppContext); // 保证在退出时能优雅的退出jetty服务 // server.setStopAtShutdown(true); // 以下代码是关键 webAppContext.setClassLoader(applicationContext.getClassLoader()); XmlWebApplicationContext xmlWebAppContext = new XmlWebApplicationContext(); xmlWebAppContext.setParent(applicationContext); xmlWebAppContext.setConfigLocations(new String[] { "classpath:applicationContext-mvc.xml" }); xmlWebAppContext.setServletContext(webAppContext.getServletContext()); xmlWebAppContext.refresh(); webAppContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,xmlWebAppContext); server.start();
2.服务器bean配置,没啥特别,就是让spring自动调用start方法和stop方法
<bean id="webDaemon" class="com.taobao.monitor.pf.analyse.master.core.JettyDaemon" init-method="start" destroy-method="stop"> <property name="port" value="${master.port}"></property> </bean> 3.applicationContext-mvc.xml <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/task2slave.sv">task2slaveService</prop> </props> </property> </bean> <bean id="task2slaveService" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter"> <property name="service" ref="taskManager"/> <!--实现类--> <property name="serviceInterface"> <!--接口,需要提供给调用方--> <value>com.taobao.monitor.pf.analyse.inter.Task2Slave</value> </property> </bean>
4.调用方配置,直接使用task2Slave实例即可
<!-- spring http 远程调用 --> <bean id="httpInvokerRequestExecutor" class="org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor"> <property name="httpClient"> <bean class="org.apache.commons.httpclient.HttpClient"> <property name="timeout" value="${http.timeout}" /> <property name="httpConnectionManager"> <ref bean="multiThreadedHttpConnectionManager" /> </property> </bean> </property> </bean> <!-- 获取远程任务接口对象,用来请求需要的job和rule对象 --> <bean id="task2Slave" class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean"> <property name="serviceUrl"> <value>http://${master.ip}:${master.port}/task2slave.sv</value> </property> <property name="serviceInterface"> <value>com.taobao.monitor.pf.analyse.inter.Task2Slave</value> </property> <property name="httpInvokerRequestExecutor" ref="httpInvokerRequestExecutor"/> </bean>