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 your 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 |