Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Accessing the Delivery Channel

ATTENTION: This idea was develop during debugging another problem and so I forgot that I actually added the method getChannel() to the ScriptExchangeProcessorEndpoint which without this idea is not going to fly. So, until this method is added there is no way to make this fly. Also this Endpoint is fixed to be a Provider and so it could never send anything else than an InOnly method anyhow, sorry.
Please check out this JIRA issue: https://issues.apache.org/activemq/browse/SM-1112Image Removed for more info.

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 implements the Script Helper interface 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:

...

Code Block
titleGroovyExchangeProcessor.groovy
import org.apache.servicemix.common.ExchangeProcessor;
import javax.jbi.messaging.MessageExchange;
import org.apache.servicemix.jbi.jaxp.StringSource;
import org.apache.servicemix.script.ScriptHelper;
import org.apache.commons.logging.LogFactory;

class GroovyExchangeProcessor
    implements ExchangeProcessor
{
    @Property ScriptHelper exchangeHelper;

    def mLog = LogFactory.getLog( getClass() );

    def void start() {
        mLog.info( "Starting" );
    }

    def void process(MessageExchange pExchange) {
        def lChannel = exchangeHelper.getChannel();
        def lRequest = lChannel.createExchangeFactory().createInOutExchange();
        lRequest.setService( new QName( "urn:test", "target-service" ) );
        lRequest.setOperation( new QName( "MyOpertation" ) );
        def lNM = lRequest.createMessage();
        lNM.setContent( new StringSource( "<receiver><title>Zero</title><index>0</index></receiver>" ) );
        lRequest.setInMessage( lNM );
        mLog.info( "process() send new ME: " + lRequest );
        lChannel.send( lRequest );
    }

    def void stop() {
        mLog.info( "Stopping" );
    }
}

Attention:

  • This Endpoint is currently only implemented as a Provider and so it cannot send anything else than an InOnly request
  • if you do not extend the ScriptExchangeHelper then you need to change the type in the Groovy script to ScriptHelper for the exchangeHelper propery
  • if you extend the ScriptExchangeHelper then you have to call the super.setScriptExchangeProcessorEndpoint() method in order to set the private member there too, otherwise you will experience Null Pointer Exceptions
  • 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