1+1=2,0+0=0

日月累积
posts - 7, comments - 50, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

SOA的组件实现---EJB+Spring+Hibernate

Posted on 2007-01-30 23:29 江上一叶舟 阅读(2128) 评论(1)  编辑  收藏 所属分类: 软件艺术

      最近项目很变态,硬是要把Domino的东西往J2EE上搬,说什么文档型数据库无法跨越系统,我觉得如果照目前电信的系统结构来说,就算把Domino上的所有东西,包括process都搬到J2EE上,也无法解决各个系统之间很好协作的问题,Portal和统一认证已经在某种程度上帮了大忙,如果实在很想各个应用系统之间进行数据交互,开发webservice接口就ok了,甚至在系统开始规划的时候就不应该出现Domino这种东西,现在想起关系型数据库的好来了,未免累死了开发人员,所以我还是秉持我自己的原则:我们无限制的追求软件程序的完美,并不是为了那帮傻逼客户,而是为了让我们之后的程序员能够以更少的精力来更轻松的拿这份工资!
      牢骚完毕来说说目前的J2EE做法。既然涉及到流程,那不免就那两种,WFMC和BPEL,我们选择BPEL,原因是IBM支持BPEL,不要问我两种东西那种更优秀,我会告诉你:你搞清楚了也没意义,用户只相信IBM。
      既然用BPEL,IBM的Websphere Process Server首当其冲,项目组买了几百万的软件和服务就开始开发了,说实话,WPS真的是一个很好的SOA解决方案,但我个人认为绝对不适合中国政府、国企的流程开发,因为他无法很好的解决人工节点的问题,哪怕是引入了human task,于是我们又自己封装了一层小的流程引擎,当然我所要说的重点不是这个,而是我们在wps中所需要的JCA方式绑定的组件的实现方式:EJB+Spring+Hibernate,做好的EJB包可以以EJB Bind的Java component形式打入wps的assembly里,在bpel process中reference进来就可以了。下面我们主要说说EJB的实现。
      由于wps有个特点就是在流程实例结束后删除其自带数据库中的所有实例数据,所以我们必须在流程的最后一部将数据记录在我们自己的业务库中来,我们开发的EJB就实现了这个功能。
首先是业务逻辑,业务逻辑分成三个包,ejb、face、pojo,其中ejb是组件的本地接口,face是组件的功能性接口,pojo是具体实现类。
      具体逻辑代码不贴了,贴一个我写的例子:
      face中的功能接口:

1 package  com.ideal.core.biz.face;
2
3 import  java.rmi.RemoteException;
4
5 public   interface  SimpleService 
6 {
7    public  String sayHello(String message)throws Exception;
8 }

9

   ejb中本地接口:
 1package com.ideal.core.biz.ejb;
 2
 3import javax.ejb.EJBLocalObject;
 4import com.ideal.core.biz.face.SimpleService;
 5
 6public interface SimpleLocal
 7    extends EJBLocalObject, SimpleService
 8{
 9    public String sayHello(String message) throws Exception;
10}

11
  ejb的home接口不贴了,直接贴bean类,我们这里用Stateless的
 1package com.ideal.core.biz.ejb;
 2
 3import javax.ejb.SessionBean;
 4import javax.ejb.SessionContext;
 5import javax.ejb.CreateException;
 6import com.ideal.core.biz.face.SimpleService;
 7import org.springframework.ejb.support.AbstractStatelessSessionBean;
 8import java.rmi.RemoteException;
 9
10public class SimpleBean
11    extends AbstractStatelessSessionBean
12    implements SimpleService
13{
14    SessionContext sessionContext;
15    private SimpleService m_simple_service;
16
17    public void onEjbCreate() throws CreateException
18    {
19        m_simple_service = (SimpleService) getBeanFactory().getBean("SimpleService");
20    }

21
22    public String sayHello(String message) throws Exception
23    {
                 String message = "";
                       try {
                message = m_simple_service.sayHello(message);

        }
        catch (Exception ex)
        {
            this.sessionContext.setRollbackOnly();
            throw new EJBException();
        }
24        return message;
25    }

26}

27
pojo:
 1package com.ideal.core.biz.pojo;
 2
 3import com.ideal.core.biz.face.SimpleService;
 4
 5public class SimpleServiceImpl implements SimpleService
 6{
 7    IUserInfoDAO user_dao;
 8    public SimpleServiceImpl()
 9    {
10    }

11    public String sayHello(String message)  throws Exception
12    {
13            Userinfo user = new Userinfo();
14            user.setName("2");
15            user.setPassword("2");
16            user.setUserid("2");
17            user_dao.saveUser(user);
18            user.setPassword("asddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd");
19            user_dao.saveUser(user);
20        return "hello," + message + "!";
21    }

22}

23
经过测试,容器事务可以正常回滚,前提是spring与hibernate的配置文件配对。
最终打包发布到Websphere上可以正常运行,做个web客户端简单测试一下就ok了。
放入wps上也运行正常。
最后说一句:不一定所有的国外产品都适用于我们的现状。

评论

# re: SOA的组件实现---EJB+Spring+Hibernate  回复  更多评论   

2007-07-03 17:39 by henry
牛,正是我需要的。

只有注册用户登录后才能发表评论。


网站导航: