Veröffentlichen von Informationen zu Mule Applikationen im Maven-Umfeld

Keine Kommentare

Habt ihr euch auch schon mal die Frage gestellt, welche Version einer Mule Applikation auf eurem Mule gerade installiert ist?

Gerade wenn man viele Applikationen zu warten und/oder zu entwickeln hat und die Frequenz der Deployments hoch ist kommt diese Frage sehr oft.

Wer dann noch mit Maven als Build- und Release-Werkzeug arbeitet, stellt sich spätestens dann die Frage: „Wie kann ich z.B. die Versionnummer, welche von Maven verwaltet wird in meiner Mule-Umgebung abfragen?“

Im folgenden möchte ich ein kleines Tutorial anbieten, welches sich dieser Problemstellung widmet.

Um die Versionnummer einer Applikation im Mule zu veröffentlichen bedarf es im Grunde 3 Schritten, die ich im folgenden näher erläutere.

mule-app.properties integrieren

Mule bietet Out-Of-The-Box die Möglichkeit Properties aus einer fest definierten Datei im gesamten Mule-Kontext der Applikation zu verwenden (Mule Dokumentation). Die Datei heißt mule-app.properties und muss, genauso wie die mule-config.xml, im Hauptverzeichnis der Applikation liegen. Alle Properties, die in dieser Datei definiert werden, können entweder über einen Platzhalter in der Mule Konfiguration, z.B. mit

<beans:beans>
    <beans:bean class="de.codecentric.Foo">
        <beans:property name="bar" value="${property.in.mule-app.properties}" />
    </beans:bean>
</beans:beans>

oder programmatisch über die Mule-Registry ausgelesen werden.

public class InfoMBean implements MuleContextAware {
 
    private MuleContext context;
 
    @Override
    public void setMuleContext(MuleContext context) {
        this.context = context;
    }
 
    public String getVersion() {
        return context.getRegistry().lookupObject("property.in.mule-app.properties");
    }
 
}

Mit diesem Wissen können wir also nun fortfahren und diese Datei mit folgendem Inhalt anlegen:

app.name=${pom.name}
app.version=${pom.version}

Wie zu erkennen ist, sind die Werte der Properties selbst wieder Platzhalter. Diese Platzhalter sind hier wiederum Properties, welche innerhalb eines jeden Maven-Builds bekannt sind. Die hier verwendeten Properties sind nur ein beispielhafter Ausschnitt an Möglichkeiten. Hier können alle, innerhalb des eigenen Maven-Build bekannten Properties verwendet werden.

Die Platzhalter werden nun im nächsten Schritt mit Maven durch konkrete Werte ersetzt…

Platzhalter per Maven-Build auflösen

Maven kennt in seinem Build ein sogenanntes Resource-Filtering. Dieses bedeutet, dass Platzhalter innerhalb von Dateien, die der Build als Resource kennt, versucht zu ersetzten – soweit ihm diese Platzhalter bekannt sind. Dieses Resource-Filtering muss explizit aktiviert werden. Im folgenden Beispiel gehe ich davon aus, dass die Applikation bereits mit dem maven-mule-plugin gebaut wird:

<plugin>
    <groupId>org.mule.tools</groupId>
    <artifactId>maven-mule-plugin</artifactId>
    <version>1.9</version>
    <extensions>true</extensions>
    <configuration>
        <appDirectory>src/main/app</appDirectory>
        <filterAppDirectory>true</filterAppDirectory>
        <nonFilteredFileExtensions>
            <nonFilteredFileExtenion>xml</nonFilteredFileExtenion>
        </nonFilteredFileExtensions>
        <copyToAppsDirectory>true</copyToAppsDirectory>
        <finalName>codecentric-info-app</finalName>
    </configuration>
</plugin>

Die Eigenschaft filterAppDirectory des Plugins ist der entscheidende Punkt. Zusätzlich habe ich noch definiert, dass XML-Dateien von Resource-Filtering ausgenommen werden, so dass die Platzhalter in der mule-config.xml nicht ersetzt werden. Mit dieser Konfiguration des Plugins lässt sich nun ein Build durchführen. Nach dem Build sieht die mule-app.properties in der erzeugten ZIP-Datei beispielsweise wie folgt aus:

app.name=codecentric-info-app 
app.version=1.2.3

Nun ist die Applikation also gebaut und beinhaltet Informationen (z.B. die Versionsnummer) über den eigenen Build. Diese Informationen können nun innerhalb der Applikation abgerufen werden und z.B. der JMX veröffentlich werden …

JMX MBean implementieren

Um die, nun innerhalb der Applikation bekannten Informationen zum Build öffentlich bekannt zu machen, wird in der Applikation ein MBean exportiert, welches diese Informationen bereitstellt. Hierzu nutzen wir den Spring-MBeanExporter und einen Annoation-Driven MetadataMBeanInfoAssembler – Siehe auch Spring Dokumentation.

package de.codecentric.foo;
 
import org.mule.api.MuleContext;
import org.mule.api.context.MuleContextAware;
import org.springframework.jmx.export.annotation.ManagedAttribute;
import org.springframework.jmx.export.annotation.ManagedResource;
 
@ManagedResource
public class InfoMBean implements MuleContextAware {
 
    private MuleContext context;
 
    @Override
    public void setMuleContext(MuleContext context) {
        this.context = context;
    }
 
    @ManagedAttribute
    public String getVersion() {
        return context.getRegistry().lookupObject("app.version");
    }
 
    @ManagedAttribute
    public String getName() {
        return context.getRegistry().lookupObject("app.name");
    }
 
}

Die Konfiguration in der mule-config.xml

<beans:beans>
    <beans:bean class="org.springframework.jmx.export.MBeanExporter">
        <beans:property name="beans">
        <beans:map>
            <beans:entry key="Mule.${app.name}:name=InfoMBean"
                value-ref="infoMBean" />
        </beans:map>
        </beans:property>
        <beans:property name="assembler">
        <beans:bean
            class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler">
            <beans:property name="attributeSource">
                <beans:bean
                    class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource" />
            </beans:property>
        </beans:bean>
        </beans:property>
    </beans:bean>
    <beans:bean id="infoMBean" class="de.codecentric.foo.InfoMBean" />
</beans:beans>

In der Konfiguration enthalten ist bereits die Nutzung einer Property aus den mule-app.properties: Beim Namen des exportierten MBeans in der MBeanExporter-Map beans. Einige Beans einer Mule Applikation sind standardmäßig bereits per JMX exportiert. Die JMX-Domain dieser MBeans lautet per Konvention immer Mule.<Applikationsname>, so dass wir das MBean hier, wie gezeigt, in diese JMX-Domain einhängen können.

Ergebnis

Mit diesen Bausteinen kann die Applikation nun neu gebaut und installiert werden. Über das JDK-Tool jconsole lassen sich nun die registrieren MBeans ansehen. Das Ergebnis sieht wie folgt aus:

jconsole

Ausblick

Wenn man nun mehrere solcher Applikationen auf den Mule installiert hat könnte man auf die Idee kommen, eine weitere Mule Applikation zu erstellen, die diese Informationen aus den MBeans kummuliert und als Informationsseite zum Status der installierten Applikationen darstellt. Diese Applikation ist Bestandteil meines nächsten Posts (folgt)

Weitere Teile dieser Artikelserie

  1. Was ist ein ESB und wofür kann man ihn nutzen?
  2. Tutorial “Enterprise Service Bus mit Mule ESB”: Hello World/Bus
  3. Tutorial “Enterprise Service Bus mit Mule ESB”: MuleMessage und Java-Komponenten
  4. Tutorial „Enterprise Service Bus mit Mule ESB“: Nachrichten mit Java transformieren
  5. Tutorial „Enterprise Service Bus mit Mule ESB“: Integration von CICS Programmen
  6. Tutorial “Enterprise Service Bus mit Mule ESB”: Transport, Connector, Endpoint: Ein paar Grundlagen…
  7. Tutorial “Enterprise Service Bus mit Mule ESB”: Performance und Threads
  8. Tutorial “Enterprise Service Bus mit Mule ESB”: Steuerung und Kontrolle per JMX
  9. Veröffentlichen von Informationen zu Mule Applikationen im Maven-Umfeld
  10. Tutorial “Enterprise Service Bus mit Mule ESB”: Exceptions und Email
  11. Kummulieren von Informationen zu Mule Applikationen per JMX

Nach seinem Studium der Informatik stieß er direkt im Anschluss, im Jahr 2007, auf codecentric und ist seitdem begeisterter Arbeitnehmer.
In seinen Projekten bei der codecentric war er für diverse Versicherungen tätig und hat darin Systeme und Lösungen für Versicherungsprodukte geschaffen.

Share on FacebookGoogle+Share on LinkedInTweet about this on TwitterShare on RedditDigg thisShare on StumbleUpon

Kommentieren

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.