Grails 1.3.7 - 多租户插件和多线程操作 - 线程无法访问租户

时间:2016-09-02 09:15:22

标签: multithreading grails grails-plugin multi-tenant grails-domain-class

正如你可以通过标题理解我的情况是:

  • 我正在使用Grails的旧版本(目前无法更改)
  • 在这个项目中,我正在使用多租户插件,我已经安装了详细信息
    • 多租户芯:1.0.3
    • 多租户-ehcache的:1.0.1
  • 我想拆分一个方法(执行它需要2-3分钟)并并行操作。

这是我的代码:

deck2

所以,代码应该没问题,但是在线程执行期间我得到了这些错误:

mongoose.plugin(testPlugin)

var value = document.getElementById("theInput").innerHTML;
console.log(value);

我认为问题在于租户范围。我想使用一个服务从DB获取所有数据,但我想知道是否有办法在一个线程中获得正确的租户范围或传递它。

感谢所有人!

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。基本上,多租户插件通过数据库表获取租户:

所以在Config.groovy中我有

tenant {
  mode = "singleTenant"
  datasourceResolver.type = "db"
}

DataSource.groovy为每个环境提供了找出租户的正确表格:

CREATE TABLE `data_source_tenant_map` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `version` bigint(20) NOT NULL,
  `data_source` varchar(255) NOT NULL COMMENT 'JNDI',
  `mapped_tenant_id` int(11) NOT NULL,
  `file_source` varchar(255) NOT NULL,
  `data_source_secondary` varchar(255) DEFAULT NULL,
  `db_url` varchar(1000) DEFAULT NULL COMMENT 'Url db multitenant',
  `db_username` varchar(100) DEFAULT NULL COMMENT 'Username db multitenant',
  `db_password` varchar(100) DEFAULT NULL COMMENT 'Password db multitenant',
  `base_path` varchar(255) DEFAULT NULL COMMENT 'Root of path on fs',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=280 DEFAULT CHARSET=utf8;

使用此插件,未与主线程连接的每个线程都会丢失Hibernate会话,因此租户引用。为了获得合适的租户,我使用了这些方法:

def myTenantKey = my_mapped_tenant_id
TenantUtils.doWithTenant(myTenantKey ) {
    // Do something as usual
}

您必须导入TenantUtils类

import grails.plugin.multitenant.core.util.TenantUtils

我希望它对其他人有用! 再见!