我有一个application.yml
文件,里面调用属性文件
在我的IDE(eclipse)中执行时我没有问题,但是当在控制台(使用java -jar)中运行jar时,它不会加载在YAML文件中设置的属性文件。
这是我的application.yml
:
apache:
kafka:
producer:
properties: kafka-producer-${application.environment}.properties
consumer:
properties: kafka-consumer-${application.environment}.properties
这里是.properties
:
#
# Apache Kafka Consumer Properties
##
bootstrap.servers=XXXX:9092
group.id=consumers
enable.auto.commit=true
auto.commit.interval.ms=1000
key.deserializer=org.apache.kafka.common.serialization.StringDeserializer
value.deserializer=org.apache.kafka.common.serialization.StringDeserializer
session.timeout.ms=300000
request.timeout.ms=305000
我正在加载这样的属性文件:
@Value("${apache.kafka.producer.properties}")
private String kafkaProducerProperties;
@Bean
public KafkaProducer<String, String> eventProducer() {
try {
Properties properties = new Properties();
properties.load(this.context.getResource("classpath:" + this.kafkaProducerProperties).getInputStream());
return new KafkaProducer<String, String>(properties);
} catch (final IOException exception) {
LOG.error("Error loading Kafka producer properties", exception);
}
return null;
}
在IDE中执行this.kafkaProducerProperties
具有正确的值,而执行jar则为null。
我做错了什么,为什么它在IDE中加载,但没有执行jar?
答案 0 :(得分:0)
请尝试此代码
@Bean
public KafkaProducer<String, String> eventProducer() {
try {
Properties properties = new Properties();
properties.put("bootstrap.servers","XXXX:9092");
properties.put("group.id","consumers");
properties.put("enable.auto.commit","true");
properties.put("auto.commit.interval.ms","1000");
properties.put("key.deserializer","org.apache.kafka.common.serialization.StringDeserializer");
properties.put("value.deserializer","org.apache.kafka.common.serialization.StringDeserializer");
properties.put("session.timeout.ms","300000");
properties.put("request.timeout.ms","305000");
return new KafkaProducer<String, String>(properties);
} catch (final IOException exception) {
LOG.error("Error loading Kafka producer properties", exception);
}
// Avoid return null in your code instead throw an exception
throw new IllegalAccessException("Error loading Kafka producer properties");
}
为避免硬编码,您也可以这样做 1-在你的application.yml
中添加它bootstrap.servers: XXXX
group.id: consumers
enable.auto.commit: true
auto.commit.interval.ms: 1000
key.deserializer: org.apache.kafka.common.serialization.StringDeserializer
value.deserializer: org.apache.kafka.common.serialization.StringDeserializer
session.timeout.ms: 300000
request.timeout.ms: 305000
2-添加此代码
@Value("${bootstrap.servers}")
private String bootstrapServers;
@Value("${group.id}")
private String groupId;
@Value("${enable.auto.commit}")
private String enableAutoCommit;
@Value("${auto.commit.interval.ms}")
private String autoCommit;
@Value("${key.deserializer}")
private String keyDeserializer;
@Value("${value.deserializer}")
private String valueDeserializer;
@Value("${session.timeout.ms}")
private String sessionTimeout;
@Value("${request.timeout.ms}")
private String requestTimeout;
@Bean
public KafkaProducer<String, String> eventProducer() {
try {
Properties properties = new Properties();
properties.put("bootstrap.servers",bootstrapServers+"9092");
properties.put("group.id",groupId);
properties.put("enable.auto.commit",enableAutoCommit);
properties.put("auto.commit.interval.ms",autoCommit);
properties.put("key.deserializer",keyDeserializer);
properties.put("value.deserializer",valueDeserializer);
properties.put("session.timeout.ms",sessionTimeout);
properties.put("request.timeout.ms",requestTimeout);
return new KafkaProducer<String, String>(properties);
} catch (final IOException exception) {
LOG.error("Error loading Kafka producer properties", exception);
}
// Avoid return null in your code instead throw an exception
throw new IllegalAccessException("Error loading Kafka producer properties");
}
希望这有帮助。