クラスパス上のキーストアまたはトラストストアを見つけることができない私は、カフカの消費者の設定と構成を設定しています:
@EnableKafka
@Configuration
public class KafkaConfig {
@Value("${kafka.ssl.keystore}")
private String keyStorePath;
@Value("${kafka.ssl.truststore}")
private String trustStorePath;
@Bean
public ConsumerFactory<String, String> getConsumerFactory() {
Map<String, Object> properties = new HashMap<>();
properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,"my-bootstrap.mydomain.com:443");
properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
properties.put(ConsumerConfig.GROUP_ID_CONFIG, "group1");
properties.put(ConsumerConfig.CLIENT_ID_CONFIG, "client1");
properties.put("enable.auto.commit", "true");
properties.put("auto.commit.interval.ms", "500");
properties.put("session.timeout.ms", "30000");
properties.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "SSL");
properties.put(SslConfigs.SSL_KEYSTORE_LOCATION_CONFIG, keyStorePath);
properties.put(SslConfigs.SSL_KEYSTORE_PASSWORD_CONFIG, "password");
properties.put(SslConfigs.SSL_TRUSTSTORE_LOCATION_CONFIG, trustStorePath);
properties.put(SslConfigs.SSL_TRUSTSTORE_PASSWORD_CONFIG, "password");
properties.put(SslConfigs.SSL_KEY_PASSWORD_CONFIG, "password");
return new DefaultKafkaConsumerFactory<>(properties);
}
@Bean
public ConcurrentKafkaListenerContainerFactory<String, String> kafkaListenerContainerFactory() {
ConcurrentKafkaListenerContainerFactory<String, String> factory
= new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(getConsumerFactory());
return factory;
}
}
キーストアおよびトラストストアは、両方のディレクトリに配置されsrc/main/resources/ssl
た構成のクラスと同じ達人モジュール。
次のように私はapplication.ymlのプレースホルダを設定します。
kafka:
ssl:
keystore: classpath:ssl/kafka-keystore.jks
truststore: classpath:ssl/kafka-truststore.jks
ただし、アプリケーションは以下の例外を除いて起動に失敗します:
"org.apache.kafka.common.KafkaException: java.io.FileNotFoundException: classpath:ssl/kafka-keystore.jks (No such file or directory)"
私の理解では、使用してはということで@Value
の使用可能classpath:
クラスパスを解決するための接頭辞を(このリンクを参照してください)https://www.baeldung.com/spring-classpath-file-access
また、@Value
この技術は、同じアプリケーションでの反応性のWebClient構成用キーストアおよびトラストストアを解決するだけで正常に動作します。
私はカフカの設定のためのクラスパスを解決するために何をする必要がありますか?私はここで何かが足りないのですか?
「クラスパス:」あなたは維持するつもりされる文字列の中に注入するString値内とDefaultKafkaConsumerFactoryにプロパティとしてそれを提供、などの春のリソースに注入してみてください。
import org.springframework.core.io.Resource;
@Value("classpath:path/to/file/in/classpath")
Resource resourceFile;
次に、ファイルにアクセスすることができますし、のような絶対パスを取得できます。
resourceFile.getFile().getAbsolutePath()
アイデアは、あなたがDefaultKafkaConsumerFactoryへの絶対パスを提供することができています
「クラスパス:」しかし、あなたはまた、削除しようとすることができ、どのようにDefaultKafkaConsumerFactory扱い、そのプロパティに応じて、作業可能性がありますあなたの現在のコードのような文字列として注入します。上記の絶対パスが動作しない理由しかし、私は見ることができません。