2016-05-04 24 views
2

Ich weiß nicht einmal, ob ich einen OSGi Service Expose als Camel Endpoint

die Frage nach dem richtigen Weg, um ;-)

formuliert will, was ich im Grunde so etwas wie dies zu erreichen ist:

<route > 
    <from uri="osgi:serviceName"/> 
    <!-- do some processing -> 
    <to uri="activemq:queue:inbox"/> 
</route> 

Also würde ich gerne einen OSGi-Service als Ausgangspunkt meiner Route haben. Dieser Dienst kann von einigen anderen Bundles referenziert werden und mit Eingabedaten, die später von der Route verarbeitet werden.

Wie würde ich das tun?

Antwort

3

Erstellen Sie einfach einen OSGi-Dienst außerhalb von camel und eine Route, die mit direct beginnt: anyname. Dann können Sie ein ProducerTemplate in Ihren Dienst einfügen und von dort aus die Route aufrufen.

+0

Können Sie mir bitte erklären, diese in etwas mehr Detail „ein ProducerTemplate in Ihren Dienst injizieren“? Oder hast du vielleicht ein Beispiel? Prost! – Frizz

+0

Ich denke, der einfachste Weg ist, den CamelContext zu injizieren und ProducerTemplate producer = contrext.createProducerTemplate(); –

0

Um "osgi" als URI-Schema in einer Camel-Route zu verwenden, müssen Sie eine benutzerdefinierte Camel-Komponente erstellen, um die entsprechenden OSGi-Befehle aufzurufen. Weitere Informationen finden Sie unter http://camel.apache.org/creating-a-new-camel-component.html

Eine einfachere Alternative wäre das Schreiben von benutzerdefinierten OSGi-Befehlen, die ein ProducerTemplate verwenden, um Nachrichten an eine Camel-Route zu senden. Ein Beispiel für Karaf finden Sie hier: https://github.com/apache/karaf/tree/master/demos/command

Das Einspritzen eines ProducerTemplate kann über die Standard-Spring-Konfiguration erfolgen.

2

Wenn Sie eine wirklich einfache Methodensignatur oder typeConverter für die Parameter haben, die Sie übergeben möchten, können Sie CamelProxy verwenden, um den Dienst in einer einfachen XML-Konfigurationsdatei mit Ihrer Route zu verknüpfen.

Um sich am Beispiel des doc, würden Sie so etwas wie:

<osgi:service id="service" ref="myProxySender"        (4) 
     interface="org.apache.camel.spring.config.MyProxySender" /> 

<camelContext xmlns="http://camel.apache.org/schema/spring"> 

    <!-- create a proxy that will route to the direct:start endpoint when invoked --> 
    <proxy id="myProxySender" 
      serviceInterface="org.apache.camel.spring.config.MyProxySender" 
      serviceUrl="direct:start"/> 

    <!-- this is the route that our proxy will routed when invoked 
     and the output from this route is returned as reply on the proxy --> 
    <route> 
     <from uri="direct:start"/> 
     <transform> 
      <simple>Bye ${body}</simple> 
     </transform> 
    </route> 

</camelContext>