<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ## 線程環境自定義租戶ID 1. 常規場景下,多租戶的ID是從token獲取的,而token通過request請求的header傳遞至后端解析。 2. 租戶插件底層從request獲取到tenantId進行隔離。 3. 但是如果遇到多線程、定時任務、RPC遠程調用等場景是獲取不到request的,原本的多租戶插件也就失效了。 4. 針對這種情況我們提供了TenantUtil,可以在不同的場景自定義租戶ID,包括租戶的數據查詢以及數據提交。 ## 操作說明 1. 兩種寫法的對比如下,通過TenantUtil可以自定義當前線程的租戶ID ~~~ // 常規寫法 Notice detail = noticeService.getOne(Condition.getQueryWrapper(notice)); // 常規寫法 Boolean temp = noticeService.save(notice); ? // 線程自定義寫法 Notice detail = TenantUtil.use("自定義租戶ID", () -> ?noticeService.getOne(Condition.getQueryWrapper(notice)) ); // 線程自定義寫法 Boolean temp = TenantUtil.use("自定義租戶ID", () -> ?noticeService.save(notice) ); ~~~ 2. 若某些場景需要忽略租戶id,可以看到所有或者另外自定義,可以采用如下方式定義 ~~~ // 常規寫法 Notice detail = noticeService.list(Condition.getQueryWrapper(notice)); ? // 線程自定義寫法 Notice detail = TenantUtil.ignore(() -> ?noticeService.list(Condition.getQueryWrapper(notice)) ); ~~~ 3. 實現原理如下,通過本地線程設置租戶id,接著在租戶插件優先獲取本地線程的值,若沒有才從request獲取租戶的值。 ~~~ private static final ThreadLocal<String> tl = new ThreadLocal<>(); ? /** * 獲取租戶id * * @return 租戶id */ public static String getTenantId() { String tenantId = tl.get(); if (tenantId != null) { return tenantId; } return AuthUtil.getTenantId(); } ? /** * 使用租戶 id 執行函數 * * @param tenantId tenantId * @param runnable Runnable */ public static void use(String tenantId, Runnable runnable) { Assert.hasText(tenantId, "參數 tenantId 為空"); tl.set(tenantId); try { runnable.run(); } finally { tl.remove(); } } ~~~ ~~~ @Slf4j @RequiredArgsConstructor public class BladeTenantHandler implements TenantLineHandler, SmartInitializingSingleton { ? /** * 獲取租戶ID * * @return 租戶ID */ @Override public Expression getTenantId() { return new StringValue(Func.toStr(TenantUtil.getTenantId(), BladeConstant.ADMIN_TENANT_ID)); } ? } ~~~ ## 說明 1. 通過TenantUtil可以自定義線程的租戶ID。 2. 針對特殊應用場景不受request環境的影響,也可以實現跨租戶查詢的功能。 3. 注意??:通過此工具可以操作訪問任何租戶的數據,**編碼必須做好風險管理,否則會因為設計不當導致數據錯亂等嚴重問題。**
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看