天天看点

Http Invoker的Spring Remoting支持

Spring HTTP Invoker是Java到Java远程处理的重要解决方案。 该技术使用标准的Java序列化机制通过HTTP公开服务,并且可以被视为替代解决方案,而不是Hessian和Burlap中的自定义序列化。 而且,它仅由Spring提供,因此客户端和服务器应用程序都必须基于Spring。

Spring通过HttpInvokerProxyFactoryBean和HttpInvokerServiceExporter支持HTTP调用程序基础结构。 HttpInvokerServiceExporter,它将指定的服务bean导出为HTTP调用程序服务端点,可通过HTTP调用程序代理访问。 HttpInvokerProxyFactoryBean是用于HTTP调用程序代理的工厂bean。

此外,还提供了有关Spring Remoting简介和RMI Service&Client示例项目的Spring Remoting支持和RMI文章。

让我们看一下Spring Remoting Support,以开发Http Invoker Service&Client。

二手技术:

  • JDK 1.6.0_31
  • 春天3.1.1
  • Tomcat 7.0
  • Maven的3.0.2
Http Invoker的Spring Remoting支持

步骤1:建立已完成的专案

创建一个Maven项目,如下所示。 (可以使用Maven或IDE插件来创建它)。

步骤2:图书馆

Spring依赖项已添加到Maven的pom.xml中。

<!-- Spring 3.1.x dependencies -->
<properties>
    <spring.version>3.1.1.RELEASE</spring.version>
</properties>
 
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-remoting</artifactId>
        <version>2.0.8</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
    </dependency>
<dependencies>
           

步骤3:建立使用者类别

创建一个新的用户类。

package com.otv.user;
 
import java.io.Serializable;
 
/**
 * User Bean
 *
 * @author  onlinetechvision.com
 * @since   24 Feb 2012
 * @version 1.0.0
 *
 */
public class User implements Serializable {
 
    private long id;
    private String name;
    private String surname;
 
    /**
     * Get User Id
     *
     * @return long id
     */
    public long getId() {
        return id;
    }
 
    /**
     * Set User Id
     *
     * @param long id
     */
    public void setId(long id) {
        this.id = id;
    }
 
    /**
     * Get User Name
     *
     * @return long id
     */
    public String getName() {
        return name;
    }
 
    /**
     * Set User Name
     *
     * @param String name
     */
    public void setName(String name) {
        this.name = name;
    }
 
    /**
     * Get User Surname
     *
     * @return long id
     */
    public String getSurname() {
        return surname;
    }
 
    /**
     * Set User Surname
     *
     * @param String surname
     */
    public void setSurname(String surname) {
        this.surname = surname;
    }
 
    @Override
    public String toString() {
        StringBuilder strBuilder = new StringBuilder();
        strBuilder.append("Id : ").append(getId());
        strBuilder.append(", Name : ").append(getName());
        strBuilder.append(", Surname : ").append(getSurname());
        return strBuilder.toString();
    }
}
           

步骤4:建立ICacheService介面

创建了代表远程缓存服务接口的ICacheService接口。

package com.otv.cache.service;
 
import java.util.concurrent.ConcurrentHashMap;
 
import com.otv.user.User;
 
/**
 * Cache Service Interface
 *
 * @author  onlinetechvision.com
 * @since   10 Mar 2012
 * @version 1.0.0
 *
 */
public interface ICacheService {
 
    /**
     * Get User Map
     *
     * @return ConcurrentHashMap User Map
     */
    public ConcurrentHashMap<Long, User> getUserMap();
 
}
           

步骤5:创建CacheService类

CacheService类是通过实现ICacheService接口创建的。 它提供对远程缓存的访问…

package com.otv.cache.service;
 
import java.util.concurrent.ConcurrentHashMap;
 
import com.otv.user.User;
 
/**
 * Cache Service Implementation
 *
 * @author  onlinetechvision.com
 * @since   10 Mar 2012
 * @version 1.0.0
 *
 */
public class CacheService implements ICacheService {
 
    //User Map is injected...
    ConcurrentHashMap<Long, User> userMap;
 
    /**
     * Get User Map
     *
     * @return ConcurrentHashMap User Map
     */
    public ConcurrentHashMap<Long, User> getUserMap() {
        return userMap;
    }
 
    /**
     * Set User Map
     *
     * @param ConcurrentHashMap User Map
     */
    public void setUserMap(ConcurrentHashMap<Long, User> userMap) {
        this.userMap = userMap;
    }
 
}
           

步骤6:建立IHttpUserService接口

创建了代表Http用户服务接口的IHttpUserService。 此外,它为Http客户端提供了远程方法。

package com.otv.http.server;
 
import java.util.List;
 
import com.otv.user.User;
 
/**
 * Http User Service Interface
 *
 * @author  onlinetechvision.com
 * @since   10 Mar 2012
 * @version 1.0.0
 *
 */
public interface IHttpUserService {
 
    /**
     * Add User
     *
     * @param  User user
     * @return boolean response of the method
     */
    public boolean addUser(User user);
 
    /**
     * Delete User
     *
     * @param  User user
     * @return boolean response of the method
     */
    public boolean deleteUser(User user);
 
    /**
     * Get User List
     *
     * @return List user list
     */
    public List<User> getUserList();
 
}
           

步骤7:创建HttpUserService类

HttpUserService类是通过实现IHttpUserService接口创建的。

package com.otv.http.server;
 
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
 
import com.otv.cache.service.ICacheService;
import com.otv.user.User;
 
/**
 * Http User Service Implementation
 *
 * @author  onlinetechvision.com
 * @since   10 Mar 2012
 * @version 1.0.0
 *
 */
public class HttpUserService implements IHttpUserService {
 
    private static Logger logger = Logger.getLogger(HttpUserService.class);
 
    //Remote Cache Service is injected...
    ICacheService cacheService;
 
    /**
     * Add User
     *
     * @param  User user
     * @return boolean response of the method
     */
    public boolean addUser(User user) {
        getCacheService().getUserMap().put(user.getId(), user);
        logger.debug("User has been added to cache. User : "+getCacheService().getUserMap().get(user.getId()));
        return true;
    }
 
    /**
     * Delete User
     *
     * @param  User user
     * @return boolean response of the method
     */
    public boolean deleteUser(User user) {
        getCacheService().getUserMap().remove(user.getId());
        logger.debug("User has been deleted from cache. User : "+user);
        return true;
    }
 
    /**
     * Get User List
     *
     * @return List user list
     */
    public List<User> getUserList() {
        List<User> list = new ArrayList<User>();
        list.addAll(getCacheService().getUserMap().values());
        logger.debug("User List : "+list);
        return list;
    }
 
    /**
     * Get Remote Cache Service
     *
     * @return ICacheService Remote Cache Service
     */
    public ICacheService getCacheService() {
        return cacheService;
    }
 
    /**
     * Set Remote Cache Service
     *
     * @param ICacheService Remote Cache Service
     */
    public void setCacheService(ICacheService cacheService) {
        this.cacheService = cacheService;
    }
 
}
           

步骤8:创建HttpUserService-servlet.xml

HttpUserService应用程序上下文如下所示。 该xml必须命名为your_servlet_name-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:util="http://www.springframework.org/schema/util"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
 
http://www.springframework.org/schema/util
 
http://www.springframework.org/schema/util/spring-util-3.0.xsd">
 
    <!-- User Map Declaration -->
    <bean id="UserMap" class="java.util.concurrent.ConcurrentHashMap" />
 
    <!-- Cache Service Declaration -->
    <bean id="CacheService" class="com.otv.cache.service.CacheService">
        <property name="userMap" ref="UserMap"/>
    </bean>   
 
    <!-- Http User Service Bean Declaration -->
    <bean id="HttpUserService" class="com.otv.http.server.HttpUserService" >
        <property name="cacheService" ref="CacheService"/>
    </bean>
 
    <!-- Http Invoker Service Declaration -->
    <bean id="HttpUserServiceExporter" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
 
        <!-- service represents Service Impl -->
        <property name="service" ref="HttpUserService"/>
 
        <!-- serviceInterface represents Http Service Interface which is exposed -->
        <property name="serviceInterface" value="com.otv.http.server.IHttpUserService"/>
 
    </bean>
 
    <!-- Mapping configurations from URLs to request handler beans -->
    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/HttpUserService">HttpUserServiceExporter</prop>
            </props>
        </property>
    </bean>
 
</beans>
           

步骤9:创建web.xml

web.xml的配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
 
    <display-name>OTV_SpringHttpInvoker</display-name>
 
    <!-- Spring Context Configuration' s Path definition -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/HttpUserService-servlet.xml
        </param-value>
    </context-param>
 
    <!-- The Bootstrap listener to start up and shut down Spring's root WebApplicationContext. It is registered to Servlet Container -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
 
    <!-- Central dispatcher for HTTP-based remote service exporters. Dispatches to registered handlers for processing web requests.-->
    <servlet>
        <servlet-name>HttpUserService</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet>
 
    <!-- Servlets should be registered with servlet container and mapped with url for the http requests. -->
    <servlet-mapping>
        <servlet-name>HttpUserService</servlet-name>
        <url-pattern>/HttpUserService</url-pattern>
    </servlet-mapping>
 
    <welcome-file-list>
      <welcome-file>/pages/index.xhtml</welcome-file>
    </welcome-file-list>
 
</web-app>
           

步骤10:创建HttpUserServiceClient类

Http Invoker的Spring Remoting支持

HttpUserServiceClient类已创建。 它调用远程Http用户服务并执行用户操作。

package com.otv.http.client;
 
import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
import com.otv.http.server.IHttpUserService;
import com.otv.user.User;
 
/**
 * Http User Service Client
 *
 * @author  onlinetechvision.com
 * @since   24 Feb 2012
 * @version 1.0.0
 *
 */
public class HttpUserServiceClient {
 
    private static Logger logger = Logger.getLogger(HttpUserServiceClient.class);
 
    /**
     * Main method of the Http User Service Client
     *
     */
    public static void main(String[] args) {
 
        logger.debug("Http User Service Client is starting...");
 
        //Http Client Application Context is started...
        ApplicationContext context = new ClassPathXmlApplicationContext("httpClientAppContext.xml");
 
        //Remote User Service is called via Http Client Application Context...
        IHttpUserService httpClient = (IHttpUserService) context.getBean("HttpUserService");
 
        //New User is created...
        User user = new User();
        user.setId(1);
        user.setName("Bruce");
        user.setSurname("Willis");
 
        //The user is added to the remote cache...
        httpClient.addUser(user);
 
        //The users are gotten via remote cache...
        httpClient.getUserList();
 
        //The user is deleted from remote cache...
        httpClient.deleteUser(user);
 
        logger.debug("Http User Service Client is stopped...");
    }
}
           

步骤11:创建httpClientAppContext.xml

Http客户端应用程序上下文如下所示:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
 
    <!-- Http Invoker Client Declaration -->
    <bean id="HttpUserService" class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
 
        <!-- serviceUrl demonstrates Http Service Url which is called-->
        <property name="serviceUrl" value="http://remotehost:port/OTV_SpringHttpInvoker-0.0.1-SNAPSHOT/HttpUserService"/>
 
        <!-- serviceInterface demonstrates Http Service Interface which is called -->
        <property name="serviceInterface" value="com.otv.http.server.IHttpUserService"/>
 
    </bean>
 
</beans>
           

步骤12:部署项目

将OTV_SpringHttpInvoker Project部署到Tomcat之后,将启动Http用户服务客户端,并且输出日志如下所示:

....
15.03.2012 21:26:41 DEBUG (DispatcherServlet.java:819) - DispatcherServlet with name 'HttpUserService' processing POST request for [/OTV_SpringHttpInvoker-0.0.1-SNAPSHOT/HttpUserService]
15.03.2012 21:26:41 DEBUG (AbstractUrlHandlerMapping.java:124) - Mapping [/HttpUserService] to HandlerExecutionChain with handler [org.[email protected]f9104a] and 1 interceptor
15.03.2012 21:26:41 DEBUG (RemoteInvocationTraceInterceptor.java:73) - Incoming HttpInvokerServiceExporter remote call: com.otv.http.server.IHttpUserService.addUser
15.03.2012 21:26:41 DEBUG (HttpUserService.java:33) - User has been added to cache. User : Id : 1, Name : Bruce, Surname : Willis
15.03.2012 21:26:41 DEBUG (RemoteInvocationTraceInterceptor.java:79) - Finished processing of HttpInvokerServiceExporter remote call: com.otv.http.server.IHttpUserService.addUser
15.03.2012 21:26:41 DEBUG (DispatcherServlet.java:957) - Null ModelAndView returned to DispatcherServlet with name 'HttpUserService': assuming HandlerAdapter completed request handling
15.03.2012 21:26:41 DEBUG (FrameworkServlet.java:913) - Successfully completed request
15.03.2012 21:26:41 DEBUG (DispatcherServlet.java:819) - DispatcherServlet with name 'HttpUserService' processing POST request for [/OTV_SpringHttpInvoker-0.0.1-SNAPSHOT/HttpUserService]
15.03.2012 21:26:41 DEBUG (AbstractUrlHandlerMapping.java:124) - Mapping [/HttpUserService] to HandlerExecutionChain with handler [org.[email protected]f9104a] and 1 interceptor
15.03.2012 21:26:41 DEBUG (RemoteInvocationTraceInterceptor.java:73) - Incoming HttpInvokerServiceExporter remote call: com.otv.http.server.IHttpUserService.getUserList
15.03.2012 21:26:41 DEBUG (HttpUserService.java:57) - User List : [Id : 1, Name : Bruce, Surname : Willis]
15.03.2012 21:26:41 DEBUG (RemoteInvocationTraceInterceptor.java:79) - Finished processing of HttpInvokerServiceExporter remote call: com.otv.http.server.IHttpUserService.getUserList
15.03.2012 21:26:41 DEBUG (DispatcherServlet.java:957) - Null ModelAndView returned to DispatcherServlet with name 'HttpUserService': assuming HandlerAdapter completed request handling
15.03.2012 21:26:41 DEBUG (FrameworkServlet.java:913) - Successfully completed request
15.03.2012 21:26:41 DEBUG (DispatcherServlet.java:819) - DispatcherServlet with name 'HttpUserService' processing POST request for [/OTV_SpringHttpInvoker-0.0.1-SNAPSHOT/HttpUserService]
15.03.2012 21:26:41 DEBUG (AbstractUrlHandlerMapping.java:124) - Mapping [/HttpUserService] to HandlerExecutionChain with handler [org.[email protected]f9104a] and 1 interceptor
15.03.2012 21:26:41 DEBUG (RemoteInvocationTraceInterceptor.java:73) - Incoming HttpInvokerServiceExporter remote call: com.otv.http.server.IHttpUserService.deleteUser
15.03.2012 21:26:41 DEBUG (HttpUserService.java:45) - User has been deleted from cache. User : Id : 1, Name : Bruce, Surname : Willis
15.03.2012 21:26:41 DEBUG (RemoteInvocationTraceInterceptor.java:79) - Finished processing of HttpInvokerServiceExporter remote call: com.otv.http.server.IHttpUserService.deleteUser
15.03.2012 21:26:41 DEBUG (DispatcherServlet.java:957) - Null ModelAndView returned to DispatcherServlet with name 'HttpUserService': assuming HandlerAdapter completed request handling
15.03.2012 21:26:41 DEBUG (FrameworkServlet.java:913) - Successfully completed request
...
           

步骤13:下载

OTV_SpringHttpInvoker

参考: Online Technology Vision博客上的JCG合作伙伴 Eren Avsarogullari 提供的Http Invoker的Spring Remoting支持 。

翻译自: https://www.javacodegeeks.com/2012/04/spring-remoting-support-with-http.html