论坛首页 Java企业应用论坛

Spring整合问题(RCP+Spring HTTPInvoker+jBPM+SSH)

浏览 5315 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-11-22  

      终于要崩溃了,整合这件事不好玩。请有经验的人指导一下~

      目前我们使用如下技术:

      1、RCP和Web浏览器(Extjs+HTML)两种客户端

      2、采用Spring HTTP Invoker为RCP提供远程服务

      3、使用Struts Action做控制层(解析HTTP请求,调用Facade,拼接XML,返回Response响应)

      4、使用Spring做声明式事务处理,IoC容器,和Template封装操作,以及整合其他框架

      5、使用Hibernate做O/R Mapping

      6、使用jBPM做工作流引擎。

     目前整合方案:

     1、Spring和Struts整合,使用Spring提供的Struts插件,配置action-servlet,在其中写入由Spring管理的action。

            在web.xml中配置org.springframework.web.context.ContextLoaderListener,来加载applicationContext.xml,这样我们使用Web浏览器方式访问Struts Action时,直接就可以在Action中引入Facade,而不需要使用ctx.getBean这样的代码了。(也就是Spring自带的例子中JPetStore的架构,我们的分层架构和那个基本上一样)

     2、Spring和jBPM整合,使用Spring-Module-JBPM,按照其自带的文档中的做法进行整合。

            应用程序和jBPM共用一个SessionFactory。

            

xml 代码
  1. <beans>  
  2.   
  3. <!---->  
  4. <bean id="hibernateSessionFactory"  
  5. class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  6.      <value></value>/WEB-INF/classes/hibernate.cfg.xml 
  7. bean>  
  8. <!---->  
  9. <bean id="simpleWorkflow"  
  10. class="org.springmodules.workflow.jbpm31.definition.ProcessDefinitionFactoryBean">  
  11. <property name="definitionLocation"  
  12. value="classpath:org/springmodules/workflow/jbpm31/simpleWorkflow.xml"/>  
  13. bean>  
  14. <!---->  
  15. <bean id="jbpmConfiguration"  
  16. class="org.springmodules.workflow.jbpm31.LocalJbpmConfigurationFactoryBean">  
  17. <property name="sessionFactory" ref="hibernateSessionFactory"/>  
  18. <property name="configuration" value="classpath:jbpm.cfg.xml"/>  
  19. <property name="processDefinitions">  
  20. <list>  
  21. <ref local="simpleWorkflow"/>  
  22. list>  
  23. property>  
  24. <property name="createSchema" value="true"/>  
  25. <property name="processDefinitionsResources">  
  26. <list>  
  27. <value>classpath:/org/springmodules/workflow/jbpm31/someOtherWorkflow.xmlvalue>  
  28. list>  
  29. property>  
  30. bean>  
  31. <!---->  
  32. <bean id="jbpmTemplate" class="org.springmodules.workflow.jbpm31.JbpmTemplate">  
  33. <constructor-arg index="0" ref="jbpmConfiguration"/>  
  34. <constructor-arg index="1" ref="simpleWorkflow"/>  
  35. bean>  
  36.   
  37. beans>  

     3、Spring和Spring HTTPInvoker,也使用典型的做法,在web.xml中配置org.springframework.web.servlet.DispathcerServlet

     目前存在的问题:

     1、使用HTTPInvoker提供服务,不能像通过Struts Action一样直接使用Facade(因为获取不到),而需要写ctx.getBean,因为不是很理解Web容器(使用Tomcat测试,WAS发布)的机理,不过觉得org.springframework.web.context.ContextLoaderListener和org.springframework.web.servlet.DispathcerServlet这两个东西ms不能共享同一个上下文。而applicationContext.xml只载入到了org.springframework.web.context.ContextLoaderListener的上下文中,而没有载入到org.springframework.web.servlet.DispathcerServlet的上下文。如果两个都载入,意味着需要加载两遍applicationContext.xml,连接两遍数据库,创建两个SessionFactory。

            目前我们是使用ctx.getBean的方法来获得Facade。将这个方法放到service类的构造器中,Tomcat启动时,自动创建service实例,这时会加载相应的所有配置文件,还会建立数据库连接。

    2、我们将HTTP Invoker的service放在Struts Action中(也就是说Action充当Service类),然后在TaskBean中(和jBPM示例websale的做法一样)调用jBPM流程API,在这里我们使用了Spring提供的JbpmTemplate,只是利用其获得JbpmConfiguration,之后就跟使用native JBPM一样了(某些场景我们也会使用JbpmTemplate.execute方法,在回调函数中写,这样context的生命周期就由Template控制了)。我们将TaskBean配置在applicationContext.xml中,它的property值设为jbpmTemplate,ctx.getBean("taskBean");可是报错,加载不到jbpmTemplate。

         3、如何将jBPM事务和自制Java代码中的事务一起控制,jBPM的事务是随jbpmContext的创建和销毁而开始和结束的。主要处理的事务是:

         1)业务事务失败,jbpm事务必须回退。

         2)jbpm事务失败,业务事务也必须回退。

          一个基本思路是:将调用业务Facade放入到jbpmTemplate的execute中,由它来负责context生命周期,抛出异常,则context关闭,事务回滚;而使用Spring生命式事务处理,来拦截TaskBean中的方法,这样当业务层抛出异常, jbpmTemplate.execute也不能正常执行结束,业务层也会回滚(还没试过,不知道大家的做法是什么,je上有很多讨论,不过都太虚了,根本不实用)。

 

           关于RCP通过HTTPInvoker远程调用Server端的service,我想如果这个整合不来就只好使用Struts Action返回XML,而通过URLConnection类来进行port和get处理了。

   发表时间:2007-11-22  
就算是解决了吧,使service继承AbstractController,然后用this.getWebApplicationContext.getBean获得taskBean,然后用RCP调用就成了~
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics