Поддержка нескольких арендаторов при использовании Apache Camel и Hibernate (в приложении Spring) - PullRequest
0 голосов
/ 02 марта 2020

У меня есть приложение Spring, которое использует стратегию схемы Hibernate и класс TenantContext для хранения идентификатора клиента (такой же дизайн показан здесь: https://vladmihalcea.com/hibernate-database-schema-multitenancy/).

Все работает хорошо при работе с синхронными HTTP-запросами, обрабатываемыми Spring.

Кроме того, у меня есть несколько маршрутов Camel, которые запускаются заданиями chron. Они используют компонент JPA для чтения или записи в источник данных. Объект Exchange знает идентификатор арендатора. Как перенести эту информацию в Hibernate?

Я думал об использовании прослушивателя или перехватчика для получения идентификатора арендатора из Exchange и установки объекта TenantContext на каждом шаге маршрута. Затем TenantContext будет использоваться классом Hibernate CurrentTenantIdentifierResolver для разрешения клиента.

Как должен выглядеть TenantContext? Это ThreadLocal жизнеспособный вариант? А как насчет потоков asyn c?

В целом, есть ли у вас какое-либо хорошее решение для поддержки многопользовательского режима Hibernate при использовании Camel?

1 Ответ

0 голосов
/ 04 марта 2020

В общем, это зависит от вашего варианта использования;)

Но мы сделали нечто подобное, , используя ThreadLocal в CurrentTenantIdentifierResolver .

Затем в местах где нам нужно установить владельца (например, в начале работы, выполняемой cronjob, в вашем случае), у нас есть экземпляр tenantIdentifierResolver, используемый следующим образом:

        tenantIdentifierResolver.withTenantId(tenant, () -> {
            try {
                doWhatever(param1, param2, etc);
            } catch (WhateverException we) {
                throw new MyBusinessException(we);
            }
        });
...