0

Как вы можете понять по названию моей ситуация:Grails 1.3.7 - мульти жилец плагин и мульти операция нарезания резьбы - поток не может получить доступ к арендатору

  • Я использую очень старую версию Grails (I не может изменить его в данный момент)
  • в этом проекте я использую плагин Многоквартирный, подробно я установил
    • Многоквартирный-жильный: 1.0.3
    • -EHCache Многоквартирный: 1.0.1
  • Я хочу разделить метод (требуется 2-3 минуты для его выполнения) и распараллелить операции.

Вот мой код:

def threadPoolSize = 10 
def threadPool = Executors.newFixedThreadPool(threadPoolSize) 

def threadClosure = { myWork -> 
    def partialQuantity = 0 
    myWork.each { currDetail -> 
     MyTableDomainClass.findByCode(currDetail.myTableCode) 
     // Do some stuff 
    } 
    return partialQuantity 
} 

try{ 
    def worksForThreads = new ArrayList<org.codehaus.groovy.grails.web.json.JSONArray>(10) 

    // Prepare works for thread 
    Integer x = 0 
    allWorks.each{ singleOrder -> 
     if(worksForThreads[x] == null) 
      worksForThreads[x] = new org.codehaus.groovy.grails.web.json.JSONArray() 
     worksForThreads[x].add(singleOrder) 
     x = (x+1) % threadPoolSize 
    } 

    List<Future> futures = worksForThreads.collect({ myWork -> 
     println "\t\tPrepare thread with ${myWork.size()} tasks" 
     threadPool.submit({ -> 
      threadClosure myWork 
     } as Callable) 
    }) 

    //Start thread and collect result 
    futures.each{ 
     def threadResult = it.get() 
     println "\t\tThread result ${threadResult}" 
     totQuantity = totQuantity+threadResult 
    } 
}catch(Exception e){ 
    println "Error during thread works ${e}"      
}finally{ 
    threadPool.shutdown() 
} 

Таким образом, код должен быть хорошо, но во время выполнения потока я получаю эти ошибки:

[pool-9-thread-2] [tenant 0] ERROR util.JDBCExceptionReporter - Table 'MySchema.MyTable' doesn't exist 

и

Error during thread works java.util.concurrent.ExecutionException: org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute query; 
SQL [select this_.id as id24_0_, this_.code as code24_0_, this_.description as descript3_24_0_, this_.incr as incr24_0_, this_.is_default as is5_24_0_, this_.lang as lang24_0_, this_.last_updated as last7_24_0_, this_.min as min24_0_, this_.name as name24_0_, this_.ordasc as ordasc24_0_, this_.parent_id as parent11_24_0_, this_.parent_mult as parent12_24_0_, this_.prod_code as prod13_24_0_, this_.status as status24_0_, this_.unit_name as unit15_24_0_ 
from MyTable this_ where this_.code=?]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute query 

Я думаю, что проблема связана с областью арендатора. Я думал использовать службу для получения всех данных из БД, но я хочу знать, есть ли способ получить правильную область арендатора в потоке или передать ее.

Спасибо всем!

ответ

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 

Я надеюсь, что это может быть полезным для кого-то других! Пока!