精华帖 (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 代码
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处理了。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-11-22
就算是解决了吧,使service继承AbstractController,然后用this.getWebApplicationContext.getBean获得taskBean,然后用RCP调用就成了~
|
|
返回顶楼 | |
浏览 5315 次