疯狂Activiti6.0连载(20)Activiti与Spring Boot

来源:转载

本文节选自《疯狂工作流讲义(第2版)》


疯狂Activiti电子书:https://my.oschina.net/JavaLaw/blog/1570397


工作流Activiti教学视频:https://my.oschina.net/JavaLaw/blog/1577577


Activiti与Spring Boot
Spring Boot项目简介

开发一个全新的项目,需要先进行开发环境的搭建,例如要确定使用的技术框架、确定框架的版本,还要考虑各个框架之间的版本兼容问题,完成这些繁琐的工作后,还要对新项目进行配置,测试能否正常运行,最后才将搭建好的环境提交给项目组的其他成员使用。经常出现的情形是,表面上已经成功运行,但部分项目组成员仍然无法运行,项目初期浪费大量的时间做这些工作,几乎每个项目都会投入部分工作量来做这些固定的事情。


受Ruby On Rails、Node.js等技术的影响,JavaEE领域需要一种更为简便的开发方式,来取代这些繁琐的项目搭建工作。在此背景下,Spring推出了Spring Boot项目,该项目可以让使用者更快速的搭建项目,使用者可以更专注、快速的投入到业务系统开发中。系统配置、基础代码、项目依赖的jar包,甚至是开发时所用到的应用服务器等,Spring Boot已经帮我们准备好,只要在建立项目时,使用构建工具加入相应的Spring Boot依赖包,项目即可运行,使用者无需关心版本兼容等问题。


Spring Boot支持Maven和Gradle这两款构建工具。Maven是一款目前较为流行的项目构建工具,通过pom.xml文件来定义项目的配置信息。Gradle使用Groovy语言进行构建脚本的编写,与Maven、Ant等构建工具有良好的兼容性。鉴于笔者使用Maven较多,因此本书使用Maven作为项目构建工具。笔者成书时,Spring Boot最新的正式版本为1.5.4,要求Maven版本为3.2或以上。


下载与安装Maven

Apache Maven是一个著名的项目构建工具,使用Maven可以让项目构建变得简单。Maven将项目的构建信息,存放在pom.xml文件中,Maven的继承特性,让管理大型的、结构复杂的项目更为简单。


Maven拥有众多特性,对于本章来说,最为重要的是它对依赖包的管理,Maven将项目所使用的依赖包的信息放到pom.xml的dependencies节点。例如我们需要使用spring-core模块的jar包,只需在pom.xml配置该模块的依赖信息,Maven会自动将spring-beans等模块也一并引入到我们项目的环境变量中。正是由于此特性,使得Maven与Spring Boot更加相得益彰,可以让我们更快速的搭建一个可用的开发环境。


本书所使用的Maven版本为3.5,可以到Maven官方网站下载:http://maven.apache.org/。下载并解压后得到Maven的主目录,将主目录下的的bin目录加入到系统的环境变量中,如图16-9所示。



图16-9 修改系统环境变量


修改完成后,打开命令行,输入mvn –version命令,看到当前的Maven版本即证明安装成功。Maven下载的jar包会存放到本地仓库中,默认路径为:C:/Users/用户名/.m2/repository。


以前版本的Eclipse,需要额外安装Maven插件,但最近几个版本的Eclipse,已经内置了Maven插件,因此我们可以直接在Eclipse使用Maven。Eclipse自带的Maven版本为3.2,可以通过配置指定我们所安装的3.5版本。


注意:在Eclipse中导入本章Maven项目时,要选择“Existing Maven Project”项,如图16-10所示。



图16-10 导入Maven项目


开发第一个Web应用

本案例所使用的Spring Boot版本为1.5.4。在Eclipse中新建Maven项目,如图16-11至图16-13所示。



图16-11 新建Maven项目



图16-12 新建Maven项目


在新建时,注意选上“Create a simple project”,只新建一个最简单的工程。



图16-13 新建Maven项目


填入必要的项目信息,点击“Finish”即完成项目的创建。创建完成后,会自动创建项目结构和pom.xml文件。新建完一个新项目后,如果要想使它具Web容器的功能,要加入Spring Boot的web启动模块,加入依赖后,pom.xml文件的内容如代码清单16-26所示。


代码清单16-26:codes/16/16.4/boot-web/pom.xml


xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
org.crazyit.activiti
boot-web
0.0.1-SNAPSHOT
war

org.springframework.boot
spring-boot-starter-web
1.5.4.RELEASE

代码清单16-26的粗体配置,为spring-boot-starter-web模块的依赖,该模块会自动帮我们加入其他的Spring模块,例如spring-context、spring-beans、spring-mvc等等,还会自动加上嵌入的Tomcat模块,接下来只需要编写一个启动类,即可完成Web项目的搭建。代码清单16-27为启动类。


代码清单16-27:codes/16/16.4/boot-web/src/main/java/org/crazyit/activiti/WebMain.java


xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
org.crazyit.activiti
boot-web
0.0.1-SNAPSHOT
war

org.springframework.boot
spring-boot-starter-web
1.5.4.RELEASE

代码清单16-27中使用了@ SpringBootApplication 注解,声明这是一个Spring Boot应用,在main方法中使用SpringApplication来运行该应用类,运行后内置的Spring容器将会被启动。运行WebMain类,看到以下信息,即证明成功启动:


2017-07-18 10:16:39.097INFO 3168 --- [main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
2017-07-18 10:16:39.174INFO 3168 --- [main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2017-07-18 10:16:39.179INFO 3168 --- [main] org.crazyit.activiti.WebMain: Started WebMain in 3.608 seconds (JVM running for 4.128)

根据输出信息可知,Tomcat的默认端口为8080,打开浏览器访问http://localhost:8080/,效果如图16-14所示。



图16-14 访问Tomcat


看图16-13可知,这是一个错误页面,由于我们并没有编写任何的Web控制器来处理请求,因此弹出错误页面,下页编写一个最简单的Web控制器来处理请求。修改WebMain类,将其作为一个控制器,如代码清单16-28所示。


代码清单16-28:codes/16/16.4/boot-web/src/main/java/org/crazyit/activiti/WebMain.java


@SpringBootApplication
@Controller
public class WebMain {
public static void main(String[] args) {
SpringApplication.run(WebMain.class, args);
}
@GetMapping("/welcome")
@ResponseBody
public String welcome() {
return "欢迎访问首页";
}
}

WebMain类前加上了@Controller注解,声明它是一个控制器,即MVC模式中的C角色。添加一个welcome方法,只返回文字,方法前使用@GetMapping注解设置访问路径,使用@ResponseBody声明该方法返回的字符串为HTTP的响应内容,再次运行WebMain类,在浏览器访问:http://localhost:8080/welcome,可以看到页面信息为welcome方法返回的字符串。需要注意的是,Spring Boot的web模块,默认使用的是SpringMVC。



Activiti与Spring Boot的整合

使用Spring Boot,只需要花很少的时间即可将整个环境搭建好,整个过程较为便捷,Activiti也提供了Spring Boot的模块,在Maven的pom.xml文件中加入该模块的依赖,即可快速的搭建一个可用的Activiti开发环境。新建一个名称为activiti-boot的Maven项目,加入Activiti的boot模块,代码清单16-29为项目pom.xml的内容。


代码清单16-29:codes/16/16.4/activiti-boot/pom.xml


xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
org.crazyit.activiti
activiti-boot
0.0.1-SNAPSHOT


org.activiti
activiti-spring-boot-starter-basic
6.0.0.RC1


org.springframework.boot
spring-boot-starter-web
1.2.6.RELEASE


mysql
mysql-connector-java
5.1.42


org.springframework
spring-core
4.2.5.RELEASE


代码清单16-29中注意以下几个小细节:

activiti-spring-boot-starter-basic模块的版本为6.0.0.RC1,为成书时最新的版本。
spring-boot-starter-web的版本为1.2.6.RELEASE,我们在前面章节所使用的是1.5.4,由于Activiti使用的Spring Boot版本为1.2.6,因此我们这里也使用这个版本。
使用的spring-core版本为4.2.5RELEASE,正常情况下,并不需要声明使用spring-core,但是由于activiti-spring-boot-starter-basic模块引用的spring-core版本为4.1.7,如果使用该版本,启动Spring容器时将会抛出异常,异常信息为:“java.lang.NoSuchMethodError: org.springframework.core.ResolvableType.forInstance(Ljava/lang/Object;)Lorg/springframework/core/ResolvableType;”。
由于我们的环境,Activiti连接的是MySQL数据库,因此要加上MySQL的依赖包。

默认情况下,Spring Boot会到Classpath下读取application.properties配置文件,该配置文件可以配置例如Tomat端口、数据源等信息。本例的Activiti要连接MySQL数据库,因此需要配置数据源,代码清单16-30为本例的application.properties内容。


代码清单16-30:codes/16/16.4/activiti-boot/src/main/resources/application.properties


spring.datasource.url=jdbc:mysql://localhost:3306/act
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

通过前面章节的学习,我们知道Spring在启动时,会根据配置来实现自动的流程文件部署,Activiti的Spring Boot模块同样支持这个功能。默认情况下,它会读取ClassPath下processes目录里面的流程文件。新建一个简单的流程,流程文件内容如代码清单16-31所示。


代码清单16-31:codes/16/16.4/activiti-boot/src/main/resources/processes/test1.bpmn






targetRef="usertask1">

流程只一个UserTask,流程的id为“testProcess”,新建完流程文件后,本例的项目结构如图16-15所示。



图16-15 项目结构


接下来,在Controller中调用Activiti的API,来查询流程的部署数据,编写Spring类和Controller类,如代码清单16-32所示。


代码清单16-32:


codes/16/16.4/activiti-boot/src/main/java/org/crazyit/activiti/ActMain.java


codes/16/16.4/activiti-boot/src/main/java/org/crazyit/activiti/controller/MyController.java


@SpringBootApplication
public class ActMain {
public static void main(String[] args) {
SpringApplication.run(ActMain.class, args);
}
}
@Controller
public class MyController {
@Autowired
private RepositoryService repositoryService;
@RequestMapping("/welcome")
@ResponseBody
public String welcome() {
return "调用流程存储服务,查询部署数量:"
+ repositoryService.createDeploymentQuery().count();
}
}

MyController类中,将Activiti的流程存储服务对象RepositoryService的实例,通过自动装配的方式注入到MyController类中,welcome方法中使用RepositoryService来查询部署数据。需要注意的是,Spring Boot的spring-boot-starter-web模块,在1.2.6版本中不支持@GetMapping注解。运行ActMain类的main方法,访问http://localhost:8080/welcome,可以看到界面输出。


本例中仅仅调用了存储服务来查询数据,如果需要使用其他服务组件,可以通过同样的方式注入,在此不再赘述。


本文节选自《疯狂工作流讲义(第2版)》


疯狂Activiti电子书:https://my.oschina.net/JavaLaw/blog/1570397


工作流Activiti教学视频:https://my.oschina.net/JavaLaw/blog/1577577


本书代码目录:https://gitee.com/yangenxiong/CrazyActiviti



分享给朋友:
您可能感兴趣的文章:
随机阅读: