Spring Remoting了解与使用

HttpInvokerServiceExporter只是spring remoting的一种,还有HessianServiceExporter,BurlapServiceExporter
下面一个例子以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>

猜你喜欢

转载自bucketli.iteye.com/blog/1064319