<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      keycloak~EventListenerProvider初始化kafka引出的類加載問題

      EventListenerProvider初始

      keycloak提供的事件處理機制,可以通過實現EventListenerProvider接口來實現自定義的事件處理邏輯。在keycloak啟動時,會通過ServiceLoader機制加載所有的EventListenerProvider實現類,并將其注冊到keycloak的事件處理機制中。

      • 構造方法,在每個keycloak后臺操作時,它都會重新構建實例
      • OnEvent方法,在事件發生時執行,不會出現類加載問題,因為這樣類已經被加載了

      EventListenerProviderFactory

      EventListenerProviderFactory是進行事件處理器的生產工廠,用于創建EventListenerProvider實例。在keycloak啟動時,會通過ServiceLoader機制加載所有的EventListenerProviderFactory實現類,并將其注冊到keycloak的事件處理機制中。

      • init方法:keycloak啟動時會執行,用于初始化EventListenerProviderFactory實例,可以在此方法中進行一些初始化操作。
      • postInit方法:keycloak啟動時會執行,在init方法之后,會執行這個方法
      • create方法:在kc后臺開啟這個EventListenerProviderFactory之后,每次請求都會執行這個create方法,對于它生產的provider對象,可能考慮使用單例的方式, 避免每次請求都創建一個新的對象
      • close方法:在keycloak程序關閉后或者當前事件被注冊時,這個方法才會執行

      問題

      • 問題描述:在EventListenerProviderFactory的init方法中,通過kafka發送消息,會出現類加載問題,因為在keycloak啟動時,kafka的類的加載器還沒有被加載,所以會出現類加載問題。
      • 解決:需要將類加載器這塊,修改成當前類加載器去加載對應的文件,如下代碼解決了類無法加載的問題
        @Override
        public void postInit(KeycloakSessionFactory keycloakSessionFactory) {
          try {
            this.executorService = Executors.newFixedThreadPool(2);
            Properties kafkaProperties = new Properties();
            kafkaProperties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,
                ConfigFactory.getInstance().getStrPropertyValue("kafka.host"));
            kafkaProperties.put(ConsumerConfig.GROUP_ID_CONFIG, "kc-ListenerProviderFactory");
            kafkaProperties.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, "true");
            kafkaProperties.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "latest");
            kafkaProperties.put(ConsumerConfig.HEARTBEAT_INTERVAL_MS_CONFIG, 1000);
            kafkaProperties.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, 10 * 1000);
            kafkaProperties.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, 10);
            kafkaProperties.put(ConsumerConfig.MAX_POLL_INTERVAL_MS_CONFIG, 30 * 1000);
            // 需要使用當前類加載器,否則會出現無法加載StringDeserializer的情況
            Class<?> stringDeserializerClass =
                getClass().getClassLoader().loadClass("org.apache.kafka.common.serialization.StringDeserializer");
            kafkaProperties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, stringDeserializerClass);
            kafkaProperties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, stringDeserializerClass);
            this.kafkaConsumerAdd = new KcKafkaConsumer(keycloakSessionFactory,kafkaProperties, "black_list_add");
            executorService.submit(kafkaConsumerAdd);
            this.kafkaConsumerRemove=new KcKafkaConsumer(keycloakSessionFactory,kafkaProperties, "black_list_remove");
            executorService.submit(kafkaConsumerRemove);
          } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
          }
        }
      
      • 對于kafka-clients實現消費者的話,代碼還是比較簡單的
      public class KcKafkaConsumer implements Runnable {
        private static final Logger logger = Logger.getLogger(ConfigFactory.class);
        private final AtomicBoolean closed = new AtomicBoolean(false);
        private final KeycloakSessionFactory keycloakSessionFactory;
        private KafkaConsumer<String, String> kafkaConsumer;
      
        public KcKafkaConsumer(KeycloakSessionFactory keycloakSessionFactory, Properties properties, String topic)
            throws ClassNotFoundException {
          this.keycloakSessionFactory = keycloakSessionFactory;
          this.kafkaConsumer = new KafkaConsumer<>(properties);
          this.kafkaConsumer.subscribe(Collections.singleton(topic));
        }
      
      @Override
        public void run() {
          try {
      
            while (!closed.get()) {
              ConsumerRecords<String, String> records = kafkaConsumer.poll(Duration.ofMillis(100));
              // 處理Kafka消息
              for (ConsumerRecord<String, String> record : records) {
                System.out.println("Topic:" + record.topic() + ",Received message: " + record.value());
                //TODO: 處理Kafka消息的具體邏輯
              }
            }
          } finally {
            kafkaConsumer.close();
          }
        }
        public void shutdown() {
          closed.set(true);
          kafkaConsumer.close();
        }
      }
      
      posted @ 2023-07-19 17:11  張占嶺  閱讀(89)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产精品无码久久久久| 黑人精品一区二区三区不| 成人性无码专区免费视频| 久久久久影院色老大2020| 最新亚洲av日韩av二区| 毛片网站在线观看| 免费看的一级黄色片永久| 欧美老少配性行为| 91精品国产老熟女在线| 国产亚洲欧洲av综合一区二区三区 | 99人中文字幕亚洲区三| 亚洲中文字幕无码中字| 久久se精品一区二区三区| 国产a在视频线精品视频下载| 熟女精品视频一区二区三区| 诱人的老师hd中文字幕| 免费观看欧美猛交视频黑人| 91精品国产蜜臀在线观看| 国产一级av在线播放| 人人妻人人妻人人片av| 中文字幕结果国产精品| 亚洲中文久久久精品无码| 亚洲熟妇自偷自拍另类| 久久天天躁狠狠躁夜夜躁2020| 秋霞电影院午夜无码免费视频| 亚洲av永久无码天堂影院| 亚洲国产午夜精品理论片在线播放| 起碰免费公开97在线视频| 亚洲av影院一区二区三区| 亚洲日韩性欧美中文字幕| 好男人日本社区www| 给我中国免费播放片在线| av中文字幕国产精品| 欧美日韩欧美| 97夜夜澡人人爽人人模人人喊| 米脂县| 国产日韩综合av在线| 国产网友愉拍精品视频手机| 平凉市| 精品人妻少妇一区二区三区| 亚洲人成网站免费播放|