用spring和hessian构建分布式应用(远程接口)的方法

最近一期的《programmer》里几乎从头至尾在讲关于“J2EE without EJB”的事情,可怜的ejb啊,居然被描述成了遗产系统的重要组成部分。。。

其实有上面的结论,无外乎现在java里面的新技术已经几乎能完全取代ejb的优点,而克服ejb的缺点,entity bean和有状态的session bean已经机乎被视为垃圾,hibernate和spring大行其到,看看最进n期《programmer》中篇幅的比重就知道了。本来我个人的感觉是hibernate取代了entity bean,spring取代了session bean,但是ejb的远程调用用hibernate和spring的架构还取代不了,可是在最近的一期《programmer》中我发现了Hessian!更爽的是,发现了spring原来可以和Hessian结合使用!看来真的可以say byebye to ejb了。

看到这么振奋人心的消息,怎么能不亲自试验一下呢,于是上http://www.caucho.com/以迅雷不及掩耳盗铃之势下载了Hessian的src jar和bin jar。create一个工程,把这些相关的jar统统扔进去,配置和coding就可以开始了。首先,开了如下几个包:



whao.test.hessian.server
放远程服务的接口

whao.test.hessian.server.impl
放远程服务的实现类

whao.test.hessian.client
放客户端应用



1. whao.test.hessian.server中写一个MyService接口:
[code:1]
/*

* Created on 2005-7-25

*

*/

package whao.test.hessian.server;



/**

* @author Hao Wei

*

*/

public interface MyService {

public String doSomething(String s);

}
[/code:1]


2. whao.test.hessian.server.impl中写一个实现类

[code:1]
/*

* Created on 2005-7-25

*

*/

package whao.test.hessian.server.impl;



import whao.test.hessian.server.MyService;



/**

* @author Hao Wei

*

*/

public class MyServiceImpl implements MyService {



/* (non-Javadoc)

* @see whao.test.hessian.server.MyService#doSomething(java.lang.String)

*/

public String doSomething(String s) {

return "HAHAHA: " + s;

}

}

[/code:1]

3. 配置远程服务

Hessian的远程服务要配置成servlet,配置如下:
[code:1]

<servlet>

<servlet-name>myservice</servlet-name>

<servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>

<load-on-startup>1</load-on-startup>

<init-param>

<param-name>service-class</param-name>

<param-value>whao.test.hessian.server.impl.MyServiceImpl</param-value>

</init-param>

</servlet>

<servlet-mapping>

<servlet-name>myservice</servlet-name>

<url-pattern>/myservice</url-pattern>

</servlet-mapping>

[/code:1]

这样,当启动了这个web应用,这个远程服务就以url http://localhost:8080/test_web/myservice 的形式发布了。然后就是开发客户端来调用这个远程服务。

[code:1]
/*

* Created on 2005-7-25

*

*/

package whao.test.hessian.client;



import whao.test.hessian.server.MyService;



import com.caucho.hessian.client. HessianProxyFactory;



/**

* @author Hao Wei

*

*/

public class TestMain {

public static void main(String[] args) throws Exception {

HessianProxyFactory proxyFactory = new HessianProxyFactory();

MyService service = (MyService) proxyFactory.create(MyService.class,

"http://localhost:8080/test_web/myservice");

System.out.println(service.doSomething("xixixixi"));

System.out.println("ok!");

}

}

[/code:1]

运行一把,显示

HAHAHA:xixixi

ok!

不错不错,纯Hessian的远程调用就这样搞定了。继续研究《programmer》看到上面介绍用spring的远程访问解决方案来访问ejb的远程服务。什么?spring还有远程解决方案?没听说过嘛,看了《programmer》上的介绍,发现是真的。那么既然spring能访问ejb的远程服务,那么能访问Hessian的远程服务么?打开spring.jar看看,居然发现了名曰org.springframework.remoting.caucho. HessianProxyFactoryBean的类!夏昕真不厚道啊,再他的spring中文教程中居然匿掉了spring里这么好的东西!于是打开sping英文版reference,终于找到了用spring配置Hessian客户端的方法:
[code:1]
<bean id="myService" class="org.springframework.remoting.caucho. HessianProxyFactoryBean">

<property name="serviceUrl">

<value>

http://localhost:8080/test_web/myservice

</value>

</property>

<property name="serviceInterface">

<value>whao.test.hessian.server.MyService</value>

</property>

</bean>

[/code:1]
然后客户端就可以这么玩啦:

[code:1]
/*

* Created on 2005-7-25

*

*/

package whao.test.hessian.client;



import whao.test.hessian.server.MyService;

import whao.util.spirng.SpringBeanFactory;



import com.caucho.hessian.client. HessianProxyFactory;



/**

* @author Hao Wei

*

*/

public class TestMain {



public static void main(String[] args) throws Exception {

testWithSpring();

}

public static void testWithSpring(){

MyService service = (MyService)SpringBeanFactory.getBean("myService");

System.out.println(service.doSomething("lllllllll"));

System.out.println("ok!");

}

public static void testWithoutSpring() throws Exception {

HessianProxyFactory proxyFactory = new HessianProxyFactory();

MyService service = (MyService) proxyFactory.create(MyService.class,

"http://localhost:8080/test_web/myservice");

System.out.println(service.doSomething("xixixixi"));

System.out.println("ok!");

}

}

[/code:1]

执行一下,输出是:

HAHAHA:lllllllll

ok!

spring真是个好东东,呵呵,其中的SpringBeanFactory是这样实现的:
[code:1]

/*

* Created on 2005-7-25

*

*/

package whao.util.spirng;



import javax.servlet.ServletContext;



import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.FileSystemXmlApplicationContext;

import org.springframework.web.context.support.WebApplicationContextUtils;



/**

* @author Hao Wei

*

*/

public class SpringBeanFactory {

private static final Log log = LogFactory.getLog(SpringBeanFactory.class);

private static ApplicationContext ctx = null;



public static Object getBean(ServletContext context, String beanID) {

log.info("beanID=" + beanID);

ApplicationContext ac = WebApplicationContextUtils

.getWebApplicationContext(context);

return ac.getBean(beanID);

}



public static Object getBean(String beanID){

if(ctx == null){

ctx = new FileSystemXmlApplicationContext(

"D://whao-work//src//test_web//test_web//WEB-INF//applicationContext.xml");

}

return ctx.getBean(beanID);

}

}

[/code:1] 
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值