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:
DefaultProviderMarshaler
The DefaultProviderMarshaler
class provides the marshaler used by generic provider endpoints.
JmsSoapProviderMarshaler
The 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 |