Providers use an implementation of the org.apache.servicemix.jms.endpoints.JmsProviderMarshaler interface to convert normalized messages into JMS messages. The marshaler also converts the incoming reply from a JMS message into a normalized message. The JMS binding component comes with two provider marshaler implementations:
DefaultProviderMarshalerThe DefaultProviderMarshaler class provides the marshaler used by generic provider endpoints.
JmsSoapProviderMarshalerThe JmsSoapProviderMarshaler class provides the marshaler used by SOAP provider endpoints.
![]() | Note |
|---|---|
The default SOAP marshaler does not support the full range of SOAP messages nor does it support marshaling map based messages into JMS messages. |
When the default provider marshalers do not suffice for you application you can provide a custom implementation of the JmsProviderMarshaler interface.
To create a custom provider marshaler you implement the org.apache.servicemix.jms.endpoints.JmsProviderMarshaler interface. The JmsProviderMarshaler interface, shown in Example 6.4, has two methods you need to implement:
Example 6.4. The Provider Marshaler Interface
public interface JmsProviderMarshaler
{
Message createMessage(MessageExchange exchange, NormalizedMessage in, Session session) throws Exception;
void populateMessage(Message message, MessageExchange exchange, NormalizedMessage normalizedMessage) throws Exception;
}createMessage()The createMessage() method uses information from the FUSE ESB core to generate a JMS message. Its parameters include the message exchange, the normalized message that is received by the provider, and the active JMS session.
populateMessage()The populateMessage() method takes a JMS message and adds it to a message exchange for use by the FUSE ESB core.
Example 6.5 shows a simple provider marshaler implementation.
Example 6.5. Provider Marshaler Implementation
package com.widgetVendor.example;
import javax.jbi.messaging.MessageExchange;
import javax.jbi.messaging.NormalizedMessage;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.xml.transform.Source;
import org.apache.servicemix.jbi.jaxp.SourceTransformer;
import org.apache.servicemix.jbi.jaxp.StringSource;
import org.apache.servicemix.jms.endpoints.JmsProviderMarshaler;
public class widgetProviderMarshaler implements JmsProviderMarshaler
{
private SourceTransformer transformer = new SourceTransformer();
public Message createMessage(MessageExchange exchange, NormalizedMessage in, Session session) throws Exception
{
TextMessage text = session.createTextMessage();
text.setText(transformer.contentToString(in));
return text;
}
public void populateMessage(Message message, MessageExchange exchange, NormalizedMessage normalizedMessage) throws Exception
{
TextMessage textMessage = (TextMessage) message;
Source source = new StringSource(textMessage.getText());
normalizedMessage.setContent(source);
}
}You configure a provider to use a custom marshaler using its marshaler attribute. The marshaler attribute's value is a reference to a bean element specifying the class of your custom marshaler implementation.
Example 6.6 shows configuration for a provider that uses a custom marshaler.
Example 6.6. Configuring a Provider to Use a Customer Marshaler
<beans xmlns:jms="http://servicemix.apache.org/jms/1.0"
... >
...
<jms:soap-provider wsdl="classpath:widgets.wsdl"
destinationName="widgetQueue"
connectionFactory="#connectionFactory"
marshaler="#myProviderMarshaler" />
<bean id="myProviderMarshaler" class="com.widgetVendor.example.widgetProviderMarshaler" />
...
</beans>![]() | Note |
|---|---|
You can also configure a provider to use a custom marshaler by adding a child |