Multi Schema Multi Tenant throws exception while registering a tenant

Hi,

I am trying to use multi schema based tenant. I ran a test set up which result in error. Please advise on this.

Code Snippet written in kotlin

 private fun setupProcessEngine(sharedExecutor: Boolean) {

        config = MultiSchemaMultiTenantProcessEngineConfiguration(tenantInfoHolder)

        config!!.databaseType = MultiSchemaMultiTenantProcessEngineConfiguration.DATABASE_TYPE_MYSQL
        config!!.databaseSchemaUpdate = MultiSchemaMultiTenantProcessEngineConfiguration.DB_SCHEMA_UPDATE_CREATE_DROP

        config!!.isAsyncExecutorActivate = true
        config!!.isDisableIdmEngine = true

        if (sharedExecutor) {
            config!!.asyncExecutor = SharedExecutorServiceAsyncExecutor(tenantInfoHolder)
        } else {
            config!!.asyncExecutor = ExecutorPerTenantAsyncExecutor(tenantInfoHolder)
        } 

        // jdbc:mysql://127.0.0.1:3306/cam?useUnicode=true&characterEncoding=UTF-8

        tenantInfoHolder?.allTenants?.forEach() {
            println(it)
            config!!.registerTenant(it, createNewDataSource("jdbc:mysql://127.0.0.1:3306/$it", "root", "root@123"))
        }
        processEngine = config!!.buildProcessEngine()
    }

    private fun createNewDataSource(url: String, user: String, password: String): DataSource {
        println("Creating  datasource  URL $url  user $user password $password ")
        return DataSourceBuilder.create().url(url).username(user).password(password).build()
    }

Exception :

indent preformatted text by 4 spaces

. ____ _ __ _ _
/\ / __ _ () __ __ _ \ \ \
( ( )_
_ | '_ | '| | ’ / ` | \ \ \
\/ )| |)| | | | | || (| | ) ) ) )
’ |
| .__|| ||| |_, | / / / /
=========|
|==============|/=////
:: Spring Boot :: (v2.1.7.RELEASE)

2019-09-19 11:16:59.325 INFO 13413 — [ Test worker] com.cam.CamApplicationTests : Starting CamApplicationTests
2019-09-19 11:16:59.327 INFO 13413 — [ Test worker] com.cam.CamApplicationTests : No active profile set, falling back to default profiles: default
2019-09-19 11:17:00.844 INFO 13413 — [ Test worker] com.zaxxer.hikari.HikariDataSource : SpringBootJPAHikariCP - Starting…
2019-09-19 11:17:01.129 INFO 13413 — [ Test worker] com.zaxxer.hikari.HikariDataSource : SpringBootJPAHikariCP - Start completed.
2019-09-19 11:17:01.738 INFO 13413 — [ Test worker] liquibase.executor.jvm.JdbcExecutor : SELECT COUNT() FROM cam.DATABASECHANGELOGLOCK
2019-09-19 11:17:01.752 INFO 13413 — [ Test worker] liquibase.executor.jvm.JdbcExecutor : SELECT COUNT(
) FROM cam.DATABASECHANGELOGLOCK
2019-09-19 11:17:01.756 INFO 13413 — [ Test worker] liquibase.executor.jvm.JdbcExecutor : SELECT LOCKED FROM cam.DATABASECHANGELOGLOCK WHERE ID=1
2019-09-19 11:17:02.070 INFO 13413 — [ Test worker] l.lockservice.StandardLockService : Successfully acquired change log lock
2019-09-19 11:17:03.011 INFO 13413 — [ Test worker] liquibase.executor.jvm.JdbcExecutor : SELECT MD5SUM FROM cam.DATABASECHANGELOG WHERE MD5SUM IS NOT NULL LIMIT 1
2019-09-19 11:17:03.012 INFO 13413 — [ Test worker] liquibase.executor.jvm.JdbcExecutor : SELECT COUNT(*) FROM cam.DATABASECHANGELOG
2019-09-19 11:17:03.014 INFO 13413 — [ Test worker] l.c.StandardChangeLogHistoryService : Reading from cam.DATABASECHANGELOG
2019-09-19 11:17:03.014 INFO 13413 — [ Test worker] liquibase.executor.jvm.JdbcExecutor : SELECT * FROM cam.DATABASECHANGELOG ORDER BY DATEEXECUTED ASC, ORDEREXECUTED ASC
2019-09-19 11:17:03.735 INFO 13413 — [ Test worker] l.lockservice.StandardLockService : Successfully released change log lock
cam5
Creating datasource URL jdbc:mysql://127.0.0.1:3306/cam5 user root password root@123
cam6
Creating datasource URL jdbc:mysql://127.0.0.1:3306/cam6 user root password root@123
cam7
Creating datasource URL jdbc:mysql://127.0.0.1:3306/cam7 user root password root@123
2019-09-19 11:17:03.822 INFO 13413 — [ Test worker] emaMultiTenantProcessEngineConfiguration : Found 1 Engine Configurators in total:
2019-09-19 11:17:03.822 INFO 13413 — [ Test worker] emaMultiTenantProcessEngineConfiguration : class org.flowable.idm.engine.configurator.IdmEngineConfigurator (priority:100000)
2019-09-19 11:17:03.822 INFO 13413 — [ Test worker] emaMultiTenantProcessEngineConfiguration : Executing beforeInit() of class org.flowable.idm.engine.configurator.IdmEngineConfigurator (priority:100000)
2019-09-19 11:17:04.710 INFO 13413 — [ Test worker] emaMultiTenantProcessEngineConfiguration : Executing configure() of class org.flowable.idm.engine.configurator.IdmEngineConfigurator (priority:100000)
2019-09-19 11:17:04.720 INFO 13413 — [ Test worker] o.f.idm.engine.impl.IdmEngineImpl : IdmEngine default created
2019-09-19 11:17:04.722 INFO 13413 — [ Test worker] o.f.engine.impl.ProcessEngineImpl : ProcessEngine default created
2019-09-19 11:17:04.728 INFO 13413 — [ Test worker] emaMultiTenantProcessEngineConfiguration : creating/validating database schema for tenant cam5
setting tenantStore cam5
getCurrentTenantId called cam5
2019-09-19 11:17:04.734 INFO 13413 — [ Test worker] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting…
2019-09-19 11:17:04.745 INFO 13413 — [ Test worker] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2019-09-19 11:17:04.752 INFO 13413 — [ Test worker] o.f.c.e.impl.db.CommonDbSchemaManager : performing create on common with resource org/flowable/common/db/create/flowable.mysql.create.common.sql
2019-09-19 11:17:04.752 INFO 13413 — [ Test worker] o.f.c.e.impl.db.CommonDbSchemaManager : Found MySQL: majorVersion=8 minorVersion=0
2019-09-19 11:17:09.810 INFO 13413 — [ Test worker] o.f.i.s.i.d.IdentityLinkDbSchemaManager : performing create on identitylink with resource org/flowable/identitylink/service/db/create/flowable.mysql.create.identitylink.sql
2019-09-19 11:17:09.810 INFO 13413 — [ Test worker] o.f.i.s.i.d.IdentityLinkDbSchemaManager : Found MySQL: majorVersion=8 minorVersion=0
2019-09-19 11:17:19.891 INFO 13413 — [ Test worker] o.f.i.s.i.d.IdentityLinkDbSchemaManager : performing create on identitylink.history with resource org/flowable/identitylink/service/db/create/flowable.mysql.create.identitylink.history.sql
2019-09-19 11:17:19.892 INFO 13413 — [ Test worker] o.f.i.s.i.d.IdentityLinkDbSchemaManager : Found MySQL: majorVersion=8 minorVersion=0
2019-09-19 11:17:27.653 INFO 13413 — [ Test worker] o.f.e.s.i.db.EntityLinkDbSchemaManager : performing create on entitylink with resource org/flowable/entitylink/service/db/create/flowable.mysql.create.entitylink.sql
2019-09-19 11:17:27.653 INFO 13413 — [ Test worker] o.f.e.s.i.db.EntityLinkDbSchemaManager : Found MySQL: majorVersion=8 minorVersion=0
2019-09-19 11:17:33.360 INFO 13413 — [ Test worker] o.f.e.s.i.db.EntityLinkDbSchemaManager : performing create on entitylink.history with resource org/flowable/entitylink/service/db/create/flowable.mysql.create.entitylink.history.sql
2019-09-19 11:17:33.361 INFO 13413 — [ Test worker] o.f.e.s.i.db.EntityLinkDbSchemaManager : Found MySQL: majorVersion=8 minorVersion=0
2019-09-19 11:17:38.891 INFO 13413 — [ Test worker] e.s.i.d.EventSubscriptionDbSchemaManager : performing create on eventsubscription with resource org/flowable/eventsubscription/service/db/create/flowable.mysql.create.eventsubscription.sql
2019-09-19 11:17:38.892 INFO 13413 — [ Test worker] e.s.i.d.EventSubscriptionDbSchemaManager : Found MySQL: majorVersion=8 minorVersion=0
2019-09-19 11:17:42.616 INFO 13413 — [ Test worker] o.f.t.s.impl.db.TaskDbSchemaManager : performing create on task with resource org/flowable/task/service/db/create/flowable.mysql.create.task.sql
2019-09-19 11:17:42.617 INFO 13413 — [ Test worker] o.f.t.s.impl.db.TaskDbSchemaManager : Found MySQL: majorVersion=8 minorVersion=0
2019-09-19 11:17:51.207 INFO 13413 — [ Test worker] o.f.t.s.impl.db.TaskDbSchemaManager : performing create on task.history with resource org/flowable/task/service/db/create/flowable.mysql.create.task.history.sql
2019-09-19 11:17:51.209 INFO 13413 — [ Test worker] o.f.t.s.impl.db.TaskDbSchemaManager : Found MySQL: majorVersion=8 minorVersion=0
2019-09-19 11:18:01.383 INFO 13413 — [ Test worker] o.f.v.s.impl.db.VariableDbSchemaManager : performing create on variable with resource org/flowable/variable/service/db/create/flowable.mysql.create.variable.sql
2019-09-19 11:18:01.384 INFO 13413 — [ Test worker] o.f.v.s.impl.db.VariableDbSchemaManager : Found MySQL: majorVersion=8 minorVersion=0
2019-09-19 11:18:13.910 INFO 13413 — [ Test worker] o.f.v.s.impl.db.VariableDbSchemaManager : performing create on variable.history with resource org/flowable/variable/service/db/create/flowable.mysql.create.variable.history.sql
2019-09-19 11:18:13.911 INFO 13413 — [ Test worker] o.f.v.s.impl.db.VariableDbSchemaManager : Found MySQL: majorVersion=8 minorVersion=0
2019-09-19 11:18:21.203 INFO 13413 — [ Test worker] o.f.j.s.impl.db.JobDbSchemaManager : performing create on job with resource org/flowable/job/service/db/create/flowable.mysql.create.job.sql
2019-09-19 11:18:21.204 INFO 13413 — [ Test worker] o.f.j.s.impl.db.JobDbSchemaManager : Found MySQL: majorVersion=8 minorVersion=0
2019-09-19 11:19:52.957 INFO 13413 — [ Test worker] o.f.e.impl.db.ProcessDbSchemaManager : performing create on engine with resource org/flowable/db/create/flowable.mysql.create.engine.sql
2019-09-19 11:19:52.958 INFO 13413 — [ Test worker] o.f.e.impl.db.ProcessDbSchemaManager : Found MySQL: majorVersion=8 minorVersion=0
2019-09-19 11:24:18.328 INFO 13413 — [ Test worker] o.f.e.impl.db.ProcessDbSchemaManager : performing create on history with resource org/flowable/db/create/flowable.mysql.create.history.sql
2019-09-19 11:24:18.329 INFO 13413 — [ Test worker] o.f.e.impl.db.ProcessDbSchemaManager : Found MySQL: majorVersion=8 minorVersion=0
setting cam5
2019-09-19 11:24:57.287 INFO 13413 — [ Test worker] emaMultiTenantProcessEngineConfiguration : creating/validating database schema for tenant cam6
setting tenantStore cam6
getCurrentTenantId called cam6
2019-09-19 11:24:57.288 INFO 13413 — [ Test worker] com.zaxxer.hikari.HikariDataSource : HikariPool-2 - Starting…
2019-09-19 11:24:57.304 INFO 13413 — [ Test worker] com.zaxxer.hikari.HikariDataSource : HikariPool-2 - Start completed.
2019-09-19 11:24:57.341 ERROR 13413 — [ Test worker] o.f.c.e.impl.db.CommonDbSchemaManager : Could not get property from table ACT_GE_PROPERTY

java.sql.SQLSyntaxErrorException: Table ‘cam6.ACT_GE_PROPERTY’ doesn’t exist
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) ~[mysql-connector-java-8.0.17.jar:8.0.17]
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) ~[mysql-connector-java-8.0.17.jar:8.0.17]
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-java-8.0.17.jar:8.0.17]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) ~[mysql-connector-java-8.0.17.jar:8.0.17]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeQuery(ClientPreparedStatement.java:1003) ~[mysql-connector-java-8.0.17.jar:8.0.17]
at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52) ~[HikariCP-3.3.1.jar:na]
at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java) ~[HikariCP-3.3.1.jar:na]
at org.flowable.common.engine.impl.db.AbstractSqlScriptBasedDbSchemaManager.getProperty(AbstractSqlScriptBasedDbSchemaManager.java:193) ~[flowable-engine-common-6.4.2.jar:6.4.2]
at org.flowable.common.engine.impl.db.ServiceSqlScriptBasedDbSchemaManager.getSchemaVersion(ServiceSqlScriptBasedDbSchemaManager.java:111) ~[flowable-engine-common-6.4.2.jar:6.4.2]
at org.flowable.common.engine.impl.db.ServiceSqlScriptBasedDbSchemaManager.schemaCreate(ServiceSqlScriptBasedDbSchemaManager.java:39) ~[flowable-engine-common-6.4.2.jar:6.4.2]
at org.flowable.engine.impl.db.ProcessDbSchemaManager.schemaCreate(ProcessDbSchemaManager.java:86) ~[flowable-engine-6.4.2.jar:6.4.2]
at org.flowable.engine.impl.cfg.multitenant.ExecuteSchemaOperationCommand.execute(ExecuteSchemaOperationCommand.java:51) ~[flowable-engine-6.4.2.jar:6.4.2]
at org.flowable.engine.impl.cfg.multitenant.ExecuteSchemaOperationCommand.execute(ExecuteSchemaOperationCommand.java:28) ~[flowable-engine-6.4.2.jar:6.4.2]
at org.flowable.engine.impl.interceptor.CommandInvoker$1.run(CommandInvoker.java:51) ~[flowable-engine-6.4.2.jar:6.4.2]
at org.flowable.engine.impl.interceptor.CommandInvoker.executeOperation(CommandInvoker.java:93) ~[flowable-engine-6.4.2.jar:6.4.2]
at org.flowable.engine.impl.interceptor.CommandInvoker.executeOperations(CommandInvoker.java:72) ~[flowable-engine-6.4.2.jar:6.4.2]
at org.flowable.engine.impl.interceptor.CommandInvoker.execute(CommandInvoker.java:56) ~[flowable-engine-6.4.2.jar:6.4.2]
at org.flowable.engine.impl.interceptor.BpmnOverrideContextInterceptor.execute(BpmnOverrideContextInterceptor.java:25) ~[flowable-engine-6.4.2.jar:6.4.2]
at org.flowable.common.engine.impl.interceptor.TransactionContextInterceptor.execute(TransactionContextInterceptor.java:53) ~[flowable-engine-common-6.4.2.jar:6.4.2]
at org.flowable.common.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:72) ~[flowable-engine-common-6.4.2.jar:6.4.2]
at org.flowable.common.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:30) ~[flowable-engine-common-6.4.2.jar:6.4.2]
at org.flowable.common.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:56) ~[flowable-engine-common-6.4.2.jar:6.4.2]
at org.flowable.engine.impl.cfg.multitenant.MultiSchemaMultiTenantProcessEngineConfiguration.createTenantSchema(MultiSchemaMultiTenantProcessEngineConfiguration.java:149) ~[flowable-engine-6.4.2.jar:6.4.2]
at org.flowable.engine.impl.cfg.multitenant.MultiSchemaMultiTenantProcessEngineConfiguration.buildProcessEngine(MultiSchemaMultiTenantProcessEngineConfiguration.java:134) ~[flowable-engine-6.4.2.jar:6.4.2]
at com.cam.multitendency.flowable.MultiTenantFlowableIml.setupProcessEngine(MultiTenantFlowableIml.kt:93) ~[main/:na]
at com.cam.multitendency.flowable.MultiTenantFlowableIml.(MultiTenantFlowableIml.kt:32) ~[main/:na]
at com.cam.multitenant.liquibase.MultiTenantLiquibaseImpl.getFlowableMultiTenant(MultiTenantLiquibaseImpl.kt:27) ~[main/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:622) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:456) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1321) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1160) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:277) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1251) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1171) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:593) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:90) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:374) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1411) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:592) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:845) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:877) ~[spring-context-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549) ~[spring-context-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:743) ~[spring-boot-2.1.7.RELEASE.jar:2.1.7.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:390) ~[spring-boot-2.1.7.RELEASE.jar:2.1.7.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:312) ~[spring-boot-2.1.7.RELEASE.jar:2.1.7.RELEASE]
at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:120) ~[spring-boot-test-2.1.7.RELEASE.jar:2.1.7.RELEASE]
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99) ~[spring-test-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:117) ~[spring-test-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:108) ~[spring-test-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:190) ~[spring-test-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:132) ~[spring-test-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:246) ~[spring-test-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:227) ~[spring-test-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289) ~[spring-test-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) ~[junit-4.12.jar:4.12]
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291) ~[spring-test-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:246) ~[spring-test-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97) ~[spring-test-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) ~[junit-4.12.jar:4.12]
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) ~[junit-4.12.jar:4.12]
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) ~[junit-4.12.jar:4.12]
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) ~[junit-4.12.jar:4.12]
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) ~[junit-4.12.jar:4.12]
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) ~[spring-test-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) ~[spring-test-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) ~[junit-4.12.jar:4.12]
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190) ~[spring-test-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:110) ~[na:na]
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58) ~[na:na]
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:38) ~[na:na]
at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:62) ~[na:na]
at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) ~[na:na]
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) ~[na:na]
at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) ~[na:na]
at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94) ~[na:na]
at com.sun.proxy.$Proxy2.processTestClass(Unknown Source) ~[na:na]
at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:118) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) ~[na:na]
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) ~[na:na]
at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182) ~[na:na]
at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164) ~[na:na]
at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:412) ~[na:na]
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) ~[na:na]
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56) ~[na:na]
at java.base/java.lang.Thread.run(Thread.java:834)

Hi @kcraghu

It looks you’re trying to create schema (cam6) which already exists and there is something wrong with tables in this schema.
Check your database or try to use
MultiSchemaMultiTenantProcessEngineConfiguration.DB_SCHEMA_UPDATE_DROP_CREATE
instead of MultiSchemaMultiTenantProcessEngineConfiguration.DB_SCHEMA_UPDATE_CREATE_DROP

1 Like

The problem is most likely because the returned DatabaseMetaData for MySQL returns all tables, not only the ones defined with the database property.

Have a look at the Configuration Properties for the MySQL jDBC driver. I think that if you set nullDatabaseMeansCurrent to true and also databaseTerm to SCHEMA. For your use case this could probable mean something like:

jdbc:mysql://127.0.0.1:3306/cam?useUnicode=true&characterEncoding=UTF-8&nullDatabaseMeansCurrent=true&databaseTerm=SCHEMA

This means that we we check whether a table exists without a schema parameters then the database (cam) would be treated as the schema that needs to be checked

2 Likes

One thing that I forgot to mention is that the databaseTerm property is available from version 8.0.17 of the MySQL jDBC Driver

2 Likes

Hi rgorzkowski,

Thank you for reply. It didn’t work after dropping and recreating the database. Also tried with MultiSchemaMultiTenantProcessEngineConfiguration.DB_SCHEMA_UPDATE_DROP_CREATE
but no help.

@filiphr

Thank you for the response. The Solution that you have provided is worked.

@filiphr
After adding the property the new table schema for fresh startup are created but it fails to restart with the existing database. Every time it tries to create the table for the schema. Here are the exception. Can you please advise on this.

2019-09-26 12:22:28.870 INFO 20802 — [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting…
2019-09-26 12:22:28.882 INFO 20802 — [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2019-09-26 12:22:28.946 INFO 20802 — [ main] o.f.e.impl.db.ProcessDbSchemaManager : performing create on history with resource org/flowable/db/create/flowable.mysql.create.history.sql
2019-09-26 12:22:28.946 INFO 20802 — [ main] o.f.e.impl.db.ProcessDbSchemaManager : Found MySQL: majorVersion=8 minorVersion=0
2019-09-26 12:22:28.961 ERROR 20802 — [ main] o.f.e.impl.db.ProcessDbSchemaManager : problem during schema create, statement create table ACT_HI_PROCINST (
ID_ varchar(64) not null,
REV_ integer default 1,
PROC_INST_ID_ varchar(64) not null,
BUSINESS_KEY_ varchar(255),
PROC_DEF_ID_ varchar(64) not null,
START_TIME_ datetime(3) not null,
END_TIME_ datetime(3),
DURATION_ bigint,
START_USER_ID_ varchar(255),
START_ACT_ID_ varchar(255),
END_ACT_ID_ varchar(255),
SUPER_PROCESS_INSTANCE_ID_ varchar(64),
DELETE_REASON_ varchar(4000),
TENANT_ID_ varchar(255) default ‘’,
NAME_ varchar(255),
CALLBACK_ID_ varchar(255),
CALLBACK_TYPE_ varchar(255),
primary key (ID_),
unique (PROC_INST_ID_)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin

java.sql.SQLSyntaxErrorException: Table ‘ACT_HI_PROCINST’ already exists
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) ~[mysql-connector-java-8.0.17.jar:8.0.17]
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) ~[mysql-connector-java-8.0.17.jar:8.0.17]
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-java-8.0.17.jar:8.0.17]
at com.mysql.cj.jdbc.StatementImpl.executeInternal(StatementImpl.java:764) ~[mysql-connector-java-8.0.17.jar:8.0.17]
at com.mysql.cj.jdbc.StatementImpl.execute(StatementImpl.java:648) ~[mysql-connector-java-8.0.17.jar:8.0.17]
at com.zaxxer.hikari.pool.ProxyStatement.execute(ProxyStatement.java:95) ~[HikariCP-3.3.1.jar:na]
at com.zaxxer.hikari.pool.HikariProxyStatement.execute(HikariProxyStatement.java) ~[HikariCP-3.3.1.jar:na]
at org.flowable.common.engine.impl.db.AbstractSqlScriptBasedDbSchemaManager.executeSchemaResource(AbstractSqlScriptBasedDbSchemaManager.java:323) ~[flowable-engine-common-6.4.2.jar:6.4.2]
at org.flowable.common.engine.impl.db.AbstractSqlScriptBasedDbSchemaManager.executeSchemaResource(AbstractSqlScriptBasedDbSchemaManager.java:236) ~[flowable-engine-common-6.4.2.jar:6.4.2]
at org.flowable.common.engine.impl.db.AbstractSqlScriptBasedDbSchemaManager.executeMandatorySchemaResource(AbstractSqlScriptBasedDbSchemaManager.java:224) ~[flowable-engine-common-6.4.2.jar:6.4.2]
at org.flowable.engine.impl.db.ProcessDbSchemaManager.dbSchemaCreateHistory(ProcessDbSchemaManager.java:109) ~[flowable-engine-6.4.2.jar:6.4.2]
at org.flowable.engine.impl.db.ProcessDbSchemaManager.schemaCreate(ProcessDbSchemaManager.java:104) ~[flowable-engine-6.4.2.jar:6.4.2]
at org.flowable.engine.impl.cfg.multitenant.ExecuteSchemaOperationCommand.execute(ExecuteSchemaOperationCommand.java:51) ~[flowable-engine-6.4.2.jar:6.4.2]
at org.flowable.engine.impl.cfg.multitenant.ExecuteSchemaOperationCommand.execute(ExecuteSchemaOperationCommand.java:28) ~[flowable-engine-6.4.2.jar:6.4.2]
at org.flowable.engine.impl.interceptor.CommandInvoker$1.run(CommandInvoker.java:51) ~[flowable-engine-6.4.2.jar:6.4.2]
at org.flowable.engine.impl.interceptor.CommandInvoker.executeOperation(CommandInvoker.java:93) ~[flowable-engine-6.4.2.jar:6.4.2]
at org.flowable.engine.impl.interceptor.CommandInvoker.executeOperations(CommandInvoker.java:72) ~[flowable-engine-6.4.2.jar:6.4.2]
at org.flowable.engine.impl.interceptor.CommandInvoker.execute(CommandInvoker.java:56) ~[flowable-engine-6.4.2.jar:6.4.2]
at org.flowable.engine.impl.interceptor.BpmnOverrideContextInterceptor.execute(BpmnOverrideContextInterceptor.java:25) ~[flowable-engine-6.4.2.jar:6.4.2]
at org.flowable.common.engine.impl.interceptor.TransactionContextInterceptor.execute(TransactionContextInterceptor.java:53) ~[flowable-engine-common-6.4.2.jar:6.4.2]
at org.flowable.common.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:72) ~[flowable-engine-common-6.4.2.jar:6.4.2]
at org.flowable.common.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:30) ~[flowable-engine-common-6.4.2.jar:6.4.2]
at org.flowable.common.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:56) ~[flowable-engine-common-6.4.2.jar:6.4.2]
at org.flowable.engine.impl.cfg.multitenant.MultiSchemaMultiTenantProcessEngineConfiguration.createTenantSchema(MultiSchemaMultiTenantProcessEngineConfiguration.java:149) ~[flowable-engine-6.4.2.jar:6.4.2]
at org.flowable.engine.impl.cfg.multitenant.MultiSchemaMultiTenantProcessEngineConfiguration.buildProcessEngine(MultiSchemaMultiTenantProcessEngineConfiguration.java:134) ~[flowable-engine-6.4.2.jar:6.4.2]
at com.cam.multitendency.flowable.MultiTenantFlowableIml.setupProcessEngine(MultiTenantFlowableIml.kt:105) ~[main/:na]
at com.cam.multitendency.flowable.MultiTenantFlowableIml.(MultiTenantFlowableIml.kt:37) ~[main/:na]
at com.cam.multitenant.liquibase.MultiTenantLiquibaseImpl.getFlowableMultiTenant(MultiTenantLiquibaseImpl.kt:28) ~[main/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:622) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:456) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1321) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1160) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:277) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1251) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1171) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:593) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:90) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:374) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1411) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:592) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:845) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:877) ~[spring-context-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549) ~[spring-context-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) ~[spring-boot-2.1.7.RELEASE.jar:2.1.7.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:743) ~[spring-boot-2.1.7.RELEASE.jar:2.1.7.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:390) ~[spring-boot-2.1.7.RELEASE.jar:2.1.7.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:312) ~[spring-boot-2.1.7.RELEASE.jar:2.1.7.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1214) ~[spring-boot-2.1.7.RELEASE.jar:2.1.7.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1203) ~[spring-boot-2.1.7.RELEASE.jar:2.1.7.RELEASE]
at com.cam.CamApplicationKt.main(CamApplication.kt:75) ~[main/:na]

@kcraghu I see that your databaseSchemaUpdate is set to DB_SCHEMA_UPDATE_CREATE_DROP which means that it would create the schema every time.

I would suggest that you use DB_SCHEMA_UPDATE_TRUE instead. That would perform a proper update

1 Like

Thank you for the update. It works fine with above mentioned property.

@filiphr I am getting the same exception when using postgresql driver. Is there any workaround for this?it would be great if you can reply asap.Waiting for the reply

06:36:22.004 [restartedMain] INFO o.f.e.i.c.m.MultiSchemaMultiTenantProcessEngineConfiguration - creating/validating database schema for tenant internal
06:36:24.576 [restartedMain] INFO o.f.e.i.c.m.MultiSchemaMultiTenantProcessEngineConfiguration - creating/validating database schema for tenant internal_development
06:36:25.283 [restartedMain] ERROR o.f.c.e.i.interceptor.CommandContext - Error while closing command context
org.apache.ibatis.exceptions.PersistenceException:

Error querying database. Cause: org.postgresql.util.PSQLException: ERROR: relation “act_ge_property” does not exist

Position: 15

The error may exist in org/flowable/db/mapping/entity/Property.xml

The error may involve org.flowable.engine.impl.persistence.entity.PropertyEntityImpl.selectProperty-Inline

The error occurred while setting parameters

SQL: select * from ACT_GE_PROPERTY where NAME_ = ?

Cause: org.postgresql.util.PSQLException: ERROR: relation “act_ge_property” does not exist

Can you share your configuration? Are you trying to do the same as written in this (quite old thread)?

We would need some more info on what you’re doing. E.g. are you setting the tenants properly in the TenantProvider? Is the exception happening on bootup or somewhere else? Etc.

it would be great if you can reply asap.

Note that this is a community forum for Flowable, all replies here on a voluntary basis.

@joram

Thank you for the response.

The exception is happening on boot up.

We have a spring boot auto configured(via spring boot flowable starters) flowable app. We are trying to run it multi tenant using MultiSchemaMultiTenantProcessEngineConfiguration. So we have removed all flowable starters and injected the beans that are required by our app manually.

Below is our spring boot application

@EnableConfigurationProperties({FlowableTaskAppProperties.class})
@Import({
MultiTenancySqlConfiguration.class,
MultiTenancyProperties.class,
TenantIdService.class,
AsyncConfiguration.class,
Bootstrapper.class,
//    FlowableDebuggerConfiguration.class,
FlowableDebuggerProperties.class,
FlowableEngineConfiguration.class,
JacksonConfiguration.class,
SchedulingConfiguration.class,
AppDispatcherServletConfiguration.class,
io.juakali.service.identity.filter.AuthorizationFilter.class,
io.juakali.service.identity.idm.JuakaliIdmService.class,
})
@ComponentScan(
basePackages = {
    "org.flowable.ui.task.service",
    "org.flowable.ui.task.security",
    "org.flowable.ui.common.service",
    "org.flowable.ui.common.filter",
    "org.flowable.ui.common.security",
    "org.flowable.ui.task.model.component",
    "org.flowable.ui.common.conf",
    "org.flowable.ui.common.repository",
    "io.juakali.los.data",
    "io.juakali.los.common",
    "io.juakali.los.task",
    "io.juakali.service.identity",
    "io.juakali.service.integration"}
)

@EnableJpaRepositories(
basePackages = {"io.juakali.los.data", "io.juakali.los.common", "io.juakali.los.task"})
@EntityScan({"io.juakali.los.data", "io.juakali.los.common", "io.juakali.los.task"})
@SpringBootApplication
public class LosTaskApplication {


  public static void main(String[] args) {
SpringApplication.run(LosTaskApplication.class, args);
LOGGER.warn("(Re)Starting Task Service");
  }

  private static final Logger LOGGER = LoggerFactory.getLogger(LosTaskApplication.class);


  // TODO move to non-deprecated version
  @Bean
  public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
  @Override
  public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/**").allowedOrigins("*");
  }
};
  }

  @Bean
  public WebMvcConfigurer workflow() {
return new WebMvcConfigurer() {

  @Override
  public void addViewControllers(@NonNull ViewControllerRegistry registry) {
    registry.addViewController("/workflow").setViewName("redirect:/workflow/");
    registry.addViewController("/workflow/").setViewName("forward:/workflow/index.html");
  }
};
  }

  @Bean
  public AppDefinitionTypeService appDefinitionTypeService() {
return new SimpleAppDefinitionTypeService();
  }


  @Bean
  public JuakaliAppDefinitionService appDefinitionService() {
return new JuakaliAppDefinitionService();
  }


  @Bean
  public TaskFormService taskFormService() {
return new TaskFormService();
  }

  @Bean
  public ProcessEngineConfiguration processEngineConfiguration(DataSourceService dataSourceService,
  TenantInfoHolder tenantInfoHolder, FlowableTenantProperties flowableTenantProperties){
var processEngineConfiguration = new MultiSchemaMultiTenantProcessEngineConfiguration(
    tenantInfoHolder);
processEngineConfiguration
    .setDatabaseType(MultiSchemaMultiTenantProcessEngineConfiguration.DATABASE_TYPE_POSTGRES);
processEngineConfiguration.setDatabaseSchemaUpdate(
    MultiSchemaMultiTenantProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
processEngineConfiguration.setAsyncExecutorActivate(true);
processEngineConfiguration.setDisableIdmEngine(true);
processEngineConfiguration
    .setAsyncExecutor(new SharedExecutorServiceAsyncExecutor(tenantInfoHolder));
processEngineConfiguration.setDisableIdmEngine(true);
for (String tenant : flowableTenantProperties.getTenants()
) {
  processEngineConfiguration.registerTenant(tenant, dataSourceService.createDataSource(tenant));
}
processEngineConfiguration.registerTenant(null,dataSourceService.createDataSource(null));
//    processEngineConfiguration
//        .setAsyncExecutor(new SharedExecutorServiceAsyncExecutor(tenantInfoHolder));
return processEngineConfiguration;
  }
  @Bean
  ProcessEngine processEngine(ProcessEngineConfiguration processEngineConfiguration, MultiTenantSpringLiquibase liquibaseMt) {

var processEngine = processEngineConfiguration.buildProcessEngine();
return processEngine;
  }

  @Bean
  public IdmEngine idmEngine(IdmEngineConfiguration idmEngineConfiguration) {
return idmEngineConfiguration.buildIdmEngine();
  }

  @Bean
  public ThreadLocal threadLocalService(){
return new ThreadLocal();
  }
  @Bean
  public CmmnEngine cmmnEngine(DataSourceService dataSourceService) {
var cmmnEngineConfiguration = CmmnEngineConfiguration.createStandaloneCmmnEngineConfiguration();
cmmnEngineConfiguration.setDisableIdmEngine(true);
cmmnEngineConfiguration.setDataSource(dataSourceService.createDataSource(null));
cmmnEngineConfiguration
    .setDatabaseSchemaUpdate("none");
return cmmnEngineConfiguration.buildCmmnEngine();
  }

  @Bean
  public CmmnRepositoryService cmmnRepositoryService(CmmnEngine cmmnEngine) {
return cmmnEngine.getCmmnRepositoryService();
  }

  @Bean
  public AppEngine appEngine(DataSourceService dataSourceService) {
var appEngineCOnfiguration = AppEngineConfiguration.createStandaloneAppEngineConfiguration();
appEngineCOnfiguration.setDisableIdmEngine(true);
appEngineCOnfiguration.setDataSource(dataSourceService.createDataSource(null));
appEngineCOnfiguration
    .setDatabaseSchemaUpdate("none");
return appEngineCOnfiguration.buildAppEngine();
  }


  @Bean
  public AppRepositoryService appRepositoryService(AppEngine appEngine) {
return appEngine.getAppRepositoryService();
  }

  @Bean
  public CmmnHistoryService cmmnHistoryService(CmmnEngine cmmnEngine) {
return cmmnEngine.getCmmnHistoryService();
  }

  @Bean
  public CmmnRuntimeService cmmnRuntimeService(CmmnEngine cmmnEngine) {
return cmmnEngine.getCmmnRuntimeService();
  }
  @Bean
  public CmmnTaskService cmmnTaskService(CmmnEngine cmmnEngine) {
return cmmnEngine.getCmmnTaskService();
  }
  @Bean
  public RepositoryService repositoryService(ProcessEngine processEngine) {
return processEngine.getRepositoryService();
  }

  @Bean
  public HistoryService historyService(ProcessEngine processEngine) {
return processEngine.getHistoryService();
  }
  @Bean
  public FormService formService(ProcessEngine processEngine) {
return processEngine.getFormService();
  }

  @Bean
  public TaskService taskService(ProcessEngine processEngine) {
return processEngine.getTaskService();
  }

  @Bean
  public RuntimeService runtimeService(ProcessEngine processEngine) {
return processEngine.getRuntimeService();
  }

  @Bean
  public FormEngineConfiguration formEngineConfiguration(DataSource dataSource){
var formEngineConfiguration= FormEngineConfiguration.createStandaloneFormEngineConfiguration();
formEngineConfiguration.setDataSource(dataSource);
formEngineConfiguration
    .setDatabaseSchemaUpdate("none");
return formEngineConfiguration;
  }

  @Bean
  public FormEngine formEngine(FormEngineConfiguration  formEngineConfiguration){

return formEngineConfiguration.buildFormEngine();
  }

  @Bean
  public  org.flowable.form.api.FormService formServiceApi(FormEngine  formEngine){
return formEngine.getFormService();
  }

  @Bean
  public FormRepositoryService formRepositoryService(FormEngine formEngine){
return formEngine.getFormRepositoryService();
  }


  @Bean
  public ContentEngine contentEngine(DataSource dataSource){
var contentEngineConfiguration = ContentEngineConfiguration.createStandaloneContentEngineConfiguration();
contentEngineConfiguration.setDataSource(dataSource);
contentEngineConfiguration
    .setDatabaseSchemaUpdate("none");
return contentEngineConfiguration.buildContentEngine();
  }

  @Bean
  AppRestResponseFactory appRestResponseFactory(){
return new AppRestResponseFactory();
  }
  @Bean
  public ContentService contentService(ContentEngine contentEngine){
return contentEngine.getContentService();
  }

  @Bean
  public DmnEngine dmnEngine(DataSource dataSource){
var dmnEngineConfiguration = DmnEngineConfiguration.createStandaloneInMemDmnEngineConfiguration();
dmnEngineConfiguration.setDataSource(dataSource);
dmnEngineConfiguration
    .setDatabaseSchemaUpdate("none");
return dmnEngineConfiguration.buildDmnEngine();
  }

  @Bean
  public DmnRepositoryService dmnRepositoryService(DmnEngine dmnEngine){
return dmnEngine.getDmnRepositoryService();
  }

  @Bean
  public ManagementService managementService(ProcessEngine processEngine){
return processEngine.getManagementService();
  }

  @Bean
  public IdmEngineConfiguration idmEngineConfiguration(DataSource dataSource){
var idmEngineConfiguration= IdmEngineConfiguration.createStandaloneIdmEngineConfiguration();
idmEngineConfiguration.setDataSource(dataSource);
idmEngineConfiguration
    .setDatabaseSchemaUpdate("none");
return idmEngineConfiguration;
  }

  @Bean
  public IdmIdentityService idmIdentityService(IdmEngine idmEngine){
return idmEngine.getIdmIdentityService();
  }
}

Below is the tenant info holder

public class TenantInfoHolderImpl implements TenantInfoHolder {

  private final FlowableTenantProperties flowableTenantProperties;
  private final TenantIdService tenantIdService;
  private final ThreadLocal threadLocalService;

  @Override
  public Collection<String> getAllTenants() {
    return flowableTenantProperties.getTenants();
  }

  @Override
  public void setCurrentTenantId(String s) {
    threadLocalService.set(s);
  }

  @Override
  public String getCurrentTenantId() {
    var  tenantIdValue=(String)threadLocalService.get();
    if(tenantIdValue!=null)
    {
      log.info("Returned from thread service" + tenantIdValue.toString());
      return tenantIdValue;
    }
    else {
      tenantIdValue = tenantIdService.getTenantSchemaFromContext();
      log.info("Returned from security service" + tenantIdValue.toString());
      return tenantIdValue;
    }
  }

  @Override
  public void clearCurrentTenantId() {
    log.info("Clearing Tenant Id");
    threadLocalService.set(null);
  }
}

Below is the datasource creator for each tenant

public class DataSourceService {

  private final SpringDataSourceProperties springDataSourceProperties;

  public DataSource createDataSource(String tenantName) {
    PGSimpleDataSource dataSource = new PGSimpleDataSource();
    dataSource.setURL(springDataSourceProperties.getUrl());
    dataSource.setCurrentSchema(tenantName);
    dataSource.setUser(springDataSourceProperties.getUsername());
    dataSource.setPassword(springDataSourceProperties.getPassword());
    if(tenantName!=null) {
      try {
        dataSource.getConnection().createStatement().executeUpdate("CREATE SCHEMA IF NOT EXISTS " + tenantName);
        dataSource.setURL(springDataSourceProperties.getUrl()+"?currentSchema="+tenantName);
      } catch (SQLException e) {
        log.error("Problem creating Tenant Schemas, abort", e);
        throw new RuntimeException("Error while creating a schema");
      }
    }
    return dataSource;
  }

}

And to add to that, we have our own tables, which we are trying to run in multi tenancy mode via hibernate and liquibase.
This is our tenant connection provider.

public class TenantConnectionProvider implements MultiTenantConnectionProvider {

private String DEFAULT_TENANT = TenantSchemaResolver.DEFAULT_SCHEMA;
private DataSource datasource;

public TenantConnectionProvider(DataSource dataSource) {
    this.datasource = dataSource;
}

@Override
public Connection getAnyConnection() throws SQLException {
    return datasource.getConnection();
}

@Override
public void releaseAnyConnection(Connection connection) throws SQLException {
    connection.close();
}

@Override
public Connection getConnection(String tenantIdentifier) throws SQLException {
    log.debug("Get connection for tenant {}", tenantIdentifier);
    final Connection connection = getAnyConnection();
    connection.setSchema(tenantIdentifier);
    return connection;
}

@Override
public void releaseConnection(String tenantIdentifier, Connection connection) throws SQLException {
    log.debug("Release connection for tenant {}", tenantIdentifier);
    connection.setSchema(DEFAULT_TENANT);
    releaseAnyConnection(connection);
}

@Override
public boolean supportsAggressiveRelease() {
    return false;
}

@Override
public boolean isUnwrappableAs(Class unwrapType) {
    return false;
}

@Override
public <T> T unwrap(Class<T> unwrapType) {
    return null;
}

}
Our LiquibaseConfiguration
public MultiTenantSpringLiquibase liquibaseMt(DataSource dataSource) throws SQLException {

MultiTenantSpringLiquibase liquibase = new MultiTenantSpringLiquibase();
var contexts = liquibase.getContexts();
liquibase.setContexts(contexts == null || contexts.isBlank() ? "none" : contexts);
liquibase.setDataSource(dataSource);
liquibase.setChangeLog("classpath:db/changelog/db.changelog-master.xml");
liquibase.setDefaultSchema(TenantSchemaResolver.DEFAULT_SCHEMA);

try {
  for (var schemaName : tenantProperties.getTenants()) {
    log.info(schemaName);
    dataSource.getConnection().createStatement().executeUpdate("CREATE SCHEMA IF NOT EXISTS " + schemaName);
  }
} catch (SQLException e) {
  log.error("Problem creating Tenant Schemas, abort", e);
  throw e;
}

liquibase.setSchemas(tenantProperties.getTenants());
return liquibase;

}

Our Hibernate Configuration

@Component
public class HibernateConfig {
//
@Autowired
private JpaProperties jpaProperties;

@Autowired
private MultiTenancyProperties tenantProperties;

@Bean
JpaVendorAdapter jpaVendorAdapter() {
    return new HibernateJpaVendorAdapter();
}

@Bean
LocalContainerEntityManagerFactoryBean entityManagerFactory(
        DataSource dataSource,
        MultiTenantConnectionProvider multiTenantConnectionProvider,
        CurrentTenantIdentifierResolver tenantIdentifierResolver,
        JpaVendorAdapter jpaVendorAdapter) {

    var em = new LocalContainerEntityManagerFactoryBean();
    em.setDataSource(dataSource);
    if (tenantProperties.getJpaPackagesToScan() != null) {
        em.setPackagesToScan(tenantProperties.getJpaPackagesToScan());
    } else {
        em.setPackagesToScan("io.xxx");
    }

    em.setJpaVendorAdapter(jpaVendorAdapter);

    var jpaPropertiesMap = new HashMap<String, Object>();
    jpaPropertiesMap.put("spring.liquibase.contexts", "schema");
    jpaPropertiesMap.put(Environment.MULTI_TENANT, MultiTenancyStrategy.SCHEMA);
    jpaPropertiesMap.put(Environment.MULTI_TENANT_CONNECTION_PROVIDER, multiTenantConnectionProvider);
    jpaPropertiesMap.put(Environment.MULTI_TENANT_IDENTIFIER_RESOLVER, tenantIdentifierResolver);
    jpaPropertiesMap.put(Environment.NON_CONTEXTUAL_LOB_CREATION, true);
    jpaPropertiesMap.put(Environment.DIALECT, "org.hibernate.dialect.PostgreSQL95Dialect");
    jpaPropertiesMap.put(Environment.IMPLICIT_NAMING_STRATEGY, "org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy");
    jpaPropertiesMap.put(Environment.PHYSICAL_NAMING_STRATEGY, "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy");

    em.setJpaPropertyMap(jpaPropertiesMap);
    em.afterPropertiesSet();

    return em;
}

}

Could you tell if I am going in the right direction. I removed all flowable starters as I couldnt find a way to override/replace SpringProcessEngineConfiguration. And does MultiTenantMultiSchemaProcessEngineConfiguration take care of the entire multi tenancy . Is there a way to configure CMMNEngine, DMN engine etc to run in multi tenancy mode.

Could you point me in the right direction. We are thinking of an alternative by which we create all flowable tables using our liquibase.(flowable.postgres.create.sql)

Sorry for expecting a earlier reply, I was bit in need of some help. I value your time and contribution. Thanks