You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 5 Next »

ServiceMix Script

The ServiceMix Script component provides JBI integration with scripting engines.

Note that this component is only available in releases >= 3.1 and older scripting component will be deprecated in future releases.

Deployment

Here is an example of a SU deploymennt. The SU is only a zip of these two files:

xbean.xml
<beans xmlns:script="http://org.apache.servicemix/script/1.0"
       xmlns:lang="http://www.springframework.org/schema/lang"
       xmlns:test="urn:test">
  <script:exchangeProcessor service="test:groovy" endpoint="endpoint">
    <property name="helpers">
      <list>
        <ref bean="groovyExchangeHelper" />
      </list>
    </property>
    <property name="implementation" ref="groovyExchangeProcessor" />
  </script:exchangeProcessor>
  <script:exchangeHelper id="groovyExchangeHelper" singleton="true" />
  <lang:groovy id="groovyExchangeProcessor"
               script-source="classpath:GroovyExchangeProcessor.groovy">
    <lang:property name="exchangeHelper" ref="groovyExchangeHelper" />
  </lang:groovy>
</beans>
GroovyExchangeProcessor.groovy
import org.apache.servicemix.common.ExchangeProcessor;
import javax.jbi.messaging.MessageExchange;
import javax.jbi.messaging.NormalizedMessage;
import org.apache.servicemix.jbi.jaxp.StringSource;
import org.apache.servicemix.script.ScriptExchangeHelper;
import org.apache.servicemix.jbi.jaxp.SourceTransformer;

class GroovyExchangeProcessor implements ExchangeProcessor {

    @Property ScriptExchangeHelper exchangeHelper;

	def void start() {
	    println "Starting";
	}

    def void process(MessageExchange exchange) {
    	def inputMessage = new SourceTransformer().toString(exchange.getInMessage().getContent());
    	println "Hello, I got an input message "+inputMessage;
    	NormalizedMessage out = exchange.createMessage();
        out.setContent(new StringSource("<world>hello</world>"));
        exchange.setMessage(out, "out");
        exchangeHelper.sendExchange(exchange);    	
    }
    
    def void stop() {
    	println "Stopping";
    }
}

Accessing the Delivery Channel

In order to create Message Exchanges one needs the Delivery Channel to obtain the Message Exchange Factory to create them. This is not possible by default but can be easily added using a customer Script Helper class. The only thing to do is to create a class that extends the Script Exchange Helper class and use the Script Exchange Processor Endpoint instance to obtain the Delivery Channel from. Now you can either provide the Delivery Channel as is or you can create convenience method to create Message Exchanges for example. This is how a customer Script Helper class would look like:

foo.MyScriptHelper.java
package foo;

import javax.jbi.messaging.DeliveryChannel;

import org.apache.servicemix.script.ScriptExchangeHelper;
import org.apache.servicemix.script.ScriptExchangeProcessorEndpoint;
import org.apache.servicemix.script.ScriptHelper;

public class MyScriptExchangeHelper
   extends ScriptExchangeHelper
{
    protected ScriptExchangeProcessorEndpoint mEndpoint;

    public void setScriptExchangeProcessorEndpoint(
        ScriptExchangeProcessorEndpoint pEndpoint
    ) {
        mEndpoint = pEndpoint;
        super.setScriptExchangeProcessorEndpoint( pEndpoint );
    }

    public DeliveryChannel getChannel() {
        return mEndpoint.getChannel();
    }
}

After that you only need to use a Spring Bean to create an instance and the use the same references in the rest of the Script settings. This is what needs to be changed from the xbean.xml mentioned above:

xbean.xml changes
<bean
    id="groovyExchangeHelper"
    class="com.ge.gehc.scout.xmessaging.test.MyScriptExchangeHelper"
/>

<!--<script:exchangeHelper id="groovyExchangeHelper" singleton="true" />-->

Attention:

  • don't forget to call the super.setScriptExchangePocessorEndpoint() to make sure that the base class does not throw Null Pointer Exceptions (because the super class has its own private member for this instance and this must be set)
  • you have to use the Spring Bean in the xbean.xml because the script:exchangeHelper is fixed to use the super class
  • no need to upcast the exchange helper property in the Groovy script; even though the type is specified there Groovy still is able to find the method in the sub class

It is unfortunate that the ScriptExchangeProcessorEndpoint instance does not have protected access put private inside the ScriptExchangeHelper but maybe that will change making it easier to extend it.

  • No labels