Spring远程调用技术<2>-Hessian和Burlap

上篇谈到RMI技术,加上Spring的封装,用起来很方便,但也有一些限制

这里的Hessian和Burlap解决了上篇提到的限制,因为他们是基于http的轻量级远程服务。

Hessian,和RMI一样,使用二进制消息进行客户端和服务端的交互,但是它的二进制消息可以移植到其他非java的语言中

Burlap是一种基于XML的远程调用技术,这使它可以移植到任何能解析XML的语言上

pom.xml  (这里有的jar是多余的)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.</modelVersion>
<groupId>com.spring</groupId>
<artifactId>wzy</artifactId>
<name>SpringSource</name>
<packaging>war</packaging>
<version>1.0.-BUILD-SNAPSHOT</version>
<properties>
<java-version>1.6</java-version>
<org.springframework-version>4.1..RELEASE</org.springframework-version>
<org.aspectj-version>1.6.</org.aspectj-version>
<org.slf4j-version>1.6.</org.slf4j-version>
</properties>
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
<exclusions>
<!-- Exclude Commons Logging in favor of SLF4j -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency> <!-- AspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency> <!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slf4j-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.</version>
<exclusions>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
<exclusion>
<groupId>javax.jms</groupId>
<artifactId>jms</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jdmk</groupId>
<artifactId>jmxtools</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jmx</groupId>
<artifactId>jmxri</artifactId>
</exclusion>
</exclusions>
<scope>runtime</scope>
</dependency> <!-- @Inject -->
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version></version>
</dependency> <!-- Servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency> <!-- Test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.caucho/hessian -->
<dependency>
<groupId>com.caucho</groupId>
<artifactId>hessian</artifactId>
<version>4.0.</version>
</dependency> <!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-core -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>4.1..RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-config -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>4.1..RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-web -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>4.1..RELEASE</version>
</dependency> <!-- https://mvnrepository.com/artifact/net.sf.ehcache/ehcache-core -->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-core</artifactId>
<version>2.6.</version>
</dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework-version}</version>
</dependency> <!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-redis -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.6..RELEASE</version>
</dependency> <!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-pool/commons-pool -->
<dependency>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
<version>1.6</version>
</dependency> </dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.9</version>
<configuration>
<additionalProjectnatures>
<projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
</additionalProjectnatures>
<additionalBuildcommands>
<buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
</additionalBuildcommands>
<downloadSources>true</downloadSources>
<downloadJavadocs>true</downloadJavadocs>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<compilerArgument>-Xlint:all</compilerArgument>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.</version>
<configuration>
<mainClass>org.test.int1.Main</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>

一、服务端配置:

这里使用的是基于SpringMVC的配置,配置文件是纯java配置。

当配置好后,web.xml不用再进行任何配置,当tomcat启动时会找到自定义的DispatcherServlet并自动加载它

Spring远程调用技术<2>-Hessian和Burlap

1.Person.java

package com.mvc.entity;

import java.io.Serializable;

public class Person
implements Serializable
{ /**
* 注意:如果需要返回这个对象,需要实现序列化
*
* */ public Person(){}
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
} }

2.PersonServer.java

package com.mvc.server;

import org.springframework.stereotype.Service;

import com.mvc.entity.Person;

public interface PersonServer {

    public Person getPerson();

    public String getMsg();
}

3.PersonServerImpl.java

package com.mvc.server;

import java.io.Serializable;

import org.springframework.stereotype.Service;

import com.mvc.entity.Person;

@Service
public class PersonServerImpl implements PersonServer { public PersonServerImpl(){
System.out.println("PersonServer.."); }
@Override
public Person getPerson(){
//如果返回的是一个自己创建的对象,需要把这个对象序列化了,不然不行
return new Person("aaa",);
} @Override
public String getMsg() {
//String已经实现了序列化,所以说返回的对象必须实现序列化
return "hello wzy";
}
}

4.RootConfig.java

package com.mvc.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration; @Configuration
//@ComponentScan("com.mvc.server")
public class RootConfig { //这里没有配置 }

5.WebConfig.java

package com.mvc.config;

import java.util.Properties;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.remoting.caucho.BurlapServiceExporter;
import org.springframework.remoting.caucho.HessianServiceExporter;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping;
import org.springframework.web.servlet.view.InternalResourceViewResolver; import com.mvc.server.PersonServer;
import com.mvc.server.PersonServerImpl; @Configuration
@EnableWebMvc
//@ComponentScan("com.mvc.action")
public class WebConfig
//extends WebMvcConfigurerAdapter
{
/*
@Bean
public ViewResolver viewResolver(){
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
resolver.setExposeContextBeansAsAttributes(true);
return resolver; } @Override
public void configureDefaultServletHandling(
DefaultServletHandlerConfigurer configurer){
configurer.enable(); }
*/ /*
@Bean
public HandlerMapping hessianMapping(){
SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
Properties mappings = new Properties();
mappings.setProperty("/hessian.ser", "hessianService");
mapping.setMappings(mappings);
return mapping; }
*/ @Bean
public HandlerMapping mapping(){
System.out.println("-->Mapping");
SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
Properties mappings = new Properties(); mappings.setProperty("/burlap.ser", "burlapService");
//给bean绑定url映射,bean的名字(burlapService)必须对应

mappings.setProperty("/hessian.ser", "hessianService"); mapping.setMappings(mappings);
return mapping; }

//配置burlap服务
@SuppressWarnings("deprecation")
@Bean
public BurlapServiceExporter burlapService(PersonServer personServer){
System.out.println("-->burlapService");
BurlapServiceExporter exporter = new BurlapServiceExporter();
exporter.setService(personServer);
exporter.setServiceInterface(PersonServer.class);
return exporter;
} //配置hessian服务
@Bean
public HessianServiceExporter hessianService(PersonServer personServer){
System.out.println("-->hessianService");
HessianServiceExporter exporter = new HessianServiceExporter();
exporter.setService(personServer);
exporter.setServiceInterface(PersonServer.class);
return exporter;
} @Bean
public PersonServer personServer(){ return new PersonServerImpl();
}
}

6.MyDispatcherServlet.java

package com.mvc.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class MyDispatcherServlet
extends AbstractAnnotationConfigDispatcherServletInitializer{ @Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{RootConfig.class};
} @Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[]{WebConfig.class};
} @Override
protected String[] getServletMappings() {
return new String[]{"*.ser"};
} }

以上就是服务端的全部配置,放入tomcat就可以跑了

Spring远程调用技术<2>-Hessian和Burlap

二、客户端的配置,一种是java直接调用,另一种是基于Spring调用

(Spring的jar和Hessian的jar是不能少的)

Spring远程调用技术<2>-Hessian和Burlap

1.PersonServer.java(还是服务端的那个接口)

package com.mvc.server;

import org.springframework.stereotype.Service;

import com.mvc.entity.Person;

public interface PersonServer {

    public Person getPerson();

    public String getMsg();
}

2.BurlapContext.java(配置burlap客户端)

package com.mvc.wzy;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.remoting.caucho.BurlapProxyFactoryBean;
import org.springframework.remoting.caucho.HessianProxyFactoryBean; import com.mvc.server.PersonServer; @Configuration
public class BurlapContext { @Bean
public BurlapProxyFactoryBean burlapProxyFactory(){
BurlapProxyFactoryBean proxyFactory = new BurlapProxyFactoryBean();;
proxyFactory.setServiceUrl("http://localhost:8080/Springmvc/burlap.ser");
proxyFactory.setServiceInterface(PersonServer.class); return proxyFactory;
}
}

3.HessianContext.java(配置hessian客户端)

package com.mvc.wzy;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.remoting.caucho.BurlapProxyFactoryBean;
import org.springframework.remoting.caucho.HessianProxyFactoryBean; import com.mvc.server.PersonServer; @Configuration
public class HessianContext { @Bean
public HessianProxyFactoryBean hessianProxyFactory(){
HessianProxyFactoryBean proxyFactory = new HessianProxyFactoryBean();;
proxyFactory.setServiceUrl("http://localhost:8080/Springmvc/hessian.ser");
proxyFactory.setServiceInterface(PersonServer.class); return proxyFactory;
} }

4.Test.java

package com.mvc.wzy;

import java.net.MalformedURLException;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.remoting.caucho.BurlapProxyFactoryBean;
import org.springframework.remoting.caucho.HessianProxyFactoryBean; import com.caucho.burlap.client.BurlapProxyFactory;
import com.caucho.hessian.client.HessianProxyFactory;
import com.mvc.server.PersonServer; public class Test { public static void main(String[] args) throws MalformedURLException { //Spring 实现客户端
ApplicationContext app =
// new AnnotationConfigApplicationContext(com.mvc.wzy.HessianContext.class);
new AnnotationConfigApplicationContext(com.mvc.wzy.BurlapContext.class);
PersonServer p = app.getBean(PersonServer.class);
System.out.println( p.getMsg());
System.out.println(p.getPerson()); /*
* java代码实现Hessian客户端
*/
// HessianProxyFactory hfactory = new HessianProxyFactory();
// PersonServer service =
// (PersonServer) hfactory.create(PersonServer.class, "http://localhost:8080/Springmvc/hessian.ser");
// System.out.println(service.getMsg());//返回的对象一定要实现序列化
// System.out.println(service.getPerson().toString()); /*
* java代码实现Burlap客户端
*/
// BurlapProxyFactory bfactory = new BurlapProxyFactory();
// service =
// (PersonServer) bfactory.create(PersonServer.class, "http://localhost:8080/Springmvc/burlap.ser");
//
// System.out.println(service.getMsg());//返回的对象一定要实现序列化
// System.out.println(service.getPerson().toString()); } }

调用ok

Spring远程调用技术<2>-Hessian和Burlap

上一篇:ios UIWebView截获html并修改便签内容


下一篇:从京东app学到的(1)