2017-05-04 3 views
-1

Ich habe eine application.yml-Datei, die im Innern ruft eine EigenschaftFrühling Boot-Ladeeigenschaften innerhalb yaml Datei Datei

Datei Wenn in meinem IDE Ausführung (Eclipse) Ich habe kein Problem, aber wenn das Glas in der Konsole ausgeführt wird (mit Java - jar) Es lädt nicht die Eigenschaftendatei, die in der YAML-Datei festgelegt ist. Hier

ist mein application.yml:

apache: 
    kafka: 
    producer: 
     properties: kafka-producer-${application.environment}.properties 
    consumer: 
     properties: kafka-consumer-${application.environment}.properties 

und hier die .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 

Ich lade die Eigenschaften wie diese Datei:

@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; 
    } 

in der IDE ausgeführt wird, Die this.kafkaProducerProperties hat den richtigen Wert, während die Ausführung der jar ist n ull.

Was mache ich falsch und warum lädt es direkt in der IDE, aber nicht das Glas?

+0

Sie scheinen einige Missverständnisse über YAML-Dateien/Dokumente zu haben. Es gibt nichts in der YAML-Spezifikation, so dass es eine Eigenschaftendatei aufruft. Das alles erledigt das Programm beim Laden der YAML-Datei. Sie könnten genauso gut sagen: "Ich habe eine Menge von UTF-8-Zeichen, die Inside eine Eigenschaftendatei aufruft", macht so wenig Sinn wie zu sagen, dass die YAML-Datei dies tut. – Anthon

+0

Vielleicht sind die Wörter nicht korrekt, Sie können Anrufe für beziehen, wenn es für Sie besser klingt. Aber das Problem, ich denke, es ist gut erklärt und Sie haben keine Hilfe mit Ihrer Antwort – ilozano

+0

Die richtigen Worte sind wichtig. Und dein Problem ist nicht gut erklärt. Im zweiten Abschnitt beginnen Sie mit 'Beim Ausführen ': Ausführen was? Sie haben zuvor nur eine YAML-Datei eingeführt, die nicht ausführbar ist. Gleich darauf beziehen Sie sich auf '* the * jar' (Hervorhebung von mir). Auf welches Glas beziehen Sie sich mit * dem *? Bis dahin hast du kein Glas eingeführt, auf das du dich beziehen kannst. Dein Post beginnt also mit Kauderwelsch für Uneingeweihte. Ich habe deinen schwer verständlichen Beitrag bereits verbessert, indem ich das unpassende Tag entfernt habe und mir die Zeit genommen habe zu erklären, warum das nötig war. Nicht helfend? – Anthon

Antwort

0

Bitte versuchen Sie diesen Code

@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"); 
} 

Hardcoding zu vermeiden, können Sie dies auch 1- Fügen Sie diese in Ihrem 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- Fügen Sie diesen Code

@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"); 
} 

Hoffe das hilft.

+0

Danke, ich versuche so etwas. Habe aber immer noch keine Ahnung, warum ich keine Eigenschaften in einem Yaml beziehen kann. I Though Yaml wurde übersetzt wie eine Eigenschaften selbst bei der Ausführung – ilozano

+0

Ok, haben Sie den ersten Code, der der mit hartcodierten Werten ist versucht? – berrytchaks

+0

Endlich habe ich das Problem gefunden, ich poste es. Anstatt this.context.getResource ("classpath:" + this.kafkaProducerProperties) .getInputStream() zu verwenden, habe ich eine neue ClassPathResource (this.kafkaConsumerProperties) .getInputStream() verwendet.Sieht aus wie in Spring-Boot-Anwendungen, der Kontext funktioniert etwas anders als in Kontext-Verzeichnissen, so dass es im Jar nicht die Eigenschaftendateien in dem Ordner sein muss, den Sie erwarten, also wird "ClassPathResource" automatisch gefunden – ilozano