您的位置:首页 > 编程语言 > Java开发

springboot + activiti + modeler

2017-12-04 21:11 399 查看
公司要使用activiti做流程管理中心,之前知道有这个框架,但是一直没有机会去接触学习,公司采用了springboot框架,(我就不介绍这个框架的使用了,简单来说就是spring去掉配置文件,就是springboot,哈哈,我是这样认为的,比较容易上手)废话不多说,下面开始框架的整合;
**第一步:搭建springboot框架**
无论是idea 还是eclipse,都有插件生成springboot框架,但是个人认为,还是自己搭建比较好,可以了解框架由哪几部分组成,我是用的idea,我就不适用idea一键生成springboot框架了,自己搭建比较好。
(1)创建一个maven web项目




<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.3.RELEASE</version>
</parent>

<dependencies>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>1.5.4.RELEASE</version>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.5.4.RELEASE</version>
</dependency>
</dependencies>


添加类 ServletInitializer.java,添加application.properties or application.ylm你喜欢哪一种配置方式都可以如图所示文件目录:



ServletInitializer.java

@ComponentScan
@ServletComponentScan
@EnableTransactionManagement
@MapperScan(basePackages = "com.river.dao") //整合mybatis 扫描路径
@EnableAutoConfiguration(exclude = {SecurityAutoConfiguration.class})
//这玩意后面会解释
public class ServletInitializer extends SpringBootServletInitializer{

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(ServletInitializer.class);
}

public static void main(String[] args) {
SpringApplication.run(ServletInitializer.class,args);
}
}


到这里springboot框架就搭建好了,需要依赖自己往pom.xml里添加。我的pom.xml如下

<properties>
<activiti.version>5.22.0</activiti.version>
</properties>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.3.RELEASE</version>
</parent>

<dependencies>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>1.5.4.RELEASE</version>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.5.4.RELEASE</version>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<version>1.5.4.RELEASE</version>
</dependency>

<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.5</version>
</dependency>

<!--activiti-->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter-basic</artifactId>
<version>${activiti.version}</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter-actuator</artifactId>
<version>${activiti.version}</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-rest</artifactId>
<version>${activiti.version}</version>
</dependency>

<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-codec</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-css</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-svg-dom</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-svggen</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-explorer</artifactId>
<version>${activiti.version}</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-diagram-rest</artifactId>
<version>${activiti.version}</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-simple-workflow</artifactId>
<version>${activiti.version}</version>
</dependency>

<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>${activiti.version}</version>
</dependency>

<!--<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-modeler</artifactId>
<version>${activiti.version}</version>
</dependency>-->
</dependencies>


application.properties

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springboot_activiti_service
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=root
mybatis.mapper-locations=classpath:com/river/dao/*.xml  #mybatis使用

logging.file=log.log
logging.pattern.level=debug

security.basic.enabled=false


(2)开始整合activiti+modeler

在网上有一些介绍,直接在pom.xml中直接添加

<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter-basic</artifactId>
<version>${activiti.version}</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter-actuator</artifactId>
<version>${activiti.version}</version>
</dependency>


这两个依赖就可以,但事实是不可以的,我也不知道为啥,在springboot中,数据源无法自动配置到ProcessEngineConfigurationConfigurer中,导致项目启动时processEngine为null,搞了我大半天,然后自己写配置自己掌控processEngine的DataSource

1、添加配置类ActivitiDataSourceProperties.java

@Component
public class ActivitiDataSourceProperties {

@Value("${spring.datasource.url}")
private String url;

@Value("${spring.datasource.username}")
private String username;

@Value("${spring.datasource.password}")
private String password;

@Value("${spring.datasource.driver-class-name}")
private String driverClassName;

public String getUrl() {
return url;
}

public void setUrl(String url) {
this.url = url;
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = pa
d65d
ssword;
}

public String getDriverClassName() {
return driverClassName;
}

public void setDriverClassName(String driverClassName) {
this.driverClassName = driverClassName;
}
}


2、ActivitiDatadourceConfig.java

@Configuration
public class ActivitiDatadourceConfig extends AbstractProcessEngineAutoConfiguration {

@Resource
private ActivitiDataSourceProperties activitiDataSourceProperties;

@Bean
@Primary
public DataSource activitiDataSource() {
DruidDataSource DruiddataSource = new DruidDataSource();
DruiddataSource.setUrl(activitiDataSourceProperties.getUrl());
DruiddataSource.setDriverClassName(activitiDataSourceProperties.getDriverClassName());
DruiddataSource.setPassword(activitiDataSourceProperties.getPassword());
DruiddataSource.setUsername(activitiDataSourceProperties.getUsername());
return DruiddataSource;
}

@Bean
public PlatformTransactionManager transactionManager() {
return new DataSourceTransactionManager(activitiDataSource());
}

@Bean
public SpringProcessEngineConfiguration springProcessEngineConfiguration() {
SpringProcessEngineConfiguration configuration = new SpringProcessEngineConfiguration();
configuration.setDataSource(activitiDataSource());
configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
configuration.setJobExecutorActivate(true);
configuration.setTransactionManager(transactionManager());
return configuration;
}
}


(2)添加modeler相关文件



下载activiti-master





分配在这些文件夹中找到上面的modeler的文件,放到相应的位置中



修改一下这个文件

虽然在pom.xml中有activiti-modeler这个依赖,但是集合springboot的时候不能使用,以为在传参数的时候,@RequestBody @RequestBody MultiValueMap

@RestController
public class ModelSaveRestResource implements ModelDataJsonConstants {

protected static final Logger LOGGER = LoggerFactory.getLogger(ModelSaveRestResource.class);

@Autowired
private RepositoryService repositoryService;

@RequestMapping(value = "/model/{modelId}/save", method = RequestMethod.PUT)
public void saveModel(@PathVariable String modelId, @RequestParam String json_xml,
@RequestParam  String svg_xml,@RequestParam String name, @RequestParam String description) {
try {
ObjectMapper objectMapper = new ObjectMapper();
Model model = repositoryService.getModel(modelId);

ObjectNode modelJson = (ObjectNode) objectMapper.readTree(model.getMetaInfo());

modelJson.put(MODEL_NAME, name);
modelJson.put(MODEL_DESCRIPTION, description);
model.setMetaInfo(modelJson.toString());
model.setName(name);

repositoryService.saveModel(model);

repositoryService.addModelEditorSource(model.getId(), json_xml.getBytes("utf-8"));

InputStream svgStream = new ByteArrayInputStream(svg_xml.getBytes("utf-8"));
TranscoderInput input = new TranscoderInput(svgStream);

PNGTranscoder transcoder = new PNGTranscoder();
// Setup output
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
TranscoderOutput output = new TranscoderOutput(outStream);

// Do the transformation
transcoder.transcode(input, output);
final byte[] result = outStream.toByteArray();
repositoryService.addModelEditorSourceExtra(model.getId(), result);
outStream.close();

//部署流程
Model modelData = repositoryService.getModel(modelId);
ObjectNode modelNode = (ObjectNode) objectMapper.readTree(repositoryService.getModelEditorSource(modelData.getId()));
byte[] bpmnBytes = null;
BpmnModel model2 = new BpmnJsonConverter().convertToBpmnModel(modelNode);
bpmnBytes = new BpmnXMLConverter().convertToXML(model2);

String processName = modelData.getName() + ".bpmn";

//部署流程
Deployment deployment = repositoryService.createDeployment()
.name(modelData.getName())
.addString(processName, StringUtils.toEncodedString(bpmnBytes, Charset.forName("UTF-8")))
.deploy();

} catch (Exception e) {
LOGGER.error("Error saving model", e);
throw new ActivitiException("Error saving model", e);
}

}
}


(3)到这里就差不多了,但是启动之后可以在http://localhost:8080需要你输入用户名和密码;这是解决的方法,同事也解释上面的一些配置的原因,看一下:

解决Springboot集成ActivitiModel提示输入密码的问题:

http://blog.csdn.net/sinat_38335497/article/details/74285053

http://blog.csdn.net/KingBoyWorld/article/details/77697653

创建空mode即跳转到modeler编辑页面的代码如下

@Controller
@RequestMapping("/modeler")
public class ModelerController {

private static final Logger logger = LoggerFactory.getLogger(ModelerController.class);

@Resource
private ModelerService modelerService;

/**
* 创建流程模型
* @param name
* @param key
* @param description
* @param request
* @param response
* @return
*/
@RequestMapping(value = "/create", method = RequestMethod.GET)
public String createModel(@RequestParam("name") String name, @RequestParam("key") String key,
@RequestParam("description") String description,
HttpServletRequest request, HttpServletResponse response) {
logger.info("创建空modeler:name:{},key:{},description:{}", name, key, description);
try {
//创建空模型
String modelId = modelerService.crateModel(name, key, description);
if(StringUtils.isBlank(modelId)) {
throw new RuntimeException("创建modeler失败modelId:" + modelId);
}

return "redirect:../modeler.html?modelId=" + modelId;
}catch (Exception e) {
logger.error("创建模型失败",e );
throw new RuntimeException(e);
}
}

/**
* 模型列表
* @param modelAndView
* @return
*/
@RequestMapping("/model/list")
public ModelAndView modelList(ModelAndView modelAndView) {
List<Model> list = modelerService.queryModelList();
return modelAndView;
}


第一次写博客,不太会怎么整理,嘻嘻,有什么问题可以给我留言,谢谢支持,如果看不懂可以参考一下我的的github:

https://github.com/fengheatu/springboot.activiti
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息