Flowable入门系列文章17 - 整合Spring 04

Posted 分享牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flowable入门系列文章17 - 整合Spring 04相关的知识,希望对你有一定的参考价值。

Spring Boot

1.1、REST支持

通常,在嵌入式Flowable引擎之上使用REST API(与公司中的不同服务交互)。Spring Boot使这真的很容易。将以下依赖关系添加到类路径中:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.boot.version}</version>
</dependency>

创建一个新的类,一个Spring服务,并创建两个方法:一个开始我们的过程,一个获取给定受让人的任务列表。我们在这里简单地包装Flowable调用,但在实际情况下,这将更加复杂。

@Service
public class MyService {
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
@Transactional
public void startProcess() {
runtimeService.startProcessInstanceByKey("oneTaskProcess");
}
@Transactional
public List<Task> getTasks(String assignee) {
return taskService.createTaskQuery().taskAssignee(assignee).list();
}
}

现在我们可以通过使用@RestController注释一个类来创建一个REST端点。在这里,我们只是委托给上面定义的服务。

@RestController
public class MyRestController {
@Autowired
private MyService myService;
@RequestMapping(value="/process", method= RequestMethod.POST)
public void startProcessInstance() {
myService.startProcess();
}
@RequestMapping(value="/tasks", method= RequestMethod.GET, produces=MediaType.APPLICATION_JSON_VALUE)
public List<TaskRepresentation> getTasks(@RequestParam String assignee) {
List<Task> tasks = myService.getTasks(assignee);
List<TaskRepresentation> dtos = new ArrayList<TaskRepresentation>();
for (Task task : tasks) {
dtos.add(new TaskRepresentation(task.getId(), task.getName()));
} r
eturn dtos;
} s
tatic class TaskRepresentation {
private String id;
private String name;
public TaskRepresentation(String id, String name) {
this.id = id;
this.name = name;
} p
ublic String getId() {
return id;
} p
ublic void setId(String id) {
this.id = id;
} p
ublic String getName() {
return name;
} p
ublic void setName(String name) {
this.name = name;
}
}
}

无论是@Service和@RestController将被自动扫描组件(找到@ComponentScan我们加入到我们的应用程序类)。再次运行应用程序类。现在我们可以使用cURL与REST API进行交互:

curl http:// localhost:8080 / tasks?assignee = kermit
[]
curl -X POST http:// localhost:8080 /进程
curl http:// localhost:8080 / tasks?assignee = kermit
[{“id”:“10004”,“name”:“我的任务”}]

1.2、JPA支持

要在Spring Boot中添加对Flowable的JPA支持,请添加以下依赖项:

<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-spring-boot-starter-jpa</artifactId>
<version>${flowable.version}</version>
</dependency>

这将添加在Spring配置和bean使用JPA。默认情况下,JPA提供程序将是Hibernate。

我们来创建一个简单的实体类:

@Entity
class Person {
@Id
@GeneratedValue
private Long id;
private String username;
private String firstName;
private String lastName;
private Date birthDate;
public Person() {
} p
ublic Person(String username, String firstName, String lastName, Date birthDate) {
this.username = username;
this.firstName = firstName;
this.lastName = lastName;
this.birthDate = birthDate;
} p
ublic Long getId() {
return id;
} p
ublic void setId(Long id) {
this.id = id;
} p
ublic String getUsername() {
return username;
} p
ublic void setUsername(String username) {
this.username = username;
} p
ublic String getFirstName() {
return firstName;
} p
ublic void setFirstName(String firstName) {
this.firstName = firstName;
} p
ublic String getLastName() {
return lastName;
} p
ublic void setLastName(String lastName) {
this.lastName = lastName;
} p
ublic Date getBirthDate() {
return birthDate;
} p
ublic void setBirthDate(Date birthDate) {
this.birthDate = birthDate;
}
}

默认情况下,不使用内存数据库时,不会自动创建表。在类路径上创建一个文件application.properties并添加以下属性:

spring.jpa.hibernate.ddl-AUTO =更新

添加以下课程:

public interface PersonRepository extends JpaRepository<Person, Long> {
	Person findByUsername(String username);
}

这是一个Spring仓库,它提供了开箱即用的CRUD。我们添加这个方法来通过用户名找到一个Person。Spring会根据约定(通常是使用的属性名称)自动实现。

我们现在进一步加强我们的服务。

  • 通过向类中添加@Transactional。请注意,通过添加上面的JPA依赖关系,我们以前使用的DataSourceTransactionManager现在由JpaTransactionManager自动换出。
  • 该startProcess现在得到通过在受让人的用户名,这是用来查找的人,把人JPA对象作为流程实例的过程变量。
  • 添加了创建虚拟用户的方法。这用于CommandLineRunner来填充数据库。
@Service
@Transactional
public class MyService {
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
@Autowired
private PersonRepository personRepository;
public void startProcess(String assignee) {
Person person = personRepository.findByUsername(assignee);
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("person", person);
runtimeService.startProcessInstanceByKey("oneTaskProcess", variables);
} p
ublic List<Task> getTasks(String assignee) {
return taskService.createTaskQuery().taskAssignee(assignee).list();
} p
ublic void createDemoUsers() {
if (personRepository.findAll().size() == 0) {
personRepository.save(new Person("jbarrez", "Joram", "Barrez", new Date()));
personRepository.save(new Person("trademakers", "Tijs", "Rademakers", new Date()));
}
}
}

CommandLineRunner现在看起来像:

@Bean
public CommandLineRunner init(final MyService myService) {
return new CommandLineRunner() {
public void run(String... strings) throws Exception {
myService.createDemoUsers();
}
};
}

RestController也被稍微修改以合并上面的更改(仅显示新的方法),HTTP POST现在有一个包含受让人用户名的主体:

@RestController
公共类MyRestController {
@Autowired
私人MyService myService;
@RequestMapping(value =/ process”,method = RequestMethod.POST)
public void startProcessInstance(@RequestBody StartProcessRepresentation startProcessRepresentation){
myService.startProcess(startProcessRepresentation.getAssignee());
}
...
静态类StartProcessRepresentation {
私人字符串受让人;
public String getAssignee(){
归还受让人;
}
public void setAssignee(String assignee){
这个。受让人=受让人;
}
}

最后,为了试用Spring-JPA-Flowable集成,我们在流程定义中使用Person JPA对象的ID分配任务:

 <userTask id="theTask" name="my task" flowable:assignee="${person.id}"/>

我们现在可以启动一个新的流程实例,在POST主体中提供用户名:

curl -H“Content-Type:application / json”-d“{”assignee“:”jbarrez“}'http:// localhost:8080 / process

现在使用人员ID取得任务列表:

curl http:// localhost:8080 / tasks?assignee = 1
[{“id”:“12505”,“name”:“我的任务”}]

1.3、进一步说明

显然,关于Spring Boot还有很多尚未涉及的内容,比如JTA集成非常容易,或者构建一个可以在主要应用程序服务器上运行的WAR文件。
Spring Boot集成还有很多:

  • 执行器支持
  • Spring集成支持
  • Rest API集成:启动Spring应用程序中嵌入的Flowable Rest API
  • Spring Security支持

1.4、高级配置

通过实现org.flowable.spring.boot.ProcessEngineConfigurationConfigurer接口,可以获得流程引擎配置。这可以用于高级配置设置或者仅仅因为属性尚未公开(还)。例如:

public class MyConfigurer implements ProcessEngineConfigurationConfigurer {
public void configure(SpringProcessEngineConfiguration processEngineConfiguration) {
// advanced configuration
}
}

通过在Spring Boot配置中将此类的实例作为@Bean公开,将在完全创建流程引擎之前调用该实例。

上面文章来自盘古BPM研究院:http://vue.pangubpm.com/
文章翻译提交:https://github.com/qiudaoke/flowable-userguide
了解更多文章可以关注微信公众号:

以上是关于Flowable入门系列文章17 - 整合Spring 04的主要内容,如果未能解决你的问题,请参考以下文章

Flowable入门系列文章15 - 整合Spring 02

Flowable入门系列文章16 - 整合Spring 03

Flowable入门系列文章23 - 基本的Flowable概念四

Flowable入门系列文章18 - 部署Flowable

Flowable入门系列文章20 - 基本的Flowable概念一

Flowable入门系列文章80 - Flowable Designer部署功能