Activiti-04-.Spring integration

本文介绍如何通过Spring框架集成Activiti工作流引擎,包括配置流程引擎、事务管理、使用Spring Bean表达式及自动部署资源等关键步骤。

ProcessEngineFactoryBean

<beanid="processEngineConfiguration"class="org.activiti.spring.SpringProcessEngineConfiguration">
    ...
</bean>
 
<beanid="processEngine"class="org.activiti.spring.ProcessEngineFactoryBean">
 
<property name="processEngineConfiguration"ref="processEngineConfiguration"/>
</bean>

Transactions

<beansxmlns="http://www.springframework.org/schema/beans" 
       
xmlns:context="http://www.springframework.org/schema/context"
       
xmlns:tx="http://www.springframework.org/schema/tx"
       
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       
xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
                           http://www.springframework.org/schema/tx      http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"
>

 
<beanid="dataSource"class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
   
<propertyname="driverClass"value="org.h2.Driver"/>
   
<propertyname="url"value="jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000"/>
   
<propertyname="username"value="sa"/>
   
<propertyname="password"value=""/>
 
</bean>

 
<beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
   
<propertyname="dataSource"ref="dataSource"/>
 
</bean>
 
 
<beanid="processEngineConfiguration"class="org.activiti.spring.SpringProcessEngineConfiguration">
   
<propertyname="dataSource"ref="dataSource"/>
   
<propertyname="transactionManager"ref="transactionManager"/>
   
<propertyname="databaseSchemaUpdate"value="true"/>
   
<propertyname="jobExecutorActivate"value="false"/>
 
</bean>
 
 
<beanid="processEngine"class="org.activiti.spring.ProcessEngineFactoryBean">
   
<propertyname="processEngineConfiguration"ref="processEngineConfiguration"/>
 
</bean>
 
 
<beanid="repositoryService"factory-bean="processEngine"factory-method="getRepositoryService"/>
 
<beanid="runtimeService"factory-bean="processEngine"factory-method="getRuntimeService"/>
 
<beanid="taskService"factory-bean="processEngine"factory-method="getTaskService"/>
 
<beanid="historyService"factory-bean="processEngine"factory-method="getHistoryService"/>
 
<beanid="managementService"factory-bean="processEngine"factory-method="getManagementService"/>

...


<beans>  
  ...
 
<tx:annotation-driventransaction-manager="transactionManager"/>

 
<beanid="userBean"class="org.activiti.spring.test.UserBean">
   
<propertyname="runtimeService"ref="runtimeService"/>
 
</bean>

 
<beanid="printer"class="org.activiti.spring.test.Printer"/>

</beans>

第一步: 构造Spring Context
ClassPathXmlApplicationContext applicationContext = 
   
new ClassPathXmlApplicationContext("org/activiti/examples/spring/SpringTransactionIntegrationTest-context.xml");
或者

@ContextConfiguration("classpath:org/activiti/spring/test/transaction/SpringTransactionIntegrationTest-context.xml")
第二步:获取service bean并调用它的方法
RepositoryService repositoryService =(RepositoryService) applicationContext.getBean("repositoryService");
String deploymentId = repositoryService
 
.createDeployment()
 
.addClasspathResource("org/activiti/spring/test/hello.bpmn20.xml")
 
.deploy()
 
.getId();
   
也可以以下面方式使用bean
UserBean userBean =(UserBean) applicationContext.getBean("userBean");
userBean
.hello();

user bean的代码
publicclassUserBean{

 
/** injected by Spring */
 
privateRuntimeService runtimeService;

 
@Transactional
 
publicvoid hello(){
   
// here you can do transactional stuff in your domain model
   
// and it will be combined in the same transaction as
   
// the startProcessInstanceByKey to the Activiti RuntimeService
    runtimeService
.startProcessInstanceByKey("helloProcess");
 
}
 
 
publicvoid setRuntimeService(RuntimeService runtimeService){
   
this.runtimeService = runtimeService;
 
}
}


Expressions

 Spring配置片段

<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
  ...
  <property name="beans">
    <map>
      <entry key="printer" value-ref="printer" />
    </map>
  </property>
</bean>
  
  <bean id="printer" class="org.activiti.examples.spring.Printer" />

在流程定义文件中使用 spring.xml中的bean的方法的写法

<definitions id="definitions" ...>
  
  <process id="helloProcess">
  
    <startEvent id="start" />
    <sequenceFlow id="flow1" sourceRef="start" targetRef="print" />
    
    <serviceTask id="print" activiti:expression="#{printer.printMessage()}" />
    <sequenceFlow id="flow2" sourceRef="print" targetRef="end" />
    
    <endEvent id="end" />
    
  </process>

</definitions>
public class Printer {

  public void printMessage() {
    System.out.println("hello world");
  }
}
<beans ...>
  ...

  <bean id="printer" class="org.activiti.examples.spring.Printer" />

</beans>

Automatic resource deployment

 集成Spring对部署资源也有特性,在流程引擎配置中,你可以指定一系列资源,当流程引擎呗创建时,所有的资源被扫描部署。有一个过滤器负责阻止多次部署,只有当资源呗改变时才会部署到Activiti DB中。这就意味着在多数用例中,Spring容器经常被重启.  如下例子:

<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
  ...
  <property name="deploymentResources" value="classpath*:/org/activiti/spring/test/autodeployment/autodeploy.*.bpmn20.xml" />
</bean>
  
<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
  <property name="processEngineConfiguration" ref="processEngineConfiguration" />
</bean>

下面是基于Spring的测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:org/activiti/spring/test/junit4/springTypicalUsageTest-context.xml")
public class MyBusinessProcessTest {
  
  @Autowired
  private RuntimeService runtimeService;
  
  @Autowired
  private TaskService taskService;
  
  @Autowired
  @Rule
  public ActivitiRule activitiSpringRule;
  
  @Test
  @Deployment
  public void simpleProcessTest() {
    runtimeService.startProcessInstanceByKey("simpleProcess");
    Task task = taskService.createTaskQuery().singleResult();
    assertEquals("My Task", task.getName());
  
    taskService.complete(task.getId());
    assertEquals(0, runtimeService.createProcessInstanceQuery().count());
   
  }
}      
  

为了能够执行,还需要下面的

<bean id="activitiRule" class="org.activiti.engine.test.ActivitiRule">
  <property name="processEngine" ref="processEngine" />
</bean>  

 

 



转载于:https://www.cnblogs.com/yangw/p/3375879.html

解决报错[root@localhost docker]# docker logs -f tdm-jar LOGBACK: No context given for c.q.l.core.rolling.SizeAndTimeBasedRollingPolicy@667346055 _____ _____ _____ /\ \ /\ \ /\ \ /::\ \ /::\ \ /::\____\ \:::\ \ /::::\ \ /::::| | \:::\ \ /::::::\ \ /:::::| | \:::\ \ /:::/\:::\ \ /::::::| | \:::\ \ /:::/ \:::\ \ /:::/|::| | /::::\ \ /:::/ \:::\ \ /:::/ |::| | /::::::\ \ /:::/ / \:::\ \ /:::/ |::|___|______ /:::/\:::\ \ /:::/ / \:::\ ___\ /:::/ |::::::::\ \ /:::/ \:::\____\/:::/____/ \:::| /:::/ |:::::::::\____\ /:::/ \::/ /\:::\ \ /:::|____\::/ / ~~~~~/:::/ / /:::/ / \/____/ \:::\ \ /:::/ / \/____/ /:::/ / /:::/ / \:::\ \ /:::/ / /:::/ / /:::/ / \:::\ /:::/ / /:::/ / \::/ / \:::\ /:::/ / /:::/ / \/____/ \:::\/:::/ / /:::/ / \::::::/ / /:::/ / \::::/ / /:::/ / \::/____/ \::/ / ~~ \/____/ 2025-07-25 07:37:16,287 INFO [main] - cn.serverx.sx.ServerXApplication:55 - Starting ServerXApplication on 974d7161bb6c with PID 1 (/app/sx-admin-1.0-SNAPSHOT.jar started by root in /app) 2025-07-25 07:37:16,300 INFO [main] - cn.serverx.sx.ServerXApplication:655 - The following profiles are active: p 2025-07-25 07:37:26,626 INFO [main] - org.springframework.data.repository.config.RepositoryConfigurationDelegate:249 - Multiple Spring Data modules found, entering strict repository configuration mode! 2025-07-25 07:37:26,632 INFO [main] - org.springframework.data.repository.config.RepositoryConfigurationDelegate:127 - Bootstrapping Spring Data JPA repositories in DEFAULT mode. 2025-07-25 07:37:27,700 INFO [main] - org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport:348 - Spring Data JPA - Could not safely identify store assignment for repository candidate interface cn.serverx.sx.core.dao.elasticsearch.EsLogDao. If you want this repository to be a JPA repository, consider annotating your entities with one of these annotations: javax.persistence.Entity, javax.persistence.MappedSuperclass (preferred), or consider extending one of the following types with your repository: org.springframework.data.jpa.repository.JpaRepository. 2025-07-25 07:37:28,073 INFO [main] - org.springframework.data.repository.config.RepositoryConfigurationDelegate:187 - Finished Spring Data repository scanning in 1405ms. Found 27 JPA repository interfaces. 2025-07-25 07:37:28,223 INFO [main] - org.springframework.data.repository.config.RepositoryConfigurationDelegate:249 - Multiple Spring Data modules found, entering strict repository configuration mode! 2025-07-25 07:37:28,227 INFO [main] - org.springframework.data.repository.config.RepositoryConfigurationDelegate:127 - Bootstrapping Spring Data Redis repositories in DEFAULT mode. 2025-07-25 07:37:28,307 INFO [main] - org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport:348 - Spring Data Redis - Could not safely identify store assignment for repository candidate interface cn.serverx.sx.base.dao.DictDao. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository. 2025-07-25 07:37:28,322 INFO [main] - org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport:348 - Spring Data Redis - Could not safely identify store assignment for repository candidate interface cn.serverx.sx.base.dao.DictDataDao. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository. 2025-07-25 07:37:28,323 INFO [main] - org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport:348 - Spring Data Redis - Could not safely identify store assignment for repository candidate interface cn.serverx.sx.activiti.dao.ActBusinessDao. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository. 2025-07-25 07:37:28,324 INFO [main] - org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport:348 - Spring Data Redis - Could not safely identify store assignment for repository candidate interface cn.serverx.sx.activiti.dao.ActCategoryDao. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository. 2025-07-25 07:37:28,327 INFO [main] - org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport:348 - Spring Data Redis - Could not safely identify store assignment for repository candidate interface cn.serverx.sx.activiti.dao.ActModelDao. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository. 2025-07-25 07:37:28,328 INFO [main] - org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport:348 - Spring Data Redis - Could not safely identify store assignment for repository candidate interface cn.serverx.sx.activiti.dao.ActNodeDao. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository. 2025-07-25 07:37:28,328 INFO [main] - org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport:348 - Spring Data Redis - Could not safely identify store assignment for repository candidate interface cn.serverx.sx.activiti.dao.ActProcessDao. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository. 2025-07-25 07:37:28,329 INFO [main] - org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport:348 - Spring Data Redis - Could not safely identify store assignment for repository candidate interface cn.serverx.sx.activiti.dao.business.LeaveDao. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository. 2025-07-25 07:37:28,330 INFO [main] - org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport:348 - Spring Data Redis - Could not safely identify store assignment for repository candidate interface cn.serverx.sx.social.dao.GithubDao. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository. 2025-07-25 07:37:28,330 INFO [main] - org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport:348 - Spring Data Redis - Could not safely identify store assignment for repository candidate interface cn.serverx.sx.social.dao.QQDao. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository. 2025-07-25 07:37:28,330 INFO [main] - org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport:348 - Spring Data Redis - Could not safely identify store assignment for repository candidate interface cn.serverx.sx.social.dao.WechatDao. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository. 2025-07-25 07:37:28,358 INFO [main] - org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport:348 - Spring Data Redis - Could not safely identify store assignment for repository candidate interface cn.serverx.sx.social.dao.WeiboDao. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository. 2025-07-25 07:37:28,360 INFO [main] - org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport:348 - Spring Data Redis - Could not safely identify store assignment for repository candidate interface cn.serverx.sx.core.dao.DepartmentDao. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository. 2025-07-25 07:37:28,360 INFO [main] - org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport:348 - Spring Data Redis - Could not safely identify store assignment for repository candidate interface cn.serverx.sx.core.dao.DepartmentHeaderDao. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository. 2025-07-25 07:37:28,361 INFO [main] - org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport:348 - Spring Data Redis - Could not safely identify store assignment for repository candidate interface cn.serverx.sx.core.dao.elasticsearch.EsLogDao. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository. 2025-07-25 07:37:28,361 INFO [main] - org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport:348 - Spring Data Redis - Could not safely identify store assignment for repository candidate interface cn.serverx.sx.core.dao.LogDao. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository. 2025-07-25 07:37:28,367 INFO [main] - org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport:348 - Spring Data Redis - Could not safely identify store assignment for repository candidate interface cn.serverx.sx.core.dao.MessageDao. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository. 2025-07-25 07:37:28,367 INFO [main] - org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport:348 - Spring Data Redis - Could not safely identify store assignment for repository candidate interface cn.serverx.sx.core.dao.MessageSendDao. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository. 2025-07-25 07:37:28,368 INFO [main] - org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport:348 - Spring Data Redis - Could not safely identify store assignment for repository candidate interface cn.serverx.sx.core.dao.PermissionDao. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository. 2025-07-25 07:37:28,368 INFO [main] - org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport:348 - Spring Data Redis - Could not safely identify store assignment for repository candidate interface cn.serverx.sx.core.dao.RoleDao. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository. 2025-07-25 07:37:28,369 INFO [main] - org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport:348 - Spring Data Redis - Could not safely identify store assignment for repository candidate interface cn.serverx.sx.core.dao.RoleDepartmentDao. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository. 2025-07-25 07:37:28,378 INFO [main] - org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport:348 - Spring Data Redis - Could not safely identify store assignment for repository candidate interface cn.serverx.sx.core.dao.RolePermissionDao. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository. 2025-07-25 07:37:28,378 INFO [main] - org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport:348 - Spring Data Redis - Could not safely identify store assignment for repository candidate interface cn.serverx.sx.core.dao.SettingDao. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository. 2025-07-25 07:37:28,379 INFO [main] - org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport:348 - Spring Data Redis - Could not safely identify store assignment for repository candidate interface cn.serverx.sx.core.dao.UserDao. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository. 2025-07-25 07:37:28,379 INFO [main] - org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport:348 - Spring Data Redis - Could not safely identify store assignment for repository candidate interface cn.serverx.sx.core.dao.UserRoleDao. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository. 2025-07-25 07:37:28,380 INFO [main] - org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport:348 - Spring Data Redis - Could not safely identify store assignment for repository candidate interface cn.serverx.sx.file.dao.FileDao. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository. 2025-07-25 07:37:28,392 INFO [main] - org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport:348 - Spring Data Redis - Could not safely identify store assignment for repository candidate interface cn.serverx.sx.quartz.dao.QuartzJobDao. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository. 2025-07-25 07:37:28,397 INFO [main] - org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport:348 - Spring Data Redis - Could not safely identify store assignment for repository candidate interface cn.serverx.sx.open.dao.ClientDao. If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository. 2025-07-25 07:37:28,397 INFO [main] - org.springframework.data.repository.config.RepositoryConfigurationDelegate:187 - Finished Spring Data repository scanning in 149ms. Found 0 Redis repository interfaces. 2025-07-25 07:37:29,164 WARN [main] - org.mybatis.spring.mapper.ClassPathMapperScanner:44 - Skipping MapperFactoryBean with name 'permissionMapper' and 'cn.serverx.sx.core.dao.mapper.PermissionMapper' mapperInterface. Bean already defined with the same name! 2025-07-25 07:37:29,164 WARN [main] - org.mybatis.spring.mapper.ClassPathMapperScanner:44 - Skipping MapperFactoryBean with name 'userRoleMapper' and 'cn.serverx.sx.core.dao.mapper.UserRoleMapper' mapperInterface. Bean already defined with the same name! 2025-07-25 07:37:29,172 WARN [main] - org.mybatis.spring.mapper.ClassPathMapperScanner:44 - Skipping MapperFactoryBean with name 'actMapper' and 'cn.serverx.sx.activiti.dao.mapper.ActMapper' mapperInterface. Bean already defined with the same name! 2025-07-25 07:37:29,173 WARN [main] - org.mybatis.spring.mapper.ClassPathMapperScanner:44 - Skipping MapperFactoryBean with name 'historyIdentityMapper' and 'cn.serverx.sx.activiti.dao.mapper.HistoryIdentityMapper' mapperInterface. Bean already defined with the same name! 2025-07-25 07:37:29,173 WARN [main] - org.mybatis.spring.mapper.ClassPathMapperScanner:44 - Skipping MapperFactoryBean with name 'runIdentityMapper' and 'cn.serverx.sx.activiti.dao.mapper.RunIdentityMapper' mapperInterface. Bean already defined with the same name! 2025-07-25 07:37:30,140 INFO [main] - com.ulisesbocchio.jasyptspringboot.configuration.EnableEncryptablePropertiesBeanFactoryPostProcessor:48 - Post-processing PropertySource instances 2025-07-25 07:37:30,481 INFO [main] - com.ulisesbocchio.jasyptspringboot.EncryptablePropertySourceConverter:44 - Converting PropertySource configurationProperties [org.springframework.boot.context.properties.source.ConfigurationPropertySourcesPropertySource] to AOP Proxy 2025-07-25 07:37:30,482 INFO [main] - com.ulisesbocchio.jasyptspringboot.EncryptablePropertySourceConverter:44 - Converting PropertySource commandLineArgs [org.springframework.core.env.SimpleCommandLinePropertySource] to EncryptableEnumerablePropertySourceWrapper 2025-07-25 07:37:30,482 INFO [main] - com.ulisesbocchio.jasyptspringboot.EncryptablePropertySourceConverter:44 - Converting PropertySource servletConfigInitParams [org.springframework.core.env.PropertySource$StubPropertySource] to EncryptablePropertySourceWrapper 2025-07-25 07:37:30,483 INFO [main] - com.ulisesbocchio.jasyptspringboot.EncryptablePropertySourceConverter:44 - Converting PropertySource servletContextInitParams [org.springframework.core.env.PropertySource$StubPropertySource] to EncryptablePropertySourceWrapper 2025-07-25 07:37:30,483 INFO [main] - com.ulisesbocchio.jasyptspringboot.EncryptablePropertySourceConverter:44 - Converting PropertySource systemProperties [org.springframework.core.env.PropertiesPropertySource] to EncryptableMapPropertySourceWrapper 2025-07-25 07:37:30,483 INFO [main] - com.ulisesbocchio.jasyptspringboot.EncryptablePropertySourceConverter:44 - Converting PropertySource systemEnvironment [org.springframework.boot.env.SystemEnvironmentPropertySourceEnvironmentPostProcessor$OriginAwareSystemEnvironmentPropertySource] to EncryptableSystemEnvironmentPropertySourceWrapper 2025-07-25 07:37:30,483 INFO [main] - com.ulisesbocchio.jasyptspringboot.EncryptablePropertySourceConverter:44 - Converting PropertySource random [org.springframework.boot.env.RandomValuePropertySource] to EncryptablePropertySourceWrapper 2025-07-25 07:37:30,484 INFO [main] - com.ulisesbocchio.jasyptspringboot.EncryptablePropertySourceConverter:44 - Converting PropertySource applicationConfig: [file:./application-p.yml] [org.springframework.boot.env.OriginTrackedMapPropertySource] to EncryptableMapPropertySourceWrapper 2025-07-25 07:37:30,484 INFO [main] - com.ulisesbocchio.jasyptspringboot.EncryptablePropertySourceConverter:44 - Converting PropertySource applicationConfig: [classpath:/application.yml] [org.springframework.boot.env.OriginTrackedMapPropertySource] to EncryptableMapPropertySourceWrapper 2025-07-25 07:37:32,773 INFO [main] - org.springframework.integration.config.DefaultConfiguringBeanFactoryPostProcessor:213 - No bean named 'errorChannel' has been explicitly defined. Therefore, a default PublishSubscribeChannel will be created. 2025-07-25 07:37:32,785 INFO [main] - org.springframework.integration.config.DefaultConfiguringBeanFactoryPostProcessor:300 - No bean named 'taskScheduler' has been explicitly defined. Therefore, a default ThreadPoolTaskScheduler will be created. 2025-07-25 07:37:32,807 INFO [main] - org.springframework.integration.config.DefaultConfiguringBeanFactoryPostProcessor:460 - No bean named 'integrationHeaderChannelRegistry' has been explicitly defined. Therefore, a default DefaultHeaderChannelRegistry will be created. 2025-07-25 07:37:33,452 INFO [main] - com.ulisesbocchio.jasyptspringboot.filter.DefaultLazyPropertyFilter:31 - Property Filter custom Bean not found with name 'encryptablePropertyFilter'. Initializing Default Property Filter 2025-07-25 07:37:33,763 INFO [main] - org.springframework.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:330 - Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 2025-07-25 07:37:34,550 INFO [main] - org.springframework.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:330 - Bean 'redisCacheConfig' of type [cn.serverx.sx.core.config.cache.RedisCacheConfig$$EnhancerBySpringCGLIB$$c82ebc37] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 2025-07-25 07:37:34,849 INFO [main] - org.springframework.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:330 - Bean 'org.springframework.security.config.annotation.configuration.ObjectPostProcessorConfiguration' of type [org.springframework.security.config.annotation.configuration.ObjectPostProcessorConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 2025-07-25 07:37:34,928 INFO [main] - org.springframework.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:330 - Bean 'objectPostProcessor' of type [org.springframework.security.config.annotation.configuration.AutowireBeanFactoryObjectPostProcessor] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 2025-07-25 07:37:34,944 INFO [main] - org.springframework.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:330 - Bean 'org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler@44e3760b' of type [org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 2025-07-25 07:37:34,948 INFO [main] - org.springframework.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:330 - Bean 'org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration' of type [org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 2025-07-25 07:37:34,993 INFO [main] - org.springframework.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:330 - Bean 'methodSecurityMetadataSource' of type [org.springframework.security.access.method.DelegatingMethodSecurityMetadataSource] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 2025-07-25 07:37:35,059 INFO [main] - org.springframework.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:330 - Bean 'org.springframework.integration.config.IntegrationManagementConfiguration' of type [org.springframework.integration.config.IntegrationManagementConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 2025-07-25 07:37:35,140 INFO [main] - org.springframework.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:330 - Bean 'integrationChannelResolver' of type [org.springframework.integration.support.channel.BeanFactoryChannelResolver] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 2025-07-25 07:37:35,179 INFO [main] - org.springframework.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:330 - Bean 'integrationDisposableAutoCreatedBeans' of type [org.springframework.integration.config.annotation.Disposables] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 2025-07-25 07:37:36,005 INFO [main] - com.ulisesbocchio.jasyptspringboot.resolver.DefaultLazyPropertyResolver:35 - Property Resolver custom Bean not found with name 'encryptablePropertyResolver'. Initializing Default Property Resolver 2025-07-25 07:37:36,029 INFO [main] - com.ulisesbocchio.jasyptspringboot.detector.DefaultLazyPropertyDetector:35 - Property Detector custom Bean not found with name 'encryptablePropertyDetector'. Initializing Default Property Detector 2025-07-25 07:37:37,980 INFO [main] - org.springframework.boot.web.embedded.tomcat.TomcatWebServer:92 - Tomcat initialized with port(s): 8862 (http) 2025-07-25 07:37:38,088 INFO [main] - org.apache.catalina.core.StandardService:173 - Starting service [Tomcat] 2025-07-25 07:37:38,089 INFO [main] - org.apache.catalina.core.StandardEngine:173 - Starting Servlet engine: [Apache Tomcat/9.0.29] 2025-07-25 07:37:38,484 INFO [main] - org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/]:173 - Initializing Spring embedded WebApplicationContext 2025-07-25 07:37:38,485 INFO [main] - org.springframework.web.context.ContextLoader:284 - Root WebApplicationContext: initialization completed in 21879 ms 2025-07-25 07:37:42,651 INFO [main] - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure:56 - Init DruidDataSource 2025-07-25 07:37:45,200 INFO [main] - com.alibaba.druid.pool.DruidDataSource:1010 - {dataSource-1} inited 2025-07-25 07:37:47,770 INFO [main] - org.hibernate.jpa.internal.util.LogHelper:31 - HHH000204: Processing PersistenceUnitInfo [name: default] 2025-07-25 07:37:48,017 INFO [main] - org.hibernate.Version:46 - HHH000412: Hibernate Core {5.4.9.Final} 2025-07-25 07:37:48,022 INFO [main] - org.hibernate.cfg.Environment:184 - HHH000205: Loaded properties from resource hibernate.properties: {hibernate.bytecode.use_reflection_optimizer=false, hibernate.dialect.storage_engine=innodb} 2025-07-25 07:37:48,995 INFO [main] - org.hibernate.annotations.common.Version:49 - HCANN000001: Hibernate Commons Annotations {5.1.0.Final} 2025-07-25 07:37:49,477 INFO [main] - org.hibernate.dialect.Dialect:172 - HHH000400: Using dialect: org.hibernate.dialect.MySQL8Dialect 2025-07-25 07:37:56,804 INFO [main] - org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator:52 - HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] 2025-07-25 07:37:57,007 INFO [main] - org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean:416 - Initialized JPA EntityManagerFactory for persistence unit 'default' 2025-07-25 07:37:59,055 WARN [main] - cn.serverx.sx.core.config.security.permission.MyFilterSecurityInterceptor:159 - Could not validate configuration attributes as the SecurityMetadataSource did not return any attributes from getAllConfigAttributes() 2025-07-25 07:38:00,730 INFO [main] - org.springframework.boot.actuate.endpoint.web.ServletEndpointRegistrar:75 - Registered '/serverx/actuator/jolokia' to jolokia-actuator-endpoint _ _ |_ _ _|_. ___ _ | _ | | |\/|_)(_| | |_\ |_)||_|_\ / | 3.3.1 2025-07-25 07:38:12,093 INFO [main] - org.quartz.impl.StdSchedulerFactory:1220 - Using default implementation for ThreadExecutor 2025-07-25 07:38:12,235 INFO [main] - org.quartz.core.SchedulerSignalerImpl:61 - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl 2025-07-25 07:38:12,235 INFO [main] - org.quartz.core.QuartzScheduler:229 - Quartz Scheduler v.2.3.2 created. 2025-07-25 07:38:12,275 INFO [main] - org.springframework.scheduling.quartz.LocalDataSourceJobStore:672 - Using db table-based data access locking (synchronization). 2025-07-25 07:38:12,281 INFO [main] - org.springframework.scheduling.quartz.LocalDataSourceJobStore:145 - JobStoreCMT initialized. 2025-07-25 07:38:12,283 INFO [main] - org.quartz.core.QuartzScheduler:294 - Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. NOT STARTED. Currently in standby mode. Number of jobs executed: 0 Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. Using job-store 'org.springframework.scheduling.quartz.LocalDataSourceJobStore' - which supports persistence. and is not clustered. 2025-07-25 07:38:12,283 INFO [main] - org.quartz.impl.StdSchedulerFactory:1374 - Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. 2025-07-25 07:38:12,284 INFO [main] - org.quartz.impl.StdSchedulerFactory:1378 - Quartz scheduler version: 2.3.2 2025-07-25 07:38:12,284 INFO [main] - org.quartz.core.QuartzScheduler:2293 - JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@3ea84e01 Hibernate: select quartzjob0_.id as id1_41_, quartzjob0_.create_by as create_b2_41_, quartzjob0_.create_time as create_t3_41_, quartzjob0_.del_flag as del_flag4_41_, quartzjob0_.update_by as update_b5_41_, quartzjob0_.update_time as update_t6_41_, quartzjob0_.cron_expression as cron_exp7_41_, quartzjob0_.description as descript8_41_, quartzjob0_.job_class_name as job_clas9_41_, quartzjob0_.parameter as paramet10_41_, quartzjob0_.status as status11_41_ from t_quartz_job quartzjob0_ where quartzjob0_.job_class_name=? 2025-07-25 07:38:27,622 ERROR [main] - cn.serverx.sx.job.init.JobInitConfig:122 - org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock: Table 'tdm.qrtz_locks' doesn't exist [See nested exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'tdm.qrtz_locks' doesn't exist] 2025-07-25 07:38:28,007 WARN [main] - org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext:558 - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jobInitConfig': Invocation of init method failed; nested exception is ServerXException(msg=创建定时任务失败) 2025-07-25 07:38:28,104 INFO [main] - org.springframework.scheduling.quartz.SchedulerFactoryBean:845 - Shutting down Quartz Scheduler 2025-07-25 07:38:28,106 INFO [main] - org.quartz.core.QuartzScheduler:666 - Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. 2025-07-25 07:38:28,106 INFO [main] - org.quartz.core.QuartzScheduler:585 - Scheduler quartzScheduler_$_NON_CLUSTERED paused. 2025-07-25 07:38:28,118 INFO [main] - org.quartz.core.QuartzScheduler:740 - Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. 2025-07-25 07:38:28,155 INFO [main] - org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean:598 - Closing JPA EntityManagerFactory for persistence unit 'default' 2025-07-25 07:38:28,200 INFO [main] - com.alibaba.druid.pool.DruidDataSource:2003 - {dataSource-1} closing ... 2025-07-25 07:38:28,549 INFO [main] - com.alibaba.druid.pool.DruidDataSource:2075 - {dataSource-1} closed 2025-07-25 07:38:28,886 INFO [main] - org.apache.catalina.core.StandardService:173 - Stopping service [Tomcat] 2025-07-25 07:38:29,338 INFO [main] - org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener:136 - Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2025-07-25 07:38:29,385 ERROR [main] - org.springframework.boot.SpringApplication:826 - Application run failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jobInitConfig': Invocation of init method failed; nested exception is ServerXException(msg=创建定时任务失败) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:160) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:416) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1788) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:595) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:879) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:878) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550) at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) at cn.serverx.sx.ServerXApplication.main(ServerXApplication.java:87) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) at org.springframework.boot.loader.Launcher.launch(Launcher.java:108) at org.springframework.boot.loader.Launcher.launch(Launcher.java:58) at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88) Caused by: cn.serverx.sx.core.common.exception.ServerXException: 创建定时任务失败 at cn.serverx.sx.job.init.JobInitConfig.add(JobInitConfig.java:123) at cn.serverx.sx.job.init.JobInitConfig.init(JobInitConfig.java:94) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:389) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:333) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:157) ... 26 common frames omitted
07-26
<think>我们分析一下日志中的错误信息: 1. 在启动过程中,最后出现的关键错误是: ``` 2025-07-25 07:38:27,622 ERROR [main] - cn.serverx.sx.job.init.JobInitConfig:122 - org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock: Table 'tdm.qrtz_locks' doesn't exist [See nested exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'tdm.qrtz_locks' doesn't exist] ``` 2. 紧接着,由于这个错误,导致 `JobInitConfig` 在初始化时失败,抛出了 `ServerXException(msg=创建定时任务失败)`。 3. 然后应用上下文关闭,应用启动失败。 ### 问题原因 - 错误信息明确指出了数据库 `tdm` 中缺少 `qrtz_locks` 表。 - Quartz 是一个任务调度框架,它需要一些数据库表来存储调度相关的信息(如任务、触发器、锁等)。当使用JDBC存储方式时,Quartz要求预先在数据库中创建这些表。 - 从错误信息看,Quartz在尝试获取数据库锁时,发现表 `tdm.qrtz_locks` 不存在,因此抛出异常。 ### 解决方案 #### 步骤1:创建Quartz所需的数据库表 - 从Quartz的官方发布包中获取SQL脚本(可以在Quartz的官网下载,或者从GitHub仓库获取)。 - 根据你使用的数据库类型(这里是MySQL)和Quartz版本(日志中显示Quartz版本为2.3.2),选择正确的SQL脚本。 - 在数据库 `tdm` 中执行这些SQL脚本,创建所需的表(包括 `qrtz_locks` 等)。 #### 步骤2:检查数据库连接配置 - 确保应用配置中关于Quartz的数据源配置正确,指向数据库 `tdm`。 #### 步骤3:检查Quartz配置 - 在应用的配置文件中,检查Quartz的相关配置,确保配置了使用JDBC存储方式(`org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX` 或类似配置)。 - 同时,确保配置了正确的数据源(`org.quartz.jobStore.dataSource`)和表前缀(`org.quartz.jobStore.tablePrefix`,如果表有前缀的话)。 #### 步骤4:重新启动应用 - 在创建好数据库表后,重新启动应用。 ### 补充说明 - 如果项目使用了Spring Boot,可能还需要在配置文件中启用Quartz的JDBC存储方式,并指定初始化策略(例如,如果表已经存在,则不需要每次启动都创建表)。 - 如果项目使用Spring Boot Starter Quartz,它可能不会自动创建表,需要手动执行SQL脚本。 ### 如何获取Quartz的SQL脚本? - 访问Quartz的官网:http://www.quartz-scheduler.org/ - 或者直接访问GitHub:https://github.com/quartz-scheduler/quartz/tree/master/quartz-core/src/main/resources/org/quartz/impl/jdbcjobstore - 在该目录下,有不同数据库的SQL脚本,选择对应的MySQL脚本(例如:`tables_mysql.sql`)。 ### 示例操作步骤(假设使用MySQL) 1. 下载 `tables_mysql.sql` 文件。 2. 登录到MySQL数据库,选择 `tdm` 数据库: ```bash mysql -u root -p use tdm; ``` 3. 执行SQL脚本: ```bash source /path/to/tables_mysql.sql; ``` 4. 确认表已创建(以 `qrtz_` 开头的表)。 §§相关问题§§ 1. Quartz调度框架在集群模式下需要哪些额外的数据库表? 2. 如何在Spring Boot中配置Quartz使用JDBC存储方式? 3. 如何解决Quartz启动时出现的表不存在错误? 4. Quartz的数据库表前缀(如qrtz_)可以在配置中修改吗?如何修改? 5. 除了MySQL,Quartz还支持哪些数据库?如何切换?</think>### 问题分析及解决方案 日志中的关键错误是: ``` org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock: Table 'tdm.qrtz_locks' doesn't exist ``` #### 问题原因: 1. **Quartz数据库表缺失**:应用使用Quartz作为任务调度框架,需要数据库表存储任务信息,但`tdm`数据库中缺少Quartz所需的表(如`qrtz_locks`等)。 2. **数据库初始化失败**:项目启动时尝试初始化定时任务,但依赖的Quartz表未创建。 3. **Spring Boot配置问题**:可能未正确配置Quartz的数据库初始化策略。 #### 解决方案: 1. **创建Quartz所需数据库表**: - 从Quartz官方获取对应版本的SQL脚本([Quartz SQL脚本](https://github.com/quartz-scheduler/quartz/tree/main/quartz-core/src/main/resources/org/quartz/impl/jdbcjobstore)) - 执行MySQL建表脚本(以Quartz 2.3.2为例): ```sql -- 在tdm数据库中执行 CREATE TABLE qrtz_locks ( SCHED_NAME VARCHAR(120) NOT NULL, LOCK_NAME VARCHAR(40) NOT NULL, PRIMARY KEY (SCHED_NAME,LOCK_NAME) ); -- 还需创建其他表:qrtz_triggers, qrtz_job_details 等 ``` 2. **检查Spring Boot配置**: 在`application.yml`中添加Quartz初始化配置: ```yaml spring: quartz: jdbc: initialize-schema: always # 首次启动自动建表 job-store-type: jdbc # 使用JDBC存储 ``` 3. **验证数据库连接**: 确保配置文件中数据库连接参数正确: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/tdm?useSSL=false username: root password: your_password ``` 4. **重新启动应用**: ```bash docker restart tdm-jar ``` #### 预防措施: - 在Dockerfile中添加初始化SQL的执行步骤 - 使用Flyway/Liquibase管理数据库版本 - 测试环境配置`initialize-schema: always`,生产环境用`never`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值