2016-06-07 14 views
0

Ich habe Spring-basierte Komponente, die in der Lage sein muss, über JMS zu kommunizieren und eine annotierte Annotationsmethode @JmsListener verwenden möchte. Meine Listener-Klasse muss eine JSON-codierte Payload lesen, muss aber auch einen benutzerdefinierten Header lesen. Ich habe ein Bean eingerichtet und es der aktuellen XML-basierten Konfiguration hinzugefügt, in der ich den erforderlichen Nachrichtenkonverter konfiguriere. Derzeit ist mein Zuhörer Methode wie folgt kommentiert:Konfigurieren des Zielnamens in Spring @JmsListener

@JmsListener(destination = "activemq:queue:queue.name") 
    public void handleItemCommand(ProvisionItemCommand itemCommand, @Header(AUTH_HEADER_NAME) String auth) { 

Das alles funktioniert aber offensichtlich die Warteschlangennamen nicht fest einprogrammiert werden können, muss es konfigurierbar sein. Um die Angelegenheit zu komplizieren, verwenden wir eine benutzerdefinierte Klasse, um Konfigurationsdaten zu lesen, so dass die Verwendung von @PropertySource und der Eigenschaftendatei nicht in Frage kommt.

Wo ich bleibe stecken bleibt sehen, wie man Dinge aufstellt, damit dies passieren kann. Die Spring 4.2-Referenzdokumentation fordert mich auf, eine benutzerdefinierte PropertySource-Klasse zu erstellen und zu registrieren (die durch unseren benutzerdefinierten Konfigurationscode unterstützt werden kann). Das Beispiel im Dokument (http://docs.spring.io/spring/docs/4.1.9.RELEASE/spring-framework-reference/htmlsingle/#beans-property-source-abstraction) erstellt jedoch gerade einen Anwendungskontext und fügt die benutzerdefinierte Eigenschaftenquelle hinzu dazu. Vielleicht habe ich hier einen blinden Fleck entwickelt, aber wie erstelle ich eine benutzerdefinierte Property-Quelle und füge sie zu der bereits vorhandenen Umgebung hinzu? Ich habe einige Teilbeispiele im Internet gefunden, aber die meisten sind für Frühling 3, und einige scheinen widersprüchlich zu sein. Ich wäre dankbar, wenn jemand das klären könnte, da ich denke, dass ich 99% dort bin, aber irgendwie scheitert das letzte 1% für mich.

Antwort

0

Meine eigene Frage zu beantworten, scheint die einfachste Sache, die ich mir vorstellen konnte, mein Problem zu lösen. In meiner @Configuration Klasse habe ich die folgenden:

@Autowired 
public void setCustomConfiguration(CustomConfiguration customConfiguration, ConfigurableEnvironment env) { 
    LOG.trace("setCustomConfiguration()"); 
    this.customConfiguration = customConfiguration; 
    env.getPropertySources().addFirst(new CustomPropertySource("custom-config", customConfiguration)); 
} 

Dann wird die CustomPropertySource Klasse sieht einfach nach oben, was auch immer Schlüssel es gefragt wird es CustomConfiguration ist. Posted hier in der Hoffnung, es hilft jemand anderem; Wenn jemand irgendwelche Anmerkungen/Verbesserungen zu dieser Lösung hat, würde ich mich freuen, das zu hören.

Verwandte Themen