Mule 2.1.1 Users Guide
Mule 2.1.1 Users Guide
Mule 2.1.1 Users Guide
Key: MULE2USER
Name: Mule 2.x User Guide
Description: Mule Users Guide for the 2.x release line
Using Expressions
[ Using Expressions with Transformers ] [ Using Expression Filters ] [ Using Expression Routers ] [ Adding
Expression Support to Custom Modules ] [ Creating Custom Expression Evaluators ]
Expressions allow you to extract information from the current message or determine how to handle the
message. Expressions are very useful with routers and filters for defining routing logic and for filtering
out unwanted messages.
Mule provides several default expression evaluators, allowing you to embed expression logic in a variety
of expression languages, or you can create your own evaluators to support additional languages.
This page describes how to use expressions and how to create custom expression evaluators. For more
details on how to configure expressions, see Expressions Configuration Reference.
Expression Transformer
The expression transformer executes one or more expressions on the current message where the result
of the expression(s) will become the payload of the current message.
For example, imagine you have a service component with a message signature that accepts three
arguments:
And the message being passed to you component looks like this:
The <expression-transformer> can be used to extract the fields from the ShippingRequestMessage
to invoke the ShippingService. Note that we can only get two of the arguments from the
ShippingRequestMessage: Customer and Item[]. The supporting documentation, which could be
something like a Microsoft Word or Excel document, is an attachment to the ShippingRequestMessage.
Attachments can be associated with any message within Mule.
<expression-transformer>
<return-argument evaluator="bean" expression="customer"/>
<return-argument evaluator="bean" expression="shippingItems"/>
<return-argument evaluator="attachment" expression="supportingDocs" required="false"/>
</expression-transformer>
<message-properties-transformer>
<add-property name="GUID" value="#[xpath:/msg/header/ID]-#[xpath:/msg/body/@ref]"/>
</message-properties-transformer>
The above expressions extract the <ID> element value and the ref attribute on the <body> element,
setting the result as a message property named GUID.
XSLT Transformer
The XSLT transformer processes the XML payload of the message through XSLT. Using expressions, you
can inject information about the current message into the XSLT as a parameter. For example:
When executed, the headers ListTitle and ListRating from the current message are added to the
XSLT context as parameters called title and rating, respectively. You can reference these parameters
inside the XSLT using the <xsl:param> element:
<xsl:param name="title"/>
<xsl:param name="rating"/>
As usual, you can use AND, OR, and NOT filters to combine expressions.
<and-filter>
<expression-filter evaluator="header" expression="origin-country=USA"/>
<expression-filter evaluator="groovy" expression="payload.purchase.amount > 10000"/>
</and-filter>
Note that expression filters support a sub-set of all expression evaluators, because filters should only
evaluate against the current message. For example, there is no point in using a function expression on
a filter. The supported expression evaluators are: bean, custom, exception-type, groovy, header, jxpath,
ognl, payload-type, regex, wildcard, and xpath. For more information on expression evaluators, see
Expressions Configuration Reference.
The <expression-recipient-list> router will evaluate an expression on the current message to obtain
a list of one or more recipients to send the current message. Following is an example of an XML message:
<message>
<header>
<routing-slip>
<recipient>http://mycompany.com/service1</recipient>
<recipient>http://mycompany.com/service2</recipient>
</routing-slip>
</header>
<body>
...
<body>
</message>
The following router configuration extracts recipients from this message. This type of routing is commonly
referred to as content-based routing.
<outbound>
<expression-recipient-list-router evaluator="xpath" expression="/message/header/routing-slip/
recipient" />
</outbound>
Best Practice
This example uses physical addresses for endpoints in the message. In a real production
scenario, you would use logical endpoint names that map to physical endpoint addresses.
These can be configured in your Mule configuration file or in the Mule Galaxy centralized
registry.
The <expression-message-splitter> router can be used to route different parts of the current message
to different destinations. Let's say our current message is a FruitBowl that contains different fruit that
should be delivered to different places.
Now we have a FruitBowl containing an apple, an orange, and two bananas. When Mule receives
this object, we want to route the fruit to different locations: the AppleService, BananaService, and
OrangeService.
<service name="Distributor">
<inbound>
<jms:inbound-endpoint queue="distributor.queue"/>
</inbound>
<outbound>
<!-- FruitBowl.getFruit() List -->
<expression-splitter-router evaluator="bean" expression="fruit">
<vm:outbound-endpoint path="apple.service.queue">
<payload-type-filter expectedType="org.mule.tck.testmodels.fruit.Apple"/>
</vm:outbound-endpoint>
Notice that each of our outbound endpoints has a filter defined. This allows the splitter router to validate
that the right object is routed to the right service. In this example, the AppleService and OrangeService
will receive one request (fruit object) each and the BananaService will receive two. If the filters were
not defined, the splitter router would send each object to the next endpoint in the list in a round robin
fashion.
Note that in Mule 2.2, the ExpressionEvaluatorManager will be available from the MuleContext using
muleContext.getExptessionManager(). For more information follow issue MULE-3801@JIRA.
First, you need to implement your custom expression evaluator by implementing ExpressionEvaluator .
This is a simple strategy interface:
Note that this interface implements NamedObject, which allows the evaluator to be named. This name
maps to the evaluator part of an expression.
The arguments on the evaluate method are self-explanatory. The expression argument is the
expression to evaluate on the current message being passed in. The message is of type Object rather
than MuleMessage. This means your expression evaluator will explicitly check the message type.
The API may change in Mule 2.2 to accept a MessageAdapter instead, making things a little
easier. See MULE-3842@JIRA.
Lets take the header expression evaluator as a concrete example. This evaluator will only produce a
result if a MuleMessage object is passed in. It will assume that the expression will contain a name of a
header to return.
Here, we cast the message received to a MessageAdapter and look up the message header. Note
that the name of the expression evaluator is fixed as "header" so the setName method throws an
UnsupportedOperationException.
Now that you have created your custom expression evaluator, you need to register it with Mule. There are
two ways of doing this, depending on how you are configuring your Mule instance.
If you are using XML configuration, you can just configure your expression evaluator as a bean, and Mule
will discover it.
<spring:beans>
<spring:bean class="org.mule.expressions.MessageHeaderExpressionEvaluator"/>
</spring:beans>
If you want your expression evaluator to be loaded automatically by Mule when your module (JAR) is on
the class path, you need to add a registry-bootstrap.properties file to your JAR under the following
directory:
/META-INF/services/org/mule/config
object.1=org.mule.util.expression.MessageHeaderExpressionEvaluator
When Mule starts, it will discover this bootstrap file before loading any configuration and will install any
objects listed in the file into the local registry.
Finally, to use the custom evaluator, you use the customEvaluator attribute as follows:
<expression-transformer>
<return-argument evaluator="custom" customEvaluator="myEval" expression="foo"/>
</expression-transformer>
#[myEval:foo]
Expression Attributes
The XML configuration elements in Mule that support expressions have three common attributes that
define the expression to execute, the evaluator to use, and the option of defining a custom evaluator.
Attribute Description
Expressions can be used in a number of other scenarios such as filters, routing, and endpoints.
Syntax
There are two ways of specifying expressions depending on where the expression is being used. Typically,
expression-based elements such as the expression transformer, expression filter, and expression-based
routers such as the expression message splitter, will have specific attributes for expression, evaluator,
and custom-evaluator. For example:
For these elements, only a single expression can be set for the element.
When defining expressions for things like property values, multiple expressions can be defined using the
following syntax:
#[<evaluator>:<expression>]
<message-properties-transformer>
<add-property name="GUID" value="#[xpath:/msg/header/ID]-#[xpath:/msg/body/@ref]"/>
</message-properties-transformer>
In Mule 2.0 the syntax for expressions used a dollar sign and curly braces i.e. ${xpath://
foo/bar}. This has been replaced in Mule 2.1 with the syntax described above, #[xpath://
foo/bar]. This change was made so that Mule expressions would not conflict with Spring
Property placeholders that use the ${...} syntax.
MyApplication.properties
web.proxy.host=192.168.2.2
web.proxy.port=8081
<mule ...>
<http:connector name="HttpConnector" proxyHostname="${web.proxy.host}"
proxyPort="${web.proxy.port}"/>
</mule>
These property placeholders are resolved during the start-up phase of your application. Mule expressions
are evaluated continuously for every message received or sent.
groovy #[groovy:payload.fruit.washed]
Currently there is no way to configure namespaces for XML expressions. In Mule 2.2 it will
be possible to define global namespaces that will be accessible to all XML expressions. For
more information please follow (and vote) on this issue MULE-3303@JIRA.
Some of the 2.0 documentation is still under construction. If you have content you can add, please
contact us to become a site editor.
Extending Mule
Using Mule
• Introduction to Extending Mule
• Creating Transports
• Creating Additional Extensions
• Configuring Mule
° Configuration Overview
• Creating a Custom XML Namespace
° XML Configuration
• Internationalizing Strings
° Configuring a Mule Instance
• Using MuleForge
° Configuring Endpoints
° Using Transformers Testing Mule
° About Models
Mule 1.x
• Getting Started
• User Guide
About Transports
A transport is responsible for carrying messages from application to application in the Mule framework.
A transport provides a set of functionality that handles messages on a specific channel. For example, the
HTTP transport handles messages sent via the HTTP protocol, whereas the File transport picks up files
placed on the server's file system.
The heart of a transport is the connector. The connector maintains the configuration and state for
the transport. When receiving messages, a connector uses a message receiver, which reads the
data, packages it as a message, and passes it to the service component's inbound router. When
sending messages, the connector uses a message dispatcher, which receives the messages and routing
instructions from the service component's outbound router and sends the message to the next service
component or application.
Related Topics
Available Transports
Configuring a Transport
Customizing a Transport
Creating Transports
Available Transports
[ Mule Transports ] [ Transports Feature Matrix ]
Following is a list of known transports (also called "providers") for Mule. Some functionality is contained
within modules instead of transports--see Using Mule Modules. For more information on transports, see
the following topics:
• About Transports
• Configuring a Transport
• Creating Transports
If you have created a transport for Mule and would like to share it with the Mule community, please
contact us.
Mule Transports
Transport Description
IMAP In-Only
IMAPS In-Only
Jetty In-
Only In-
Out In-
Optional-
Out
POP3 In-Only
POP3S In-Only
Servlet In-
Only In-
Out In-
Optional-
Out
SMTP Out-Only
SMTPS Out-Only
VM In- Out-Only
Only In- Out-
Out In- In Out-
Optional- Optional-
Out In
Heading Descriptions
BPM Transport
[ Features ] [ Usage ] [ Integration with BPM Engines ] [ Configuration ] [ Connector ]
The BPM transport allows Mule events to initiate and/or advance processes in a Business Process
Management System (BPMS), also known as a process engine. It also allows executing processes to
generate Mule events. For a high-level introduction to Business Process Management with Mule and the
concepts involved, see the presentation from MuleCon 2007.
To see the BPM Connector in action (with JBoss jBPM), take a look at the LoanBroker BPM example
(available in the full Mule distribution).
Features
• Incoming Mule events can launch new processes, advance or terminate running processes.
• A running process can generate synchronous or asynchronous Mule events.
• Endpoints of type "bpm://MyProcess" are used to intelligently route process-generated events within
Mule.
• Synchronous responses from Mule are automatically fed back into the running process.
• Mule can interact with different running processes in parallel.
BPEL
The connector can only integrate with BPM engines that provide a Java API. If you need to
integrate with a BPEL engine that only exposes SOAP endpoints (i.e., "a black box"), you
will need to use standard web services. For an example, see MULE and Oracle SOA BPEL
Integration.
Usage
bpm://ProcessType
bpm://ProcessType/ProcessID
bpm://MyBigProcess
bpm://MyBigProcess?processId=4561&action=advance
bpm://MyBigProcess/4561
bpm://MyBigProcess/4561?action=update
bpm://MyBigProcess/4561?action=abort
In a real system, you will most likely want to set the "processId" dynamically as a property
on the message.
These process variables may then be used to drive the logic of the running process.
The actual syntax for generating events from a running process will depend on the BPMS used.
Messages generated by a running process will be received by Mule on the best-matching endpoint
available. For example, suppose a Mule message is generated by the running process called
"MyBigProcess" with ID = 4561. The incoming message would preferably be received by this endpoint:
bpm://MyBigProcess/4561
bpm://MyBigProcess
bpm://*
The new message will then be routed from the component on which it is received (unless the
connector's allowGlobalDispatcher property is true). If the message is synchronous, the response will
automatically be sent back to the generating process.
Therefore, until such a specification ever emerges, the Mule BPM Transport simply defines its own.
// MessageService is a callback method used to generate Mule messages from your process.
public void setMessageService(MessageService msgService);
Any BPM engine that implements the interface ( org.mule.transport.bpm.BPMS ) can "plug in" to Mule via
the BPM transport. The JBoss jBPM engine is available with Mule.
For general information on jBPM and how to configure it, refer to http://docs.jboss.com/jbpm/v3/
userguide
The org.mule.transport.bpm.jbpm.Jbpm
class implements the BPMS interface for jBPM and must be set as the bpms property on your connector.
You can browse the rest of the Javadocs for Mule's jBPM integration here .
Configuration
The recommended way to configure jBPM with Mule is using Spring and Spring's jBPM Module
</mule>
If you want to configure jBPM without using Spring, you create the org.mule.transport.bpm.jbpm.Jbpm
wrapper based on your jBPM instance and set it as the bpms property on the BPM connector:
MuleManager.getInstance().registerConnector(connector);
<process-definition name="sendMessageProcess">
<start-state name="start">
<transition to="sendMessage" />
</start-state>
<state name="sendMessage">
<event type="node-enter">
<action class="org.mule.transport.bpm.jbpm.actions.SendMuleEvent">
<endpoint>file:///tmp</endpoint>
<payload>Message in a bottle.</payload>
<synchronous>false</synchronous>
</action>
</event>
<transition to="end" />
</state>
</process-definition>
The primary way of adding custom functionality to jBPM is via ActionHandlers. The BPM transport
provides a few such ActionHandlers, which are useful for integrating your jBPM process with Mule.
SendMuleEvent : Sends a Mule message to the specified endpoint. If the message is synchronous, the
response from Mule will be automatically stored in the "incoming" process variable.
StoreIncomingData : Stores the incoming message payload into the specified variable.
Configuration
Following is a simple configuration example:
<model name="bpm_example">
<!-- Messages sent to the process engine -->
<service name="ToBPMS">
<inbound>
<inbound-endpoint address="Incoming1"/>
<inbound-endpoint address="Incoming2"/>
</inbound>
<log-component/>
Message Properties
Connector
Attributes of <connector...>
CXF Transport
[ Introduction ] [ Features ] [ Using the CXF Transport ] [ Troubleshooting ] [ Suggested Reading ]
Introduction
The Mule CXF Transport provides support for web service integration via Apache CXF. Apache CXF is an
open source services framework that helps you build and develop services using front-end programming
APIs, like JAX-WS. These services can speak a variety of protocols such as SOAP, XML/HTTP, RESTful
HTTP, or CORBA and work over a variety of transports such as HTTP, JMS or JBI.
Features
The CXF transport is an evolution of the XFire transport, which was available with earlier versions of Mule.
The CXF transport includes the following features:
• Integrated Installer: CXF and XFire have some conflicting libraries and therefore cannot both be
deployed in the same instance of Mule. The Mule Enterprise installer allows you to install CXF when
you're installing Mule and handles all library changes for you. This is an enhancement over the
snapshot version of the CXF transport on MuleForge.
• Bookstore Example: A complete example of using the CXF transport to send complex objects.
• MTOM Support: The CXF transport supports SOAP Message Transmission Optimization Mechanism
(MTOM), which specifies an optimized method for sending binary data as part of a SOAP message.
• Complete Functional Tests: The functional tests have been converted from XFire to CXF.
Troubleshooting
This section includes common problems and solutions you might encounter when using the CXF transport.
The CXF outbound endpoint uses the CXF generated to client to send messages. Because of this, your
message payload must match the signature of the operation being invoked. This error results when the
payload does not match the signature.
My WSDL does not have the correct service address (i.e. its localhost instead of foo.com)
If you are doing WSDL-first development, ensure that your @WebService annotation on your service
implementation has the correct serviceName, targetNamespace, and portName attributes. If these are
not correct, CXF cannot navigate your WSDL, find the address, and replace it with the address currently
being used.
@WebService(serviceName = "YourServiceName",
portName = "YourPortName",
targetNamespace = "http://your-namespace",
endpointInterface = "your.endpoint.Interface",
wsdlLocation = "your.wsdl")
Suggested Reading
This page describes how to build a CXF web service and use it in Mule.
First, you write the service interface. For example, you could write an operation called "sayHello" that
says "Hello" to whoever submits their name.
package org.example;
import javax.jws.WebService;
@WebService
public interface HelloWorld {
String sayHi(String text);
}
package demo.hw.server;
import javax.jws.WebService;
@WebService(endpointInterface = "demo.hw.server.HelloWorld",
serviceName = "HelloWorld")
public class HelloWorldImpl implements HelloWorld {
If you go to "http://localhost:63081/hello?wsdl", you will see the WSDL that CXF generates for you.
If you want to use a POJO instead of creating a JAX-WS service, you could host the POJO as a service
component in Mule and use the simple front-end client with its CXF inbound endpoint. You would
configure the POJO as follows:
First, you generate your web service interface from your WSDL. You can do this using the WSDL to Java
tool from CXF or the Maven plugin.
Next, you write a service implementation class that implements your service interface. You can then use
this implementation class in the Mule configuration exactly as in the previous example.
You can supply your original WSDL to CXF by using the @WebService attribute:
WebService(endpointInterface = "demo.hw.server.HelloWorld",
serviceName = "HelloWorld",
wsdlLocation="foo/bar/hello.wsdl")
public class HelloWorldImpl implements HelloWorld
CXF is able to locate this WSDL inside your webapp, on the classpath, or on the file system.
1. AegisDatabinding
2. JAXBDatabinding (Default)
3. StaxDatabinding
<cxf:inbound-endpoint address="cxf:http://localhost:18080/mule/CxfService">
<cxf:databinding>
<spring:bean class="org.apache.cxf.aegis.databinding.AegisDatabinding"/>
</cxf:databinding>
</cxf:inbound-endpoint>
In the following example, the parameter style is set to BARE. This means that each parameter is placed
into the message body as a child element of the message root. This is WRAPPED by default.
@SOAPBinding(style=SOAPBinding.Style.DOCUMENT,
use=SOAPBinding.Use.LITERAL,
parameterStyle=SOAPBinding.ParameterStyle.BARE)
@WebService
public interface Echo
{
String echo(String src);
}
Table of Contents
• CXF Transport
• ° Connector
° - Attributes of <connector...>
° Inbound endpoint
° - Attributes of <inbound-endpoint...>
° Outbound endpoint
° - Attributes of <outbound-endpoint...>
° Endpoint
° - Attributes of <endpoint...>
° Features
° Wrapper component
° - Attributes of <wrapper-component...>
° Stax
CXF Transport
Apache CXF is an open source services framework. CXF helps you build and develop services using
frontend programming APIs, like JAX-WS. These services can speak a variety of protocols such as SOAP,
XML/HTTP, RESTful HTTP, or CORBA and work over a variety of transports such as HTTP, JMS or JBI.
The Mule CXF Transport is an evolution of Mule's XFire Transport which provides support for the use of
web service integration via Apache CXF. The Mule CXF connector also provides support for WS-Security,
WS-Addressing and WS-Reliable-Messaging.
Connector
Attributes of <connector...>
initializeStaticBusInstance
boolean no Initialize the static
CXF Bus with a
Bus configured to
use Mule for all
transports. This
Inbound Endpoint
Attributes of <inbound-endpoint...>
applyTransformersToProtocol
boolean no Whether or not
to apply the
transformers
to the protocol
endpoint.
Outbound Endpoint
Attributes of <outbound-endpoint...>
Endpoint
Attributes of <endpoint...>
applyTransformersToProtocol
boolean no Whether or not
to apply the
transformers
to the protocol
endpoint.
applySecurityToProtocol
boolean no Whether or not
to apply the
security filter
to the protocol
endpoint.
Features
Wrapper Component
The WebServiceWrapperComponent class allows you to send
the result of a web service call to another endpoint.
Attributes of <wrapper-component...>
Attributes of <stax...>
xmlInputFactory string no
xmlOutputFactory string no
Enabling WS-Addressing
To enable your services to use WS-Addressing, you must supply an additional configuration file to the CXF
connector to tell it to enable WS-Addressing on your service and/or client.
Next, you create a configuration file using the same name as the value you specified in the connector's
configurationLocation property. This file will look something like this:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:c="http://cxf.apache.org/core"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:wsa="http://cxf.apache.org/ws/addressing"
xmlns:http="http://cxf.apache.org/transports/http/configuration"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-
beans.xsd
http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
http://cxf.apache.org/ws/addressing http://cxf.apache.org/schemas/ws/addressing.xsd
http://cxf.apache.org/transports/http/configuration http://cxf.apache.org/schemas/configuration/
http-conf.xsd">
</beans>
CXF looks through this Spring configuration file and applies the properties to your clients and servers. It
uses the name attribute of the <server> or <client> to determine which service to apply these properties
to. In the above example, it is enabling the WS-Addressing feature on any service that has a port name
of "{http://example.org/}HelloWorldPort". You can determine your service's port name by looking at the
WSDL and looking for the <wsdl:port/> element. The value in the brackets ({}) are the targetNamespace
of your WSDL. The value after the brackets will are the "name" attribute on the <port> element.
To manipulate the WS-Addressing headers inside the messages, you can write a JAX-WS handler or a CXF
interceptor. For a quick start, see the WS-Addressing sample inside the CXF distribution.
Enabling WS-Security
This page describes how to configure a client and service to use WS-Security. You should already have a
basic client and server running. For further information on how to configure WS-Security with CXF, you
should consult the CXF documentation which goes into more detail on how to configure the CXF service
interceptors.
UsernameToken Scenario
The UsernameToken feature in WS-Security is an interoperable way to exchange security tokens inside
a SOAP message. The following section describes how to configure the client and server to exchange a
username/password security token.
Server Configuration
You configure the server in the Mule configuration file. Following is an example:
<service name="greeterService">
<inbound>
<cxf:inbound-endpoint address="http://localhost:63081/services/greeter">
<cxf:inInterceptors>
<spring:bean class="org.apache.cxf.binding.soap.saaj.SAAJInInterceptor" />
<spring:bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
<spring:constructor-arg>
<spring:map>
<spring:entry key="action" value="UsernameToken" />
<spring:entry key="passwordCallbackRef" value-ref="serverCallback" />
</spring:map>
</spring:constructor-arg>
</spring:bean>
</cxf:inInterceptors>
</cxf:inbound-endpoint>
</inbound>
<component>
<singleton-object class="org.apache.hello_world_soap_http.GreeterImpl" />
</component>
</service>
The <cxf:inInterceptors> element configures the incoming interceptors on the service. The
WSS4JInInterceptor performs the security operations on the incoming SOAP message. The
"action" parameter controls which actions it performs on the incoming message - in this case the
"UsernameToken" action specifies that it will verify the username token via a specified password callback.
The password callback is specified by the "passwordCallbackRef" property, which is detailed in the next
section. The SAAJInInterceptor is also installed here. It enables the use of SAAJ, an in-memory DOM
document format, which is required by WSS4J.
Server callbacks verify passwords by supplying the password with which the incoming password will be
compared.
import java.io.IOException;
import javax.security.auth.callback.Callback;
import org.apache.ws.security.WSPasswordCallback;
if (pc.getIdentifer().equals("joe")) {
// set the password on the callback. This will be compared to the
// password which was sent from the client.
pc.setPassword("password");
}
}
}
This allows you to write custom code which can load and compare passwords from custom backends,
such as databases or LDAP.
Client Configuration
<cxf:outbound-endpoint address="http://localhost:63081/services/greeter"
name="clientEndpoint"
clientClass="org.apache.hello_world_soap_http.SOAPService"
wsdlPort="SoapPort"
wsdlLocation="classpath:/wsdl/hello_world.wsdl"
operation="greetMe">
<cxf:outInterceptors>
<spring:bean class="org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor" />
<spring:bean class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">
<spring:constructor-arg>
<spring:map>
<spring:entry key="action" value="UsernameToken" />
<spring:entry key="user" value="joe" />
<spring:entry key="passwordType" value="PasswordDigest" />
<!-- The callback supplies the password so its not stored in our config file -->
<spring:entry key="passwordCallbackRef" value-ref="clientCallback" />
</spring:map>
</spring:constructor-arg>
</spring:bean>
</cxf:outInterceptors>
</cxf:outbound-endpoint>
Note: if your client and your server are on separate machines, you create two separate files and then a
CXF connector configuration on each one.
Following is a simple example client password callback that sets the password to use for the outgoing
invocation:
import java.io.IOException;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;
import org.apache.ws.security.WSPasswordCallback;
While many times you can proxy web services without using CXF (for instance, by forwarding requests
from one HTTP endpoint to another), there are several cases where you might want to use CXF proxies:
Server-side Proxying
To proxy a web service so you can work with the raw XML, you can create a simple inbound endpoint:
This will make the SOAP body available as the Mule message payload as an XMLStreamReader.
Client-side Proxying
Similarly, you can create an outbound endpoint to send raw XML payloads:
<cxf:outbound-endpoint address="http://localhost:63081/services/Echo"
proxy="true"/>
<service name="routeBasedOnSoapAction">
<inbound>
<cxf:inbound-endpoint address="http://localhost:63081/service" proxy="true"/>
</inbound>
<outbound>
<filtering-router>
<cxf:outbound-endpoint address="http://localhost:63081/services/Echo"
proxy="true"
remoteSync="true"/>
<message-property-filter pattern="SOAPAction=http://acme.com/v2/bid"/>
</filtering-router>
<filtering-router>
<cxf:outbound-endpoint address="http://localhost:63081/services/Echo"
proxy="true"
remoteSync="true">
Next, you configure the client as an outbound endpoint using the following properties:
<service name="csvPublisher">
<inbound>
<inbound-endpoint address="file://./books?pollingFrequency=100000&autoDelete=false"/>
</inbound>
<component class="org.mule.example.bookstore.publisher.CsvBookPublisher"/>
<outbound>
<outbound-pass-through-router>
<cxf:outbound-endpoint
address="http://localhost:63081/services/greeter"
clientClass="org.apache.hello_world_soap_http.SOAPService"
wsdlPort="SoapPort"
wsdlLocation="classpath:/wsdl/hello_world.wsdl"
operation="greetMe"/>
</outbound-pass-through-router>
</outbound>
</service>
There are two ways to use CXF clients. First, you can generate a client from WSDL using the CXF WSDL
to Java tool. Second, if you've built your service via "code-first" methodologies, you can use the service
interface to build a client proxy object.
When using a CXF client, it automatically discovers the Mule instance (provided you're in the same JVM/
Classloader) and uses it for your transport. Therefore, if you've generated a client from WSDL, invoking a
service over Mule can be as simple as the following:
// Endpoint Address
String endpointAddress = http://localhost:63081/hello";
HelloWorld hw = service.getPort(HelloWorld.class);
System.out.println(hw.sayHi("World"));
Additional Resources
• Developing a JAX-WS consumer
• WSDL to Java
• CXF Maven plugin
http://host/service/OPERATION/PARAM_NAME/PARAM_VALUE
For example:
@WebService(endpointInterface = "org.mule.samples.echo.components.EchoService",
serviceName = "echo")
public class EchoComponent implements EchoService
{
public String echo(String string)
{
return string;
}
}
http://localhost:65081/services/EchoUMO/echo/string/hello
This will send the value "hello" for the string parameter to the echo() method.
Using MTOM
This page is ready for review
This page describes the basics of how to use MTOM inside your service. For more information, go to the
MTOM documentation for CXF. Portions of the examples on this page are from that guide.
Normally, when you are transferring binary data, you write a schema type like this:
To tell CXF to treat this binary type as an attachment, you must add an xmime:expectedContentTypes
attribute to it:
<schema targetNamespace="http://mediStor.org/types/"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:xmime="http://www.w3.org/2005/05/xmlmime">
This command generates a server stub. If the base64Binary type is an argument to one of your
operations, CXF will generate a method like this:
You can use this DataHandler method to access the attachment data by calling
"handler.getInputStream();".
<service name="mtomService">
EJB Transport
The EJB transport allows EJB session beans to be invoked as part of an event flow. Components can be
given an EJB outbound endpoint, which will invoke the remote object and optionally return a result.
Connector
The Mule EJB Connector provides connectivity for EJB beans.
Attributes of <connector...>
For example:
• registry host
• registry port
• remote home name
• remote method name
These values will be used to establish the dispatcher connection. For example:
If the remoteMethod can take one or more input arguments, you configure them on the endpoint as
list properties. A recommended approach is to use a list of comma-separated values in the property
methodArgumentTypes.
<properties>
<list name="methodArgumentTypes">
<entry value="java.lang.String,java.lang.String,java.math.BigInteger"/>
</list>
</properties>
Multiple arguments are passed in as an array of objects as the payload of the Mule event.
Transformers
There are no specific transformers required for EJB.
Email Transport
This page is ready for review
Protocols
Each email protocol has a dedicated transport and configuration schema. The transports can be used to
connect to POP3 and IMAP mailboxes and for sending events over SMTP using the javax.mail API. For
each of the protocols, SSL is supported and is enabled using POP3S, IMAPS, and SMTPS.
The email connectors can be used to send and receive event payloads over Mail protocols and support
protocol features such as attachments, replyTo, CC and BCC addresses, binary content types, and custom
headers.
For information about configuring specific endpoints, see the following links:
Filters
Filters can be set on an endpoint to filter out any unwanted messages. The Email transport provides a
couple of filters that can either be used directly or extended to implement custom filtering rules.
Filter Description
org.mule.transport.email.filters.MailSubjectRegExFilter
Applies a regular expression to a Mail Message
subject.
Transformers
These are transformers specific to this transport. Note that these are added automatically to the Mule
registry
at start up. When doing automatic transformations these will be included when searching for the correct
transformers.
Name Description
File Transport
The File transport allows files to be read and written to and from directories on the local file system. The
connector can be configured to filter the file it reads and the way files are written, such as whether binary
output is used or the file is appended.
Connector
The File connector configures the default behavior for File endpoints that reference the connector. If there
is only one File connector configured, all File endpoints will use that connector.
Attributes of <connector...>
Attributes of <inbound-endpoint...>
Outbound Endpoint
Attributes of <outbound-endpoint...>
Endpoint
Attributes of <endpoint...>
Transformers
These are transformers specific to this transport. Note that these are added automatically to the Mule
registry
at start up. When doing automatic transformations these will be included when searching for the correct
transformers.
Name Description
Filters
Filters can be used on inbound endpoints to control which data is received by a service.
Name Description
<file:filename-wildcard-filter
pattern="*.txt,*.xml"/>
Filename Parsers
The filenameParser is set on the connector used when writing files to a directory. The parser will
convert the outputPattern attribute to a string using the parser and the current message.
${xpath:/message/header/@id}
This parser superseeds the legacy-filename-parser from previous releases of Mule. The following
demonstrates how to achieve the same results when using the expression-filename-parser over the
legacy-filename-parser.
• ${DATE} : ${function:dateStamp}
• ${DATE:yy-MM-dd} : ${function:dateStamp(yy-MM-dd)}
• ${SYSTIME} : ${function:systime}
• ${UUID} : ${function:uuid}
• ${ORIGINALNAME} : ${header:originalFilename}
Attributes of <custom-filename-parser...>
file://<path>[MULE:?params]
Unix
file:///temp/files
Note the extra slash to denote a path from the root (absolute path).
Windows
file:///C:/temp/files
The Unix style will still work in Windows if you map to a single drive (the one Mule was started from).
file://./temp
or
file://temp
Note only two slashes are used for the protocol, so it's a relative path.
or
file://?address=./temp
file:////192.168.0.1/temp/
Table of Contents
• Connector
• ° Attributes of <connector...>
° Child Elements of <connector...>
° Mule Enterprise Connector Attributes
• Endpoint
• ° Attributes of <endpoint...>
• Inbound Endpoint
• ° Attributes of <inbound-endpoint...>
• Outbound Endpoint
• ° Attributes of <outbound-endpoint...>
Connector
The FTP connector is used to configure the default behavior for FTP endpoints that reference the
connector. If there is only one FTP connector configured, all FTP endpoints will use that connector.
Attributes of <connector...>
connectionFactoryClass
class name no A class that
extends
FtpConnectionFactory.
The
FtpConnectionFactory
is responsible
for creating a
connection to
the server using
the credentials
provided by
the endpoint.
The default
implementation
supplied with
Mule uses the
Commons Net
project from
Apache.
The following attributes are available on the FTP connector in Mule Enterprise only (as of version 1.6):
Endpoint
Attributes of <endpoint...>
Inbound Endpoint
Attributes of <inbound-endpoint...>
Outbound Endpoint
Attributes of <outbound-endpoint...>
ftp://<username>:<password>@<hostname[MULE::port]>/[MULE:address]
ftp://joe:[email protected]/~
This URI would connect to the FTP server at mycompany.com with a user name of joe with password
123456 and would work on Joe's home directory.
When including the user name and password in the endpoint, escape any characters
that are illegal for URIs, such as the @ character. For example, if the user name is
[email protected], you should enter it as user%40myco.com.
Property Overrides
You can override certain properties when defining FTP endpoints to control the endpoint's configuration.
These properties can be set on the endpoint or the current message (see the appropriate endpoint
attributes).
ftp://joe:[email protected]/ftp/done?outputPattern=FtpFile-${DATE}.done
Table of Contents
• HTTP Transport
• ° Connector
° - Attributes of <connector...>
° Inbound Endpoint
° - Attributes of <inbound-endpoint...>
° Outbound Endpoint
° - Attributes of <outbound-endpoint...>
° Endpoint
° - Attributes of <endpoint...>
° Transformers
° Polling Connector
° - Attributes of <polling-connector...>
° Rest Service Component
° - Attributes of <rest-service-component...>
- Child Elements of <rest-service-component...>
° Security
° - Sending Credentials
° Cookies
° Polling HTTP Services
° Handling HTTP Content-Type and Encoding
° - Sending HTTP
- Receiving HTTP
° Including Custom Header Properties
° Getting a Hash Map of Properties
HTTP Transport
The HTTP transport provides support for exposing services over HTTP and making HTTP client requests
from Mule services to external services as part of service event flows. Mule supports inbound, outbound,
and polling HTTP endpooints. These endpoints support all common features of the HTTP spec, such as
ETag processing, cookies, and keepalive. Both HTTP 1.0 and 1.1 are supported.
Connector
Allows Mule to communicate over HTTP. All parts of the HTTP spec are covered by Mule, so you can
expect ETags to be honored as well as keep alive semantics and cookies.
Attributes of <connector...>
Inbound Endpoint
An inbound HTTP endpoint exposes a service over HTTP, essentially making it an HTTP server. If polling of
a remote HTTP service is required, this endpoint should be configured with a polling HTTP connector.
Attributes of <inbound-endpoint...>
Outbound Endpoint
The HTTP outbound endpoint allows Mule to send requests to external servers or Mule inbound HTTP
endpoints using the HTTP protocol.
Endpoint
Configures a 'global' HTTP endpoint that can be referenced by services. Services can augment the
configuration defined in the global endpoint with local configuration elements.
Attributes of <endpoint...>
Transformers
These are transformers specific to this transport. Note that these are added automatically to the Mule
registry
at start up. When doing automatic transformations these will be included when searching for the correct
transformers.
Name Description
Polling Connector
Allows Mule to poll an external HTTP server and generate events from the result. This is useful for pull-
only web services.
Attributes of <polling-connector...>
<inbound-endpoint address="http://localhost:4567">
<acegi:http-security-filter realm="mule-realm" />
</inbound-endpoint>
You must configure the security manager on the Mule instance against which this security filter will
authenticate. For information about security configuration options and examples, see Configuring
Security.
If you want to make an HTTP request that requires authentication, you can set the credentials on the
endpoint:
<inbound-endpoint address="user:[email protected]/secure">
<acegi:http-security-filter realm="mule-realm" />
</inbound-endpoint>
Sending Credentials
If you want to make an HTTP request that requires authentication, you can set the credentials on the
endpoint:
http://user:[email protected]/secure
Cookies
If you want to send cookies along on your outgoing request, simply configure them on the endpoint:
To configure the HTTP Polling receiver, you include an HTTP polling-connector configuration in your Mule
configuration:
Sending HTTP
The following behavior applies when sending POST request bodies as a client and when returning a
response body:
Receiving HTTP
When receiving HTTP responses, the payload of the MuleMessage will always be the InputStream of the
HTTP response.
If you do want to include HTTP headers, you can specify them using the http.custom.headers map
property as follows:
<outbound>
<outbound-pass-through-router>
<outbound-endpoint address="http://localhost:9002/events" connector-ref="HttpConnector">
<properties>
<spring:entry key="http.custom.headers">
<spring:map>
<spring:entry key="Content-Type" value="image/png"/>
<spring:entry key="Accept" value="*.*"/>
</spring:map>
</spring:entry>
</properties>
</outbound-endpoint>
</outbound-pass-through-router>
</outbound>
For example:
<http:inbound-endpoint ...>
<custom-transformer name="myTransformer"
class="org.mule.transport.http.transformers.HttpRequestBodyToParamMap" />
</http:inbound-endpoint>
HTTPS Transport
[ HTTPS Connector ] [ Polling Connector ] [ HTTPS Endpoints ]
The Secure HTTP transport provides support for exposing services over HTTP and making HTTP client
requests from Mule services to external services as part of service event flows. Mule supports secure
inbound, secure outbound, and secure polling HTTP endpoints. These endpoints support all common
features of the HTTP spec, such as ETag processing, cookies, and keepalive. Both HTTP 1.0 and 1.1 are
supported.
HTTPS Connector
This connector provides Secure HTTP connectivity on top of what is already provided with the Mule HTTP
Transport. Secure connections are made on behalf of an entity, which can be anonymous or identified by
a certificate. The key store provides the certificates and associated private keys necessary for identifying
the entity making the connection. Additionally, connections are made to trusted systems. The public
certificates of trusted systems are stored in a trust store, which is used to verify that the connection
made to a remote system matches the expected identity.
Property Description
For example:
<https:connector name="httpConnector">
<https:tls-client path="clientKeystore" storePassword="mulepassword" />
<https:tls-key-store path="serverKeystore" keyPassword="mulepassword" storePassword="mulepassword"
/>
<https:tls-server path="trustStore" storePassword="mulepassword" />
</https:connector>
<https:endpoint name="clientEndpoint" host="localhost" port="60202" synchronous="true" connector-
ref="httpConnector" />
Polling Connector
The polling connector allows Mule to poll an external HTTP server and generate events from the
result. This is useful for pull-only web services. This connector provides a secure version of the
PollingHttpConnector. It includes all the properties of the HTTPS connector plus the following optional
attributes:
Attribute Description
For example:
An outbound HTTPS endpoint allows Mule to send requests securely using SSL to external servers or Mule
inbound HTTP endpoints using HTTP over SSL protocol.
A global HTTPS endpoint can be referenced by services. Services can augment the configuration defined
in the global endpoint with local configuration elements.
IMAP Transport
The IMAP transport can be used for receiving messages from IMAP inboxes using the javax.mail API.
The IMAPS Transport uses secure connections over SSL/TLS. The IMAP transport uses the same filters
and transformers as the Email Transport.
IMAP Connector
The IMAP connector is identical to the Email connector.
Endpoints
IMAP and IMAPS endpoints include details about connecting to a IMAP mailbox. You configure the
endpoints just as you would with any other transport, with the following additional attributes:
For example:
or for IMAPS:
This will log into the bob mailbox on localhost on port 65433 using password password and will check
the mailbox for new messages every 30 seconds.
When including the user name and password in the endpoint, escape any characters
that are illegal for URIs, such as the @ character. For example, if the user name is
[email protected], you should enter it as user%40myco.com.
IMAPS Transport
TLS/SSL connections are made on behalf of an entity, which can be anonymous or identified by a
certificate. The key store provides the certificates and associated private keys necessary for identifying
the entity making the connection. Additionally, connections are made to trusted systems. The public
certificates of trusted systems are stored in a trust store, which is used to verify that the connection
made to a remote system matches the expected identity.
The IMAPS connector enables IMAP over SSL using the javax.mail APIs. It supports all the elements and
attributes of the IMAP connector plus some required properties for setting up the client key store and the
trust store for the SSL connection.
Property Description
For example:
<imaps:connector name="imapsConnector">
<imaps:tls-client path="clientKeystore" storePassword="mulepassword" />
<imaps:tls-trust-store path="greenmail-truststore" storePassword="password" />
</imaps:connector>
<model name="test">
<service name="relay">
<inbound>
<imaps:inbound-endpoint user="bob" password="password" host="localhost" port="65436" />
</inbound>
...
For information on configuring endpoints using the IMAPS connector, see IMAP Transport.
The IMAPS transport supports the same filters and transformers as the Email transport.
JDBC Transport
[ Introduction ] [ Features ] [ Transactions ] [ API Documentation and Notes ] [ Runnable Examples ] [
Performance Results ]
Introduction
The JDBC Transport allows you to send and receive messages with a database using the JDBC protocol.
Common usage includes retrieving, inserting, updating, and deleting database records, as well as
invoking stored procedures.
Some features are available only with the Mule Enterprise version of the JDBC transport, which is
available with version 1.6 and later of Mule Enterprise Edition. These EE-only features are noted below.
Features
The Mule Enterprise JDBC Transport provides key functionality, performance improvements, transformers,
and examples not available in the Mule Community edition. The following table summarizes the feature
differences.
When using JDBC EE features, you will need to import the EE namespace for the JDBC transport (http://
www.mulesource.com/schema/mule/jdbc-ee/2.0). For example:
<mule
xmlns:jdbc="http://www.mulesource.com/schema/mule/jdbc/2.0"
xsi:schemaLocation="http://www.mulesource.com/schema/mule/jdbc/2.0 http://www.mulesource.com/
schema/mule/jdbc/2.0/mule-jdbc-ee.xsd">
If you are not using JDBC EE features, then you can stick with the normal CE namespace:
<mule
xmlns:jdbc="http://www.mulesource.org/schema/mule/jdbc/2.0"
xsi:schemaLocation="http://www.mulesource.org/schema/mule/jdbc/2.0 http://www.mulesource.org/
schema/mule/jdbc/2.0/mule-jdbc.xsd">
Inbound SELECT queries are queries that are executed periodically (according to the pollingInterval
set on the connector).
Here is an example:
Inbound SELECT queries are limited because (1) generally, they cannot be called synchronously
(unnamed queries are an exception), and (2) they do not support runtime parameters.
Overview
Large dataset retrieval is a strategy for retrieving large datasets by fetching records in smaller, more
manageable batches. Mule Enterprise Edition provides the key components and transformers needed to
implement a wide range of these strategies.
When To Use It
• When the dataset to be retrieved is large enough to overwhelm memory and connection resources.
• When preserving the order of messages is important.
• When resumable processing is desired (that is, retrieval of the dataset can pick up where it left off,
even after service interruption).
• When load balancing the data retrieval among clustered Mule nodes.
How It Works
Large dataset retrieval does not use conventional inbound SELECT queries to retrieve data. Instead, it
uses a Batch Manager component to compute ID ranges for the next batch of records to be retrieved. An
outbound SELECT query uses this range to actually fetch the records. The Batch Manager also controls
Important Limitations
1. The source data contains a unique, sequential numeric ID. Records should also be fetched in
ascending order with respect to this ID.
2. There are no large gaps in these IDs (no larger than the configured batch size).
Combining large dataset retrieval with batch inserts can support simple but powerful ETL use cases. See
Example #4 and JDBC Transport Performance Benchmark Results for more details on how Mule can be
used to transport millions of records an hour from one database table to another.
ACK statements are optional SQL statements that are paired with inbound SELECT queries. When an
inbound SELECT query is invoked by Mule, the ACK statement is invoked for each record returned by
the query. Typically, the ACK statement is an UPDATE, INSERT, or DELETE.
Continuing the inbound SELECT query example above, the ACK statement would be configured as follows:
...
<jdbc:connector name="jdbcConnector" pollingFrequency="10000" dataSource-ref="jdbcDataSource">
<jdbc:query key="selectLoadedMules"
value="SELECT ID, MULE_NAME, RANCH, COLOR, WEIGHT, PROCESSED from mule_source where ID between 0
and 20"/>
<jdbc:query key="selectMules.ack"
value="update mule_source set PROCESSED='Y' where ID = #[map-payload:ID] "/>
</jdbc:connector>
...
Notice the convention of appending an ".ack" extension to the query name. This convention lets Mule
know which inbound SELECT query to pair with the ACK statement.
Also, note that the ACK statement supports parameters. These parameters are bound to any of the
column values from the inbound SELECT query (such as #[ID] in the case above).
ACK statements are useful when you want an inbound SELECT query to retrieve records from a source
table no more than once. Be careful, however, when using ACK statements with larger result sets. As
mentioned earlier, an ACK statement gets issued for each record retrieved, and this can be very resource-
intensive for even a modest number of records per second (> 100).
SQL INSERT, UPDATE, and DELETE statements are specified on outbound endpoints. These statements
are typically configured with parameters, which are bound with values passed along to the outbound
endpoint from an upstream component.
Basic statements execute just one statement at a time, as opposed to batch statements, which execute
multiple statements at a time. Basic statements are appropriate for low-volume record processing
(<20 records per second), while batch statements are appropriate for high-volume record processing
(thousands of records per second).
For example, when a message with a java.util.Map payload is sent to a basic insert/update/delete
endpoint, the parameters in the statement are bound with corresponding entries in the Map. In the
See
As mentioned above, batch statements represent a significant performance improvement over their
basic counterparts. Records can be inserted at a rate of thousands per second with this feature.
Usage of batch INSERT, UPDATE, and DELETE statements is the same as for basic statements, except the
payload sent to the VM endpoint should be a List of Maps, instead of just a single Map.
Examples #1 and #4 demonstrate this feature. Batch statements are available in Mule Enterprise Edition
only.
Batch Callable Statements are also supported. Usage is identical to Batch Insert/Update/Delete.
Common integration use cases involve moving CSV and XML data from files to databases and back. This
section describes the transformers that perform these actions. These transformers are available in Mule
Enterprise Edition only.
XML-JDBC Transformer
The XML Transformer converts between XML and JDBC-format Maps. The JDBC-format Maps can be used
by JDBC outbound endpoints (for select, insert, update, or delete operations).
Transformer Details:
Also, the XML message payload (passed in or out as a String) must adhere to a particular schema format:
<table>
<record>
<field name="id" type="java.math.BigDecimal">0</field>
<field name="name" type="java.lang.String">hello</field>
</record>
</table>
The transformer converts each "record" element to a Map of column/value pairs using "fields". The
collection of Maps is returned in a List.
See Example #2, which uses the XML Transformer to convert results from a database query into an XML
document.
CSV-JDBC Transformer
The CSV Transformer converts between CSV data and JDBC-format Maps. The JDBC-format Maps can be
used by JDBC outbound endpoints (for select, insert, update, or delete operations).
Transformer Details:
The following table summarizes the properties that can be set on this transformer:
Property Description
For an example, see Example #1, which uses the CSV Transformer to load data from a CSV file to a
database table.
An inbound SELECT query is invoked on an inbound endpoint according to a specified polling interval. A
major improvement to the inbound SELECT query is the outbound SELECT query, which can be invoked
on an outbound endpoint. As a result, the outbound SELECT query can do many things that the inbound
SELECT query cannot, such as:
1. Support synchronous invocation of queries. For example, you can implement the classic use case of
a web page that serves content from a database using an HTTP inbound endpoint and an outbound
SELECT query endpoint.
2. Allows parameters so that values can be bound to the query at runtime. This requires that the
message contain a Map payload containing key names that match the parameter names. For
example, the following configuration could be used to retrieve an outbound SELECT query:
...
<jdbc:connector name="jdbcConnector" dataSource-ref="jdbcDataSource">
<jdbc:query key="selectMules"
value="select * from mule_source where ID between 0 and #[map-payload:ID]"/>
</jdbc:connector>
...
<model name="ExampleModel">
<service name="selectOutboundExample">
<inbound>
<inbound-endpoint address="vm://mapReceiver"/>
</inbound>
<outbound>
<outbound-pass-through-router>
<jdbc:outbound-endpoint queryKey="selectMules"/>
</outbound-pass-through-router>
</outbound>
</service>
</model>
key=ID
value=3
See Examples #2 and #3 for further outbound SELECT query examples. Note that this feature is
available in Mule Enterprise Edition only.
Like any other query, stored procedure queries can be listed in the "queries" map. Following is an
example of how stored procedure queries could be defined:
To denote that we are going to execute a stored procedure and not a simple SQL query, we must start off
the query by the text CALL followed by the name of the stored procedure.
Parameters to stored procedures can be forwarded by either passing static parameters in the
configuration or using the same syntax as for SQL queries. For example:
...
<outbound-pass-through-router>
<jdbc:outbound-endpoint queryKey="storedProc1"/>
</outbound-pass-through-router>
...
<outbound-pass-through-router>
<jdbc:outbound-endpoint address="jdbc://storedProc2?value=25"/>
</outbound-pass-through-router>
...
Mule Enterprise Edition provides advanced stored procedure support not available in Mule Community
Edition. This section describes the advanced support.
OUT Parameters
In Mule Enterprise, you can execute your stored procedures with out and inout scalar parameters. The
syntax for such parameters is:
You must specify the type of each output parameter (OUT, INOUT) and its data type (int, string, etc.).
The result of such stored procedures is a map containing (out parameter name, value) entries.
For Oracle databases only, an OUT parameter can return a cursor. The following example shows how this
works.
If you want to handle the cursor by fetching the java.sql.ResultSet to a collection of Map objects,
see the "cursorOutputAsMaps" service below, which uses both the "MapLookup" and "ResultSet2Maps"
transformers to achieve this result.
<jdbc:resultset-to-maps-transformer name="ResultSet2Maps"/>
<model name="SPModel">
<service name="cursorOutputAsMaps">
<inbound>
<vm:inbound-endpoint path="returns.maps" responseTransformer-refs="MapLookup ResultSet2Maps"/>
</inbound>
<outbound>
<outbound-pass-through-router>
<jdbc:outbound-endpoint queryKey="SingleCursor"/>
</outbound-pass-through-router>
</outbound>
</service>
<service name="cursorOutputAsResultSet">
<inbound>
<vm:inbound-endpoint path="returns.resultset" responseTransformer-refs="MapLookup"/>
</inbound>
<outbound>
<outbound-pass-through-router>
<jdbc:outbound-endpoint queryKey="SingleCursor"/>
</outbound-pass-through-router>
</outbound>
</service>
</model>
In the above example, note that it is also possible to call a function that returns a cursor ref. For
example, if TEST_CURSOR2() returns a cursor ref, the following statement could be used to get that
cursor as a ResultSet:
Important note on transactions: When calling stored procedures or functions that return
cursors (ResultSet), it is recommended that you process the ResultSet within a transaction.
Unnamed Queries
SQL statements can also be executed without configuring queries in the Mule configuration file. For a
given endpoint, the query to execute can be specified as the address of the URI.
You can use any JDBC data source library with the JDBC Connector. The "myDataSource" reference below
refers to a DataSource bean created in Spring:
You can also create a JDBC connection pool so that you don't create a new connection to the database for
each message. You can easily create a pooled data source in Spring using xapool. The following example
shows how to create the Spring bean right in the Mule configuration file.
If you need more control over the configuration of the pool, you can use the standard JDBC classes. For
example, you could create the following beans in the Spring configuration file (you could also create them
in the Mule configuration file by prefixing everything with the Spring namespace):
//create a poolable connection factory based on the above pool and connection factory
<bean id="poolableConnectionFactory" class="org.apache.commons.dbcp.PoolableConnectionFactory">
<constructor-arg index="0"><ref bean="dsConnectionFactory"/></constructor-arg>
<constructor-arg index="1"><ref bean="pool"/></constructor-arg>
<constructor-arg index="2"><null/></constructor-arg>
<constructor-arg index="3"><null/></constructor-arg>
<constructor-arg index="4"><value>false</value></constructor-arg>
<constructor-arg index="5"><value>true</value></constructor-arg>
</bean>
//create pooling data source based on the poolable connection factory and pool
<bean id="pooledDS" class="org.apache.commons.dbcp.PoolingDataSource" depends-
on="poolableConnectionFactory">
<constructor-arg><ref bean="pool"/></constructor-arg>
</bean>
You could then reference the pooledDS bean in your Mule configuration:
To retrieve the data source from a JNDI repository, you would configure the connector as follows:
<spring:beans>
<jee:jndi-lookup id="myDataSource" jndi-name="yourJndiName" environment-ref="yourJndiEnv" />
<util:map id="jndiEnv">
<spring:entry key="java.naming.factory.initial" value="yourJndiFactory" />
</util:map>
</spring:beans>
<mule xmlns="http://www.mulesource.org/schema/mule/core/2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:spring="http://www.springframework.org/schema/beans"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:jdbc="http://www.mulesource.org/schema/mule/jdbc/2.0"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-
beans-2.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-
jee-2.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-
util-2.0.xsd
http://www.mulesource.org/schema/mule/core/2.0 http://www.mulesource.org/schema/mule/core/2.0/
mule.xsd
http://www.mulesource.org/schema/mule/jdbc/2.0 http://www.mulesource.org/schema/mule/jdbc/2.0/mule-
jdbc.xsd">
Transactions
Transactions are supported on JDBC Endpoints. See Transaction Management for details.
Connector Properties
SQL queries are used by endpoints and should be configured on the connector using the "query" element:
The queries can be parameterized using the #[...] pattern that follows the Expression Evaluation
Framework.
Runnable Examples
For examples of using the Mule Enterprise version of the JDBC transport, see JDBC Transport Examples.
Performance Results
For information on performance testing on the Mule Enterprise version of the JDBC transport, see JDBC
Transport Performance Benchmark Results.
Setup
The Mule Enterprise JDBC Examples are located in your installation at $MULE_HOME/examples/jdbc.
2. Run the examples using the "jdbc.bat" or "jdbc" shell script provided in this directory. After running the
script, you will see the following:
$ ./jdbc.bat
Examples require that you set up your database first. See README for more details.
After your database is set up, choose one of the following examples to run:
1. Mules are born. Read in 50 baby mules from a CSV File and create records in mule_source table.
2. View Mules. Generate an XML report of Mules. (http://localhost:8080/first20)
3. Clone Mules. Clone mules using a Stored Procedure. (http://localhost:8080/clone)
4. Retire Mules. Send mules to a retirement ranch (a.k.a the mule_target table).
5. Cleanup Mules. Reset tables to run examples again (http://localhost:8080/cleanup).
Select the one you wish to execute and press Enter...
Configuration
See conf/jdbc-csv.xml
Features Used
This example uses the CSV Transformer to convert the CSV file into JDBC-format Maps and inserts these
records into the database using a batch INSERT.
To run the example, choose option "1" after starting the Mule server. When the server starts, Mule will
immediately load all the records.
To verify that the example loaded correctly, use your favorite database tool to see that there were 50
records inserted into the mule_source table.
COUNT(1)
----------
If you want to run the example again, first delete the records from mule_source.
Configuration
See conf/jdbc-xml-report.xml
Features Used
This example uses an outbound SELECT query to synchronously query the database. The results are
transformed into XML using the XML transformer.
Start the Mule server and choose Example 2. Then, enter the URL http://localhost:8080/first20 into your
web browser. You should see the first 20 mule records presented in XML format.
The following example assumes that you are using an Oracle database. However, you can
adapt the stored procedure for other database platforms.
This example shows how to invoke a stored procedure in Mule. This particular stored procedure clones
the records in the mule_source database (doubling the size of the table each time it is run). The goal is to
create a large dataset that we can use in Example 4.
Configuration
See conf/jdbc-stored-procedure.xml
Features Used
This page uses an outbound SELECT query and stored procedure support to synchronously call a stored
procedure.
Before running this example, run the statements in the scripts/oracle_procs.ddl to create the stored
procedure and sequence.
Start the Mule server and choose Example 3. Then, enter the URL http://localhost:8080/clone into
your web browser. You should see the current count of the number of mules in mule_source. Each time
you refresh the page, the number of mules should double. Try refreshing several times until there are
thousands or even millions of mules or more in the table. The mules multiply quickly!
See conf/jdbc-etl.xml
Features Used
This page uses large dataset retrieval, an outbound SELECT query, and batch INSERT statements to
transfer arbitrarily large numbers of records from one table another.
Before running this example, you can optionally change the location of the ID store in jdbc-etl.xml:
Next, for better visibility into batch activity, add the following line to your log4j.properties file (in
$MULE_HOME/conf):
log4j.logger.org.mule.providers.jdbc.components=DEBUG
Finally, start the server and choose Example 4. You should see the batches of records being processed in
the logs:
In this example, batches are configured to occur every 1 second, with a batch size of 3000.
Note that if you stop and restart the Mule server, the batches should resume processing where they left
off.
Alternatively, if on Oracle, start the server choose "Example 5" to cleanup the tables mule_source and
mule_target. You still need to manually remove the file "/tmp/eg-batches.txt".
Configuration
JDK 1.5.0.11
Scenario Details
The ETL use case from the Examples directory was used for this benchmark. This example retrieves
records from a table called mule_source and inserts them into a table called mule_target.
The scenario involves processing a backlog of 10 million records in the mule_source table. Records are
read from the source table once every 1 second, at a batch size of 3000 records per read and 3000
records per commit.
Results
Mule took 55 minutes to complete processing of the 10 million record backlog. Therefore, with this
configuration, the Mule Enterprise JDBC Transport could move over 10 million records an hour.
Jetty Transport
[ Connector ] [ Endpoints ]
The Jetty transport provides support for exposing services over HTTP by embedding a light-weight Jetty
server. The Jetty SSL transport works the same way but over SSL. You can only define inbound endpoints
with this transport.
Connector
Allows Mule to expose Mule Services over HTTP using a Jetty HTTP server. A single Jetty server is created
for each connector instance. One connector can serve many endpoints. Users should rarely need to have
more than one Jetty connector. The Jetty connector can be configured using a Jetty XML config file, but
the default configuration is sufficient for most scenarios.
Attributes of <connector...>
For example:
Endpoints
Jetty endpoints are configured the same way as HTTP endpoints. Note that only inbound endpoints can
use the Jetty transport.
For example:
For example, the following configuration specifies the HTTPS and Jetty-SSL connectors:
If you do not need this level of security, you can use the Jetty transport instead.
JMS Transport
Table of Contents
• JMS Transport
• ° Using Topics, Queues, or Both
° Specifying Credentials
° Specifying Additional Information
° JMS Selectors
° Durable Subscribers
° Overloading JMS Behavior
° Looking Up JMS Objects from JNDI
° JMS Transformers
° JMS Header Properties
° Schema Reference
° Connector
° - Attributes of <connector...>
° Custom Connector
° - Attributes of <custom-connector...>
° Activemq Connector
° - Attributes of <activemq-connector...>
° Activemq Xa Connector
° - Attributes of <activemq-xa-connector...>
° Weblogic Connector
° - Attributes of <weblogic-connector...>
° Websphere Connector
° - Attributes of <websphere-connector...>
° Transaction
° Client Ack Transaction
° Jmsmessage To Object Transformer
° Object To Jmsmessage Transformer
° Inbound Endpoint
° - Attributes of <inbound-endpoint...>
° Outbound Endpoint
° - Attributes of <outbound-endpoint...>
° Endpoint
° - Attributes of <endpoint...>
° Property Filter
° - Attributes of <property-filter...>
This page describes the JMS transport, which provides a standard JMS 1.0.2b and 1.1 connector. This
connector exposes all features defined in the 1.0.2b/1.1 specification. For information on configuring
various types of JMS, such as ActiveMQ, see Configuring JMS. If you are using Oracle AQ, you can use
the JMS transport without any special configuration if you are using Oracle 10 or later. For details, see the
example on the Mule Cookbook.
To make this destination a topic instead of a queue, you must prepend the destination name with
topic: in the URI. In transport-specific endpoints, you set the topic and queue attributes explicitly. For
example:
jms://topic:my.destination
or
<jms:inbound-endpoint topic="my.destination"/>
<jms:outbound-endpoint queue="my.destination"/>
If you are using a JMS 1.1 compliant server, you can use the same JMS connector for both queues
and topics. If you are using a JMS 1.0.2b server, and you want to use both queues and topics in your
Mule configuration, you must create two JMS connectors: one with a JNDI connection factory that
references a QueueConnectionFactory, and another that references a TopicConnectionfactory. Each
JMS endpoint must reference the correct connector depending on whether the destination is a topic or a
queue. To specify the connector on a JMS endpoint, you add the connector parameter to the URI or the
connector-ref attribute on a transport-specific endpoint:
jms://my.destination?connector=jmsQueueConnector
jms://topic:my.destination?connector=jmsTopicConnector
or
Specifying Credentials
Client connections might require a username and password when creating a connection. This information
can be specified on the URI or transport-specific endpoint as follows:
jms://ross:secret@topic:my.destination
or
JMS Selectors
You can set a JMS selector as a filter on an endpoint. The JMS selector simply sets the filter expression on
the consumer.
Durable Subscribers
You can use durable subscribers by setting the durable attribute on the JMS connector. This attribute
tells the connector to make all topic subscribers durable (it does not apply to queues). You can override
the connector's durable attribute at the endpoint level. For example, you can set durable to false on the
connector and set it to true just on the endpoints that require it.
When using a durable subscription, the JMS server requires a durable name to identify this subscriber. By
default, Mule generates the durable name in the following format:
If you want to set the durable name yourself, you can set the durableName property on the endpoint.
jms://topic:durable.topic?durableName=myDurableSubscription
<jms:connector name="jmsConnector">
<property key="jmsSupport" ref="customJmsSupport"/>
</jms:connector>
For more information about configuring different JMS servers, see Configuring JMS.
Note that JNDI configuration on the connector takes precedence over a Spring-configured connection
factory.
Configuration example:
<jms:connector name="jmsJndiConnector"
jndiInitialFactory="com.sun.jndi.ldap.LdapCtxFactory"
jndiProviderUrl="ldap://localhost:10389/"
connectionFactoryJndiName="cn=ConnectionFactory,dc=example,dc=com"
jndiDestinations="true"
forceJndiDestinations="true"/>
JMS Transformers
Transformers for the JMS provider can be found at org.mule.transport.jms.transformers .
Transformer Description
You can access any custom header properties on the message in the same way.
Schema Reference
Connector
A generic connector for sending and receiving messages over JMS queues.
Attributes of <connector...>
redeliveryHandlerFactory-
name (no spaces) no
ref
acknowledgementMode
AUTO_ACKNOWLEDGE/
no AUTO_ACKNOWLEDGE
CLIENT_ACKNOWLEDGE/
DUPS_OK_ACKNOWLEDGE
clientId string no
durable boolean no
noLocal boolean no
persistentDelivery boolean no
honorQosHeaders boolean no
maxRedelivery integer no
cacheJmsSessions boolean no
recoverJmsConnections
boolean no Deprecated. This
attribute is no
longer relevant
for the new retry
policies. See
MULE-3812
eagerConsumer boolean no
username string no
password string no
numberOfConsumersinteger no Configures
the number
of concurrent
consumers that
will be used
to receive JMS
messages.
jndiProviderProperties-
string no Configures a
ref reference to a
Map that contains
additional provider
properties.
connectionFactoryJndiName
string no Configures the
name to use when
looking up the
connection factory
from JNDI.
Custom Connector
Attributes of <custom-connector...>
redeliveryHandlerFactory-
name (no spaces) no
ref
clientId string no
durable boolean no
noLocal boolean no
persistentDelivery boolean no
honorQosHeaders boolean no
maxRedelivery integer no
cacheJmsSessions boolean no
recoverJmsConnections
boolean no Deprecated. This
attribute is no
longer relevant
for the new retry
policies. See
MULE-3812
eagerConsumer boolean no
username string no
password string no
numberOfConsumersinteger no Configures
the number
of concurrent
consumers that
will be used
to receive JMS
messages.
(Note: If you
use this attribute
you should not
configure the
'numberOfConcurrentTransacted
which has the
same effect.)
jndiProviderProperties-
string no Configures a
ref reference to a
Map that contains
connectionFactoryJndiName
string no Configures the
name to use when
looking up the
connection factory
from JNDI.
Activemq Connector
Attributes of <activemq-connector...>
redeliveryHandlerFactory-
name (no spaces) no
ref
acknowledgementMode
AUTO_ACKNOWLEDGE/
no AUTO_ACKNOWLEDGE
CLIENT_ACKNOWLEDGE/
DUPS_OK_ACKNOWLEDGE
clientId string no
durable boolean no
noLocal boolean no
persistentDelivery boolean no
honorQosHeaders boolean no
maxRedelivery integer no
cacheJmsSessions boolean no
recoverJmsConnections
boolean no Deprecated. This
attribute is no
eagerConsumer boolean no
username string no
password string no
numberOfConsumersinteger no Configures
the number
of concurrent
consumers that
will be used
to receive JMS
messages.
(Note: If you
use this attribute
you should not
configure the
'numberOfConcurrentTransacted
which has the
same effect.)
jndiProviderProperties-
string no Configures a
ref reference to a
Map that contains
additional provider
properties.
connectionFactoryJndiName
string no Configures the
name to use when
looking up the
connection factory
from JNDI.
brokerURL string no
Activemq Xa Connector
Attributes of <activemq-xa-connector...>
redeliveryHandlerFactory-
name (no spaces) no
ref
acknowledgementMode
AUTO_ACKNOWLEDGE/
no AUTO_ACKNOWLEDGE
CLIENT_ACKNOWLEDGE/
DUPS_OK_ACKNOWLEDGE
clientId string no
durable boolean no
noLocal boolean no
persistentDelivery boolean no
honorQosHeaders boolean no
maxRedelivery integer no
cacheJmsSessions boolean no
recoverJmsConnections
boolean no Deprecated. This
attribute is no
longer relevant
for the new retry
policies. See
MULE-3812
eagerConsumer boolean no
username string no
password string no
numberOfConsumersinteger no Configures
the number
of concurrent
consumers that
will be used
to receive JMS
messages.
jndiProviderProperties-
string no Configures a
ref reference to a
Map that contains
additional provider
properties.
connectionFactoryJndiName
string no Configures the
name to use when
looking up the
connection factory
from JNDI.
brokerURL string no
Weblogic Connector
Attributes of <weblogic-connector...>
acknowledgementMode
AUTO_ACKNOWLEDGE/
no AUTO_ACKNOWLEDGE
CLIENT_ACKNOWLEDGE/
DUPS_OK_ACKNOWLEDGE
clientId string no
durable boolean no
noLocal boolean no
persistentDelivery boolean no
honorQosHeaders boolean no
maxRedelivery integer no
cacheJmsSessions boolean no
recoverJmsConnections
boolean no Deprecated. This
attribute is no
longer relevant
for the new retry
policies. See
MULE-3812
eagerConsumer boolean no
username string no
password string no
numberOfConsumersinteger no Configures
the number
of concurrent
consumers that
will be used
to receive JMS
messages.
(Note: If you
use this attribute
you should not
configure the
'numberOfConcurrentTransacted
which has the
same effect.)
connectionFactoryJndiName
string no Configures the
name to use when
looking up the
connection factory
from JNDI.
Websphere Connector
Attributes of <websphere-connector...>
redeliveryHandlerFactory-
name (no spaces) no
ref
acknowledgementMode
AUTO_ACKNOWLEDGE/
no AUTO_ACKNOWLEDGE
CLIENT_ACKNOWLEDGE/
DUPS_OK_ACKNOWLEDGE
clientId string no
durable boolean no
noLocal boolean no
persistentDelivery boolean no
honorQosHeaders boolean no
maxRedelivery integer no
recoverJmsConnections
boolean no Deprecated. This
attribute is no
longer relevant
for the new retry
policies. See
MULE-3812
eagerConsumer boolean no
username string no
password string no
numberOfConsumersinteger no Configures
the number
of concurrent
consumers that
will be used
to receive JMS
messages.
(Note: If you
use this attribute
you should not
configure the
'numberOfConcurrentTransacted
which has the
same effect.)
jndiProviderProperties-
string no Configures a
ref reference to a
Map that contains
additional provider
properties.
connectionFactoryJndiName
string no Configures the
name to use when
looking up the
connection factory
from JNDI.
Transaction
Inbound Endpoint
Attributes of <inbound-endpoint...>
Outbound Endpoint
Attributes of <outbound-endpoint...>
Endpoint
Attributes of <endpoint...>
Property Filter
Attributes of <property-filter...>
propertyName string no
propertyClass string no
expression string no
pattern string no
Mule WMQ
Transport
[ Messaging Use Cases ] [ Sending Messages on a Local Queue ] [ Sending Messages on a Remote Queue
] [ Inbound Message Handling ] [ Outbound Message Handling ] [ Retrieving the Connection Factory from
JNDI ] [ Known Limitations ]
The Mule Enterprise transport for IBM® WebSphere® MQ (Mule WMQ transport) provides the following
functionality:
• Bi-directional request-response messaging between Websphere MQ and Mule JMS using native MQ
point-to-point.
• Synchronous and asynchronous request-response communications using JMSReplyTo.
This page describes how to configure and use this transport and its connector. It assumes that you
already understand how to configure and use WebSphere MQ. For complete information on MQ, refer to
the MQ Information Center.
Note that the Mule WMQ transport is available only with Mule Enterprise Edition version 1.6 or later. For
information on connecting to WebSphere MQ using the JMS transport, which does not support native MQ
but does provide more functionality and is available with the community edition of Mule, see WebSphere
MQ Integration.
The configuration describes a flow where a service mqSender takes input interactively from the
command line and sends it to a native WebSphere MQ endpoint (mqs://REQUEST.QUEUE). Another
service, mqReceiver, picks up the message from this endpoint and echoes it back to another native
WebSphere MQ endpoint, mqs://RESPONSE.QUEUE.
• The JMSReplyTo property must be set on the outbound side of the mqSender.
• The message type (JMS_IBM_MsgType) property must be set to
com.ibm.mq.MQC.MQMT_REQUEST on the outbound side of the mqSender service.
• The message type (JMS_IBM_MsgType) property must be set to
com.ibm.mq.MQC.MQMT_REPLY on the inbound side of the mqReceiverservice.
• To support local queues, the transportType property in the MQJMSConnector declaration must be
set to JMSC.MQJMS_TP_BINDINGS_MQ.
By default, messages sent from Mule to MQ are sent in native format, and JMS (RFH2) headers are
suppressed. This configuration is applied transparently to the configuration below by the connector
appending a parameter to the MQ destination URI (?targetClient=1). To force JMS behaviour
on the receiving MQ (that is, to use non-native format), use the following attribute setting in the
MQJMSConnector declaration:
<mqs:connector name="..."
...
targetClient="JMSC.MQJMS_CLIENT_JMS_COMPLIANT"
...
/>
• The mqs URI scheme for endpoints indicates that the MQ transport should be used.
• The queueManager property in the MQJMSConnector declaration matches the MQ QueueManager
set up previously.
• The local queues REQUEST.QUEUE and RESPONSE.QUEUE were set up previously using the
runmqsc utility.
xsi:schemaLocation="
http://www.mulesource.com/schema/mule/mqseries/2.2 http://www.mulesource.com/schema/mule/
mqseries/2.2/mule-mqseries-ee.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-
beans-2.0.xsd
http://www.mulesource.org/schema/mule/core/2.2 http://www.mulesource.org/schema/mule/core/2.2/
mule.xsd
http://www.mulesource.org/schema/mule/stdio/2.2 http://www.mulesource.org/schema/mule/
stdio/2.2/mule-stdio.xsd
http://www.mulesource.org/schema/mule/vm/2.2 http://www.mulesource.org/schema/mule/vm/2.2/mule-
vm.xsd">
<mqs:connector name="mqSeriesConnector"
hostName="winter"
port="1414"
queueManager="HELLO.QMGR"
transportType="JMSC.MQJMS_TP_BINDINGS_MQ"
targetClient="JMSC.MQJMS_CLIENT_NONJMS_MQ"
specification="1.1"
username=""
password=""
disableReplyToHandler="true"
connectionFactory-ref="connectionFactory">
</mqs:connector>
<model name="MQ_Series_Example">
<service name="mqSender">
<inbound>
<stdio:inbound-endpoint system="IN"/>
</inbound>
<echo-component/>
<outbound>
<pass-through-router>
<outbound-endpoint address="mqs://REQUEST.QUEUE">
<property key="JMSReplyTo" value="RESPONSE.QUEUE"/>
<property key="JMS_IBM_MsgType" value="1"/> <!-- com.ibm.mq.MQC.MQMT_REQUEST -->
</outbound-endpoint>
</pass-through-router>
</outbound>
</service>
<service name="mqReceiver">
<inbound>
<inbound-endpoint address="mqs://REQUEST.QUEUE">
<property name="JMS_IBM_MsgType" value="2"/> <!-- com.ibm.mq.MQC.MQMT_REPLY -->
The following environment variable needs to be set for Mule to run successfully when MQSeries connector
functionality has been configured.
export LD_LIBRARY_PATH=/opt/mqm/java/lib
You must set this variable to the location of the Java library directory shipped with the MQ server
installation.
This use case describes sending a Mule message to a WebSphere MQ QueueManager on a different
machine. After configuring WebSphere MQ with the appropriate queue and channel definitions, you
configure Mule as follows:
xsi:schemaLocation="
http://www.mulesource.com/schema/mule/mqseries/2.2 http://www.mulesource.com/schema/mule/
mqseries/2.2/mule-mqseries-ee.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-
beans-2.0.xsd
http://www.mulesource.org/schema/mule/core/2.2 http://www.mulesource.org/schema/mule/core/2.2/
mule.xsd
http://www.mulesource.org/schema/mule/stdio/2.2 http://www.mulesource.org/schema/mule/
stdio/2.2/mule-stdio.xsd
http://www.mulesource.org/schema/mule/vm/2.2 http://www.mulesource.org/schema/mule/vm/2.2/mule-
vm.xsd">
<model name="MQ_Series_Example">
<service name="mqSender">
<inbound>
<stdio:inbound-endpoint system="IN"/>
</inbound>
<echo-component/>
<outbound>
<pass-through-router>
<outbound-endpoint address="mqs://REQUEST.QUEUE">
<property key="JMSReplyTo" value="RESPONSE.QUEUE"/>
<property key="JMS_IBM_MsgType" value="1"/> <!-- com.ibm.mq.MQC.MQMT_REQUEST -->
</outbound-endpoint>
</pass-through-router>
</outbound>
</service>
</model>
</mule>
Note the channel configuration. This is how WebSphere MQ knows to send it to the remotely hosted
queue.
no more messages
Sample AMQSGET0 end
You can use a the WebSphere MQ utility amqsget to verify the message was received on the remote
queue.
If the message type is MQMT_REQUEST, the connector will check the existence of JMSReplyTo property on
the endpoint. If the property is not set, the temporary queue will be created.
If the remoteSync property is set on the endpoint, the connector will wait for the response on the queue
specified by JMSReplyTo. The timeout can be set using the remoteSyncTimeout setting. If a response is
received by the connector, it will be returned by the component.
<mqs:connector ...
connectionFactory-ref="connectionFactory"/>
To support the case where a JNDI registry has been configured to store the connection factory, the
connector declaration should include the following parameters. This is the same as the regular JMS
transport documented here .
Known Limitations
The Mule WMQ transport has been implemented as an extension to the JMS transport and has limited
functionality and support for native WebSphere MQ. Following are the features that the Mule WMQ
transport does not currently support:
Multicast Transport
The Multicast transport sends and receives Mule events using IP multicasting. The Javadoc for this
transport can be found here .
Connector
The Multicast connector extends the UDP connector with additional optional attributes:
Attribute Description
Endpoints
You configure Multicast endpoints just as you would with any other transport, with the following additional
attributes:
Transformers
The following transformers are used by default for this connector unless a transformer is explicitly set on
the provider.
Transformer Description
<pgp:security-manager ...>
Attributes
id no
name no
Child Elements
<pgp:security-provider ...>
A security manager for PGP related functionality.
Attributes
<pgp:keybased-encryption-strategy ...>
TODO
Attributes
Child Elements
<pgp:security-filter ...>
TODO
Attributes
strategyName string no
signRequired string no
Child Elements
POP3 Transport
The POP3 transport can be used for receiving messages from POP3 inboxes. The POP3S Transport
connects to POP3 mailboxes using SSL (POP3s) using the javax.mail API. The POP3 transport uses the
same filters and transformers as the Email Transport.
POP3 Connector
The POP3 connector supports all the common connector attributes and properties as well as the following
additional attributes:
Endpoints
POP3 and POP3S endpoints include details about connecting to a POP3 mailbox. You configure the
endpoints just as you would with any other transport, with the following additional attributes:
For example:
or:
When including the user name and password in the endpoint, escape any characters
that are illegal for URIs, such as the @ character. For example, if the user name is
[email protected], you should enter it as user%40myco.com.
POP3S Transport
TLS/SSL connections are made on behalf of an entity, which can be anonymous or identified by a
certificate. The key store provides the certificates and associated private keys necessary for identifying
the entity making the connection. Additionally, connections are made to trusted systems. The public
certificates of trusted systems are stored in a trust store, which is used to verify that the connection
made to a remote system matches the expected identity.
The POP3s connector enables POP3 over SSL using the javax.mail APIs. It supports all the elements and
attributes of the POP3 connector plus some required properties for setting up the client key store and the
trust store for the SSL connection.
Property Description
For example:
<pop3s:connector name="pop3sConnector">
<pop3s:tls-client path="clientKeystore" storePassword="mulepassword" />
<pop3s:tls-trust-store path="greenmail-truststore" storePassword="password" />
</pop3s:connector>
<model name="test">
<service name="relay">
<inbound>
<pop3s:inbound-endpoint user="bob" password="password" host="localhost" port="65436" />
</inbound>
...
For information on configuring endpoints using the POP3S connector, see POP3 Transport.
The POP3S transport supports the same filters and transformers as the Email transport.
Table of Contents
• Quartz Transport
• ° Connector
° - Attributes of <connector...>
- Child Elements of <connector...>
° Inbound endpoint
° - Attributes of <inbound-endpoint...>
- Child Elements of <inbound-endpoint...>
° Outbound endpoint
° - Attributes of <outbound-endpoint...>
- Child Elements of <outbound-endpoint...>
° Endpoint
° - Attributes of <endpoint...>
- Child Elements of <endpoint...>
• Jobs
• ° Event generator job
° - Child Elements of <event-generator-job...>
- Example Configurations
- Example Configurations
° Endpoint polling job
° - Child Elements of <endpoint-polling-job...>
- Example Configurations
° Scheduled dispatch job
° - Child Elements of <scheduled-dispatch-job...>
- Example Configurations
° Custom job
° - Attributes of <custom-job...>
- Example Configurations
° Custom job from message
° - Attributes of <custom-job-from-message...>
- Example Configurations
Quartz Transport
The Quartz transport provides support for scheduling events and for triggering new events. An inbound
quartz endpoint can be used to trigger inbound events that can be repeated, such as every second.
Outbound quartz endpoints can be used to schedule an existing event to fire at a later date. Users can
create schedules using cron expressions, and events can be persisted in a database.
This transport makes use of the Quartz Project at Open Symphony. The Quartz site has more generic
information about how to work with Quartz.
This transport becomes very powerful when using cron expressions to trigger events, and some of the
examples below provide examples of cron expressions. If you are not familiar with cron syntax, here is a
good tutorial.
Connector
The Quartz connector is used to configure the default behavior for Quartz endpoints that reference
the connector. Note if there is only one Quartz connector configured, all Quartz endpoints will use that
connector.
Inbound Endpoint
A Quartz inbound endpoint can be used to generate events. It is most useful when you want to trigger a
service at a given interval (or cron expression) rather than have an external event trigger the service.
Attributes of <inbound-endpoint...>
Outbound Endpoint
An outbound Quartz endpoint allows existing events to be stored and fired at a later time/date. If you
are using a persistent event store, the payload of the event must implement java.io.Serializable.
You configure an org.quartz.Job implementation on the endpoint to tell it what action to take. Mule has
some default jobs, but you can also write your own.
Attributes of <outbound-endpoint...>
Endpoint
A global endpoint that can be used as a template to create inbound and outbound Quartz endpoints.
Common configuration can be set on a global endpoint and then referenced using the @ref attribute on
the local endpoint. Note that because jobs sometimes only work on inbound or outbound endpoints, they
have to be set on the local endpoint.
Attributes of <endpoint...>
Jobs
Jobs are used to perform an action when a time trigger occurs from the Quartz transport. Mule provides a
number of jobs for generating and scheduling events. These are detailed below. Users can also write their
own jobs and hook them in using the custom-job type included with Mule.
Example Configurations
Note that the documentation for this example should be embedded within the code.
Example Configurations
Note that the documentation for this example should be embedded within the code.
Example Configurations
Note that the documentation for this example should be embedded within the code.
Example Configurations
Note that the documentation for this example should be embedded within the code.
Custom Job
A custom job can be configured on inbound or outbound endpoints. You can create and configure your
own job implementation and use it on a Quartz endpoint. A custom job can be configured as a bean in
the XML configuration and referenced using this job.
Attributes of <custom-job...>
Example Configurations
Note that the documentation for this example should be embedded within the code.
Example Configurations
Note that the documentation for this example should be embedded within the code.
RMI Transport
This page is ready for review
The RMI transport can be used to send and receive Mule events over JRMP. This transport has a
dispatcher that invokes an RMI method and a polling receiver that repeatedly does the same.
<mule xmlns="http://www.mulesource.org/schema/mule/core/2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:spring="http://www.springframework.org/schema/beans"
xmlns:rmi="http://www.mulesource.org/schema/mule/rmi/2.0"
xmlns:vm="http://www.mulesource.org/schema/mule/vm/2.0"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-
beans-2.5.xsd
http://www.mulesource.org/schema/mule/core/2.0 http://www.mulesource.org/schema/mule/core/2.0/
mule.xsd
http://www.mulesource.org/schema/mule/vm/2.0 http://www.mulesource.org/schema/mule/vm/2.0/mule-
vm.xsd
http://www.mulesource.org/schema/mule/rmi/2.0 http://www.mulesource.org/schema/mule/rmi/2.0/mule-
rmi.xsd">
The connector looks for the method and methodArgumentTypes. It uses the payload as the argument.
JNP Connector
If you want to use the Java naming protocol to bind to remote objects, you can use the JNP connector
instead simply by using the jnp namespace.
<mule xmlns="http://www.mulesource.org/schema/mule/core/2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:spring="http://www.springframework.org/schema/beans"
xmlns:jnp="http://www.mulesource.org/schema/mule/jnp/2.0"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-
beans-2.5.xsd
http://www.mulesource.org/schema/mule/core/2.0 http://www.mulesource.org/schema/mule/core/2.0/
mule.xsd
http://www.mulesource.org/schema/mule/jnp/2.0 http://www.mulesource.org/schema/mule/jnp/2.0/mule-
jnp.xsd">
Configuration Reference
Connector
Attributes of <connector...>
Endpoint
Attributes of <endpoint...>
host string no
object string no
method string no
methodArgumentTypes
string no
Servlet Transport
The Servlet transport provides integration with a servlet implementation. The implementing servlet does
the work of receiving a request, and the Servlet transport then hands off the request to any receivers
registered with it. There is no notion of a dispatcher for this connector, as it is triggered by a request and
may or may not return a response. You specify the servlet URL as part of the connector configuration and
then specify the endpoints just like any other HTTP endpoints.
The Javadoc for this transport can be found here . For more information about using Mule with servlet
containers, see Embedding Mule in a Java Application or Webapp. For information on using the RESTlet
connector, click here.
Connector
Servlet connector is a channel adapter between Mule and a servlet engine. It allows the
MuleReceiverServlet to look up components interested in requests it receives via the servlet container.
Attributes of <connector...>
For example:
You can also specify the servlet URL as part of the endpoint:
or:
Servlet endpoints are identical to HTTP endpoints with the exception that they use the servlet: prefix
instead of http:. For more information, see HTTP Transport.
SMTP Transport
The SMTP transport can be used for sending messages over SMTP using the javax.mail API. See
the SMTPS Transport for a secure version. The implementation supports CC/BCC/ReplyTo addresses,
attachments, custom Header properties, and customizable authentication. It also provides support for
javax.mail.Message transformation.
SMTP Connector
The POP3 connector supports all the common connector attributes and properties as well as the following
optional element and attributes:
Element Description
Attribute Description
For example:
smtp://muletestbox:[email protected][email protected]
This will send mail using smtp.mail.yahoo.co.uk (using the default SMTP port) to the address
[email protected]. The SMTP request is authenticated using the username muletestbox and the
password 123456.
When including the user name and password in the endpoint, escape any characters
that are illegal for URIs, such as the @ character. For example, if the user name is
[email protected], you should enter it as user%40myco.com.
You will probably want to set other information such as subject and fromAddress. These can be set as
parameters on the URI, but we recommend you set them as endpoint properties to make it easier to read
and maintain the configuration.
<outbound>
<outbound-pass-through-router>
<smtp:outbound-endpoint host="localhost" port="65437" from="[email protected]"
to="[email protected]" subject="Please verify your account details"/>
</outbound-pass-through-router>
</outbound>
So far, all configuration has been static in that you define all the information in the configuration of the
endpoint. However, you can set several MailProperties to control the settings of the outgoing message.
These properties will override the endpoint properties. If you always want to set the email address
dynamically, you can leave out the address parameter on the SMTP endpoint.
SMTPS Transport
TLS/SSL connections are made on behalf of an entity, which can be anonymous or identified by a
certificate. The key store provides the certificates and associated private keys necessary for identifying
the entity making the connection. Additionally, connections are made to trusted systems. The public
certificates of trusted systems are stored in a trust store, which is used to verify that the connection
made to a remote system matches the expected identity.
The SMTPS connector enables SMTP over SSL using the javax.mail APIs. It supports all the elements
and attributes of the SMTP connector plus some required properties for setting up the client key store and
the trust store for the SSL connection.
Property Description
For example:
<smtps:connector name="smtpsConnector">
<smtps:tls-client path="clientKeystore" storePassword="mulepassword" />
<smtps:tls-trust-store path="greenmail-truststore" storePassword="password" />
</smtps:connector>
<model name="test">
<service name="relay">
<inbound>
<vm:inbound-endpoint path="send" />
</inbound>
<outbound>
<outbound-pass-through-router>
<smtps:outbound-endpoint host="localhost" port="65439" to="[email protected]" />
</outbound-pass-through-router>
</outbound>
...
For information on configuring endpoints using the SMTPS connector, see SMTP Transport.
The SMTPS transport supports the same filters and transformers as the Email transport.
SOAP Transport
The SOAP transport is currently deprecated. We recommend that you either use the CXF
Transport or the Axis Transport to build web services from now on.
The SOAP transport enables your components to be exposed as web services and to act as SOAP clients.
The SOAP transport provides support for the CFX and Axis transports.
soap:http://localhost:1234/MyService
The actual SOAP stack used to execute this service will be discovered based on the first SOAP stack
available on the class path. Alternatively, an implementation can be specified directly.
...where namespace is a property on the endpoint, the method is the "method" property set on the
message, and the properties are from the HTTP GET request.
<custom-transformer class="org.mule.transport.soap.transformers.HttpRequestToSoapRequest">
<spring:property name="namespace" value="http://acme.com/hello">
</custom-transformer>
SSL Transport
The SSL transport can be used for secure socket communication using SSL or TLS.
Connector
Connects Mule to an SSL socket to send or receive data via the network.
Endpoint
Attributes of <endpoint...>
host string no
Inbound Endpoint
Attributes of <inbound-endpoint...>
host string no
Outbound Endpoint
Attributes of <outbound-endpoint...>
host string no
To configure the TLS connector instead of the SSL connector, specify the tls namespace and schema,
configure the connector, and then use the tls prefix for endpoints:
STDIO Transport
The STDIO Transport allows the reading and writing of streaming data to Java's System.out and
System.in objects for debugging.
Connector
Attributes of <connector...>
Transformers
Internationalizing Messages
If you are internationalizing your application, you can also internationalize the promptMessages and
outputMessages for the STDIO connector. (This assumes that you have already created a resource bundle
that contains your messages as described on that page.)
To internationalize, you must specify both the resourceBundle parameter and the promptMessageCode
and/or outputMessageCode parameters. The resourceBundle parameter will contain the key to the
resource bundle itself. The promptMessageCode provides the key to the message in the bundle for
the prompt message. In the snippet above, the "dummy-messages" resource bundle means that the
prompt message "456" will be expected in the bundle META-INF/services/org/mule/i18n/dummy-
messages<langCode>.properties.
Table of Contents
• TCP Transport
• ° Connector
° - Child Elements of <connector...>
° Inbound endpoint
° - Attributes of <inbound-endpoint...>
° Outbound endpoint
° - Attributes of <outbound-endpoint...>
° Endpoint
° - Attributes of <endpoint...>
° Streaming protocol
° Xml protocol
° Xml eof protocol
° Eof protocol
° - Attributes of <eof-protocol...>
° Direct protocol
° - Attributes of <direct-protocol...>
° Safe protocol
° - Attributes of <safe-protocol...>
° Length protocol
° - Attributes of <length-protocol...>
° Custom protocol
° - Attributes of <custom-protocol...>
° Transformers
TCP Transport
The TCP transport enables events to be sent and received over TCP sockets.
Connector
Connects Mule to a TCP socket to send or receive data via the network.
Attributes of <inbound-endpoint...>
host string no
Outbound Endpoint
Attributes of <outbound-endpoint...>
host string no
Endpoint
Attributes of <endpoint...>
host string no
Streaming Protocol
TCP does not guarantee that data written to a socket is transmitted in a single packet, so if you want to
transmit entire Mule messages reliably, you must specify an additional protocol. However, this is not an
issue with streaming, so this is an alias for the "direct" (null) protocol.
Xml Protocol
TCP does not guarantee that data written to a socket is transmitted in a single packet, so if you want to
transmit entire Mule messages reliably, you must specify an additional protocol. This protocol uses XML
syntax to isolate messages from the stream of bytes received, so it will only work with well-formed XML.
Attributes of <eof-protocol...>
Direct Protocol
TCP does not guarantee that data written to a socket is transmitted in a single packet. Using this "null"
protocol does not change the normal TCP behavior, so message fragmentation may occur. For example, a
single sent message may be received in several pieces, each as a separate received message. Typically,
it is not a good choice for messaging within Mule, but it may be necessary to interface with external TCP-
based protocols.
Attributes of <direct-protocol...>
Safe Protocol
Similar to "length-protocol", but it also includes a prefix. Verification of the prefix allows mis-matched
protocols to be detected and avoids interpreting "random" data as a message length (which may give
out-of-memory errors). This is the default protocol in Mule 2.x.
Length Protocol
This protocol precedes each message with the number of bytes sent so that an entire message can be
constructed on the received.
Attributes of <length-protocol...>
Custom Protocol
The user may supply their own protocol implementation via this element.
Attributes of <custom-protocol...>
Transformers
The following transformers are used by default for the TCP transport unless a transformer is explicitly set
on the connector or service.
Transformer Description
UDP Transport
The UDP transport enables events to be sent and received as Datagram packets.
Connector
Attributes of <connector...>
Endpoints
You configure UDP endpoints just as you would with any other transport, with the following additional
attributes:
For example:
Message Payload
The default message payload of the UDP transport for incoming messages is a byte[] array.
VM Transport
The VM transport is used for intra-VM communication between components managed by Mule. The
connector provides options for configuring VM transient or persistent queues.
Connector
Attributes of <connector...>
queueTimeout positiveInteger no
queue-profile 0..1
Using VM Queues
When using a synchronous VM endpoint, events are delivered in memory from one component to another
(asynchronous endpoints introduce an event queue that threads can consume from). However, when the
queueEvents property is set, events can be stored in arbitrary memory queues and consumed later by
clients or components. Furthermore, these queues can be persistent and XA transactional (see below).
To use VM queues, the queueEvents property must be set on the connector, and all VM endpoints that
should queue events must use a VM connector that has queueEvents enabled. You cannot set the
queueEvents property on the endpoint. For example:
<test:component>
<test:return-data>Polo</test:return-data>
</test:component>
<outbound>
<outbound-pass-through-router>
<vm:outbound-endpoint path="out" connector-ref="asynchVm"/>
</outbound-pass-through-router>
</outbound>
</service>
</model>
</mule>
Notice that the inbound endpoint explicitly tells Mule to use the asynchVm connector. Otherwise, Mule will
look for the first connector that matches the protocol for the endpoint.
A VM queue can be made persistent so that its state can be maintained between server shutdowns. To
make VM queues persistent, you enable the persistent property in the queue profile on the model or
service. For more information, see Tuning Performance.
Using Transactions
VM queues can take part in distributed XA transactions. To make a VM endpoint transactional, use the
following configuration:
<inbound>
<vm:inbound-endpoint address="vm://dispatchInQueue" connector-ref="vmQueue">
<vm:transaction action="BEGIN_OR_JOIN"/>
</vm:inbound-endpoint>
</inbound>
You must add a transaction manager to your configuration. For more information, see Transaction
Management.
Transformers
There are no specific transformers for the VM transport.
WSDL Transport
[ Generic WSDL Endpoints ] [ Transformers ] [ Specifying an Alternate WSDL Location ] [ Example of the
CXF WSDL Endpoint ]
The WSDL transport can be used to for invoking remote web services by obtaining the service WSDL.
Mule will create a dynamic proxy for the service and then invoke it.
The Javadoc for this transport can be found here for the Axis version and here for the CXF version.
You must provide the full URL to the WSDL of the service to invoke, and you must supply a 'method'
parameter that tells Mule which operation to invoke on the service:
wsdl:http://www.webservicex.net/stockquote.asmx?WSDL&method=GetQuote
The WSDL URL is prepended with the wsdl: prefix. Mule checks your class path to see if there is a WSDL
provider that it can use to create a client proxy from the WSDL. Mule supports both Axis and CXF as
WSDL providers. If you want to use a specific one, you can specify it on the URL as follows:
wsdl-cxf:http://www.webservicex.net/stockquote.asmx?WSDL&method=GetQuote
or
wsdl-axis:http://www.webservicex.net/stockquote.asmx?WSDL&method=GetQuote
In general, you should use the CXF WSDL endpoint. The one limitation of the CXF WSDL provider is
that it does not allow you to use non-Java primitives (objects that are not a String, int, double, and so
on). Sometimes the Axis WSDL generation will not work (incorrect namespaces are used), so you can
experiment with each one to see which works best.
Transformers
There are no specific transformers to set on WSDL endpoints.
In these cases, you can specify the wsdlLocation property of the CXF endpoint as follows:
<endpoint
address="wsdl-cxf:http://localhost:8080/book/services/BookService?method=getBooks">
<properties>
<property name="wsdlLocation" value="file:///c:/BookService.wsdl"/>
</properties>
</endpoint>
This service requires two arguments: the "from" currency code and the "to" currency code. When the CXF
dispatcher prepares arguments for the invocation of the service, it expects to find a message payload of
Object[] - that is, an Object array. In the case of the Currency Convertor, this should be an array of two
Objects - the "from" currency and the "to" currency.
There are several ways to construct this object array, but the easiest way is to use the custom
transformer StringToObjectArrayTransformer , which translates a delimited String into an Object array. In
the example below, you simply type in a String in the format of <fromCurrency>,<toCurrency>.
<model name="sample">
<service name="inputService">
<inbound>
<inbound-endpoint address="stdio://System.in?promptMessage=Enter from and to currency symbols,
separated by a comma:"
synchronous="true">
<transformers>
<!-- Convert the input to an object array -->
<custom-transformer class="org.mule.transformer.simple.StringToObjectArray">
<spring:property name="delimiter" value=","/>
</custom-transformer>
</transformers>
</inbound-endpoint>
</inbound>
<outbound>
<chaining-router>
<outbound-endpoint address="wsdl-cxf:http://www.webservicex.net/CurrenyConvertor.asmx?
WSDL&method=ConversionRate"
synchronous="true"/>
<outbound-endpoint address="stdio://System.out"/>
</chaining-router>
</outbound>
</service>
</model>
</mule>
For example, type "EUR,USD" to get the conversion rate for Euros to US Dollars, and you'll get something
like this:
XMPP Transport
The XMPP transport enables the XMPP (Jabber) instant messaging protocol. The XMPPS connector
provides a secure implementation.
Inbound Endpoint
Attributes of <inbound-endpoint...>
user string no
password string no
host string no
recipient string no
groupChat boolean no
nickname string no
resource string no
thread string no
to string no
from string no
Outbound Endpoint
Attributes of <outbound-endpoint...>
user string no
password string no
host string no
recipient string no
nickname string no
resource string no
thread string no
to string no
from string no
Endpoint
Attributes of <endpoint...>
user string no
password string no
host string no
recipient string no
groupChat boolean no
nickname string no
resource string no
thread string no
to string no
from string no
</mule>
http://www.mulesource.org/schema/mule/xmpps/2.0 http://www.mulesource.org/schema/mule/xmpps/2.0/
mule-xmpps.xsd
Transformers
There are two transformers provided with the XMPP transport:
Transformer Description
org.mule.transport.xmpp.transformers.XmppPacketToString
Converts an XMPP Packet to a String, returning a
java.lang.String object.
org.mule.transport.xmpp.transformers.ObjectToXmppPacket
Accepts a String or an XMPP Packet and returns
an XMPP Packet. This transformer doesn't accept
all objects, only Strings and XMPP Packets.
As you build your Mule application, it is important to think critically about how best to architect your
application to achieve the desired availability, fault tolerance, and performance characteristics. This page
outlines some of the solutions for achieving the right blend of these characteristics through clustering
and other techniques. There is no one correct approach for everyone, and designing your system is both
an art and a science. If you need more assistance, MuleSource Professional Services can help you by
reviewing your architecture plan or designing it for you. For more information, contact us.
About Clustering
Clustering an application is useful for achieving the following:
• High availability (HA): Making your system continually available in the event that one or more
servers or a data center fails.
• Fault tolerance (FT): The ability to recover from failure of an underlying component. Typically, the
recovery is achieved through transaction rollback or compensating actions.
This page describes several possible clustering solutions. Please note that as of the current release,
MuleSource does not support any specific clustering solution, although many users have successfully set
up Mule in a clustered environment.
JMS Queues
JMS can be used to achieve HA & FT by routing messages through JMS queues. In this case, each
message is routed through a JMS queue whenever it moves from component to component.
Pros:
• Easy to do
• Well understood by developers
Cons:
Load Balancers
Load balancers simply route requests to different servers based on the the current load of each server
and which servers are currently up. Load balancers can be software or hardware based. This approach is
commonly used with clustered databases (see below).
• Straightforward to do
• Well understood by developers
Cons:
Pros:
• Straightforward to do
• Well understood by developers
Cons:
One common example of this is an aggregator component. For example, assume you have an aggregator
that is aggregating messages from two different producers. Producer #1 sends a message to the
aggregator, which receives it and holds it in memory until Producer #2 sends a message.
If the server with the aggregator goes down between Producer #1 sending a message and Producer #2
sending a message, Producer #2 can't just send its message to a different server because that server will
not have the message from Producer #1.
The solution to this is to share the state of the aggregator component across different machines through
clustering software such as Terracotta, Tangosol Coherence, JGroups, etc. By using one of these tools,
Producer #2 can simply fail over to a different server. Note that MuleSource has not tested Mule with
these tools and does not officially support them.
Pros:
Cons:
Example Architectures
In this example architecture, HTTP requests come in through a load balancer and are immediately put on
a JMS queue. The JMS queue is clustered between the different servers. A server will start processing a
message off the JMS queue and wrap everything in a transaction.
Note: If the HTTP connection is open for the duration of this process, this approach will not work, as the
load balancer will not transparently switch connections between servers. In this case, the HTTP client will
need to retry the request.
Terracotta
Terracotta is an open source JVM clustering technology. It is able to replicate the state of your
components across JVMs. In this example architecture, there is a load balancer that is proxying requests
between multiple servers.
If one of the servers goes down, the load balancer automatically routes requests to a server that is up.
Because all the state of your components is shared between the different servers, your internal process
can continue on another server.
Note: If the HTTP connection is open for the duration of this process, this approach will not work, as the
load balancer will not transparently switch connections between servers. In this case, the HTTP client will
need to retry the request.
Related topics
There are many other topics that are important to discuss around clustering:
Configuration Overview
[ Configuration Files ] [ Configuration Builders ] [ Accessing the Configuration Programmatically ]
By default, Mule starts up with a simple configuration in which only some system-level services are
configured. You must configure services, transports, and the rest of the elements required for your
application. Following is an overview of configuration in Mule.
Configuration Files
In most cases, you will configure Mule using XML files. These files are based on Spring and make it very
easy to set up your Mule instance in a short time. For complete information on setting the options in the
configuration file, see XML Configuration.
When you start Mule from the command line, you simply specify the configuration file(s) with the -
config parameter:
If you want to start Mule by calling it from your code, you specify the configuration file as a parameter to
the ConfigurationBuilder:
If you have multiple configuration files, you can also import them into one configuration file so that you
only have to specify one configuration file at the command line or from your code. For example:
Configuration Builders
The configuration builder is responsible for creating the configuration that's used at run time from the
configuration files you provide. Mule provides two standard configuration builders, or you can create your
own.
SpringXmlConfigurationBuilder
The default configuration builder used to configure Mule is the SpringXmlConfigurationBuilder. This
configuration builder uses Spring 2.0 to configure Mule based on one or more XML files leveraging custom
Mule namespaces. For more information, see XML Configuration.
ScriptConfigurationBuilder
This configuration builder allows a JSR-223 compliant script engine (e.g., Groovy, Jython) to configure
Mule. For more information, see Scripting Module.
You can easily create your own custom configuration builder by implementing the ConfigurationBuilder
interface, which has a method configure. Typically, you call configure(MuleContext
muleContext.getRegistry()) to get access to Mule's internal registry, which contains the configuration
information, and to register services and other elements.
In most cases, you will want to inherit from the class AbstractResourceConfigurationBuilder , which
will make any configuration files specified on the command line available in an instance variable called
configResources.
You can also specify the configuration builder as a parameter to the MuleContextFactory when starting
Mule programatically:
Configuration Reference
• Global Settings Configuration Reference
• Model Configuration Reference
• Service Configuration Reference
• Endpoint Configuration Reference
• Routers
° Inbound Router Configuration Reference
° Outbound Router Configuration Reference
° Asynchronous Reply Router Configuration Reference
° Catch All Strategy Configuration Reference
For configuration reference on transports, see Available Transports. For modules, see Using Mule Modules.
For transports and modules contributed by the community, see MuleForge Active Projects.
<single-async-reply-router ...>
Configures a Single Response Router. This will return the first message it receives on a reply endpoint and
will discard the rest.
Attributes
Child Elements
<collection-async-reply-router ...>
Configures a Collection Response Router. This will return a MuleMessageCollection message type that will
contain all messages received for the current correlation.
Child Elements
<custom-async-reply-router ...>
Attributes
Child Elements
spring:property 0..*
<logging-catch-all-strategy ...>
Does nothing with the message but simply logs (using the WARN log level) the fact that the message was
not dispatched because no routing path was defined.
Attributes
Child Elements
<custom-catch-all-strategy ...>
Attributes
Child Elements
spring:property 0..*
<forwarding-catch-all-strategy ...>
Forwards the message to the specified endpoint if no outbound routers match.
Child Elements
<custom-forwarding-catch-all-strategy ...>
Attributes
Child Elements
spring:property 0..*
<component ...>
A simple POJO (Plain Old Java Object) component that will be invoked by Mule when a message is
received. The instance can be specified via a factory, or via a class.
Attributes
Child Elements
interceptor-stack 1..1
abstract-object-factory 0..1
abstract-lifecycle-adapter- 0..1
factory
<pooled-component ...>
A pooled POJO (Plain Old Java Object) component that will be invoked by Mule when a message is
received. The instance can be specified via a factory, or via a class.
Attributes
Child Elements
interceptor-stack 1..1
abstract-object-factory 0..1
abstract-lifecycle-adapter- 0..1
factory
<pooling-profile ...>
A pooling profile is used to configure the pooling behaviour of Mule components. Each service sets its own
pooling profile. The org.mule.config.PoolingProfile class contains all the necessary values to create a pool
of component proxies.
Attributes
exhaustedActionWHEN_EXHAUSTED_GROW no WHEN_EXHAUSTED_GROW
Specifies the
/ behavior of the
WHEN_EXHAUSTED_WAIT Mule component
/ pool when the
WHEN_EXHAUSTED_FAIL pool is exhausted.
Possible
values are:
"WHEN_EXHAUSTED_FAIL",
which will throw a
NoSuchElementException,
"WHEN_EXHAUSTED_WAIT",
which will
block (invoke
Object.wait(long))
until a new or
idle object is
available, or
WHEN_EXHAUSTED_GROW,
which will create
a new Mule
and return
it, essentially
making maxActive
meaningless. If a
positive maxWait
value is supplied,
it will block for at
most that many
milliseconds,
after which a
NoSuchElementException
will be thrown. If
maxThreadWait
is a negative
value, it will block
indefinitely.
<bridge-component ...>
This transfers a message from inbound to outbound endpoints. This name is provided for backwards
compatability - it is equivalent to not specifying any component.
Attributes
Child Elements
interceptor-stack 1..1
<echo-component ...>
This logs the message and returns the payload back as the result.
Attributes
Child Elements
interceptor-stack 1..1
<log-component ...>
This logs the message content (or content length if it is a large message).
Child Elements
interceptor-stack 1..1
<null-component ...>
This will throw an exception if it receives a message.
Attributes
Child Elements
interceptor-stack 1..1
<spring-object ...>
Attributes
Child Elements
<singleton-object ...>
Attributes
Child Elements
<prototype-object ...>
Attributes
Child Elements
Attributes
Child Elements
<interceptor-stack ...>
Attributes
Child Elements
<timer-interceptor ...>
The timer interceptor (ported from 1.x).
Attributes
Child Elements
<logging-interceptor ...>
The logging interceptor (ported from 1.x).
Child Elements
<custom-interceptor ...>
A user-implemented interceptor.
Attributes
Child Elements
spring:property 0..*
<custom-lifecycle-adapter-factory ...>
Attributes
Child Elements
<binding ...>
A binding associates a Mule endpoint with an injected Java interface. This is like using Spring to inject a
bean, but instead of calling a method on the bean a message is sent to an endpoint.
Child Elements
<inbound-endpoint ...>
An inbound endpoint receives messages from the associated transport. Each transport implements its
own inbound endpoint element, with a more friendly syntax, but this generic element can be used with
any transport by supplying the correct address URI. For example, "vm://foo" describes a VM transport
endpoint.
Attributes
Child Elements
<outbound-endpoint ...>
An outbound endpoint sends messages to the associated transport. Each transport implements its own
outbound endpoint element, with a more friendly syntax, but this generic element can be used with
any transport by supplying the correct address URI. For example, "vm://foo" describes a VM transport
endpoint.
Attributes
Child Elements
<endpoint ...>
An endpoint "template" that can be used to construct an inbound or outbound endpoint elsewhere in the
configuration by referencing the endpoint name. Each transport implements its own endpoint element,
with a more friendly syntax, but this generic element can be used with any transport by supplying the
correct address URI. For example, "vm://foo" describes a VM transport endpoint.
Attributes
Child Elements
<default-service-exception-strategy ...>
Provide default exception handling via an endpoint.
Attributes
Child Elements
<default-connector-exception-strategy ...>
Provide default exception handling via an endpoint.
Attributes
Child Elements
Attributes
Child Elements
spring:property 0..*
[ Filter ] [ Not Filter ] [ And Filter ] [ Or Filter ] [ Wildcard Filter ] [ Expression Filter ] [ Regex Filter ] [
Message Property Filter ] [ Exception Type Filter ] [ Payload Type Filter ] [ Custom Filter ] [ Encryption
Security Filter ]
Filter
A filter that is defined elsewhere (at the global level, or as a Spring bean).
Attributes of <filter...>
Not Filter
Invert the enclosed filter (so if it returns true for some message, this will return false, and vice-versa).
And Filter
Return true only if all the enclosed filters return true.
Or Filter
Return true if any of the enclosed filters returns true.
Wildcard Filter
A filter that matches string messages against wildcards. It performs matches with "", for example,
"jms.events." would catch "jms.events.customer" and "jms.events.receipts". This filter accepts a
comma-separated list of patterns, so more than one filter pattern can be matched for a given argument:
"jms.events., jms.actions." will match "jms.events.system" and "jms.actions" but not "jms.queue".
Expression Filter
A filter that can evaluate a range of expressions. It supports some base expression types such as header,
payload (payload type), regex, and wildcard.
Attributes of <expression-filter...>
Regex Filter
A filter that matches string messages against a regular expression. The Java regular expression engine
(java.util.regex.Pattern) is used.
Attributes of <regex-filter...>
Attributes of <message-property-filter...>
Attributes of <exception-type-filter...>
Attributes of <payload-type-filter...>
Custom Filter
A user-implemented filter.
spring:property 0..*
Attributes of <encryption-security-filter...>
<configuration ...>
Defaults and general settings for the entire Mule system.
Attributes
defaultSynchronousEndpoints
boolean no false If true then
connections to
endpoints will wait
for a response.
defaultSynchronousEventTimeout
string no 3000 The default period
(ms) to wait for
a synchronous
response.
Child Elements
<idempotent-receiver-router ...>
Ensures that only unique messages are received by a service by checking the unique ID of the
incoming message. Note that the ID used can be generated from the message using an expression
defined in the {{idExpression}} attribute. By default, the expression used is #\[message:id\], which
means the underlying endpoint must support unique message IDs for this to work. Otherwise, a
{{UniqueIdNotSupportedException}} is thrown.
Attributes
Child Elements
<idempotent-secure-hash-receiver-router ...>
Ensures that only unique messages are received by a service by calculating the hash of the message
itself using a message digest algorithm. This provides a value with an infinitesimally small chance of a
collision. This can be used to filter message duplicates. Keep in mind that the hash is calculated over
the entire byte array representing the message, so any leading or trailing spaces or extraneous bytes
(like padding) can produce different hash values for the same semantic message content. Care should be
taken to ensure that messages do not contain extraneous bytes. This class is useful when the message
does not support unique identifiers.
Attributes
Child Elements
<wire-tap-router ...>
The WireTap inbound router allows you to route certain messages to a different endpoint as well as to the
component.
Attributes
Child Elements
<forwarding-router ...>
Allows messages to be forwarded to the outbound routers without first being processed by a component.
Attributes
transformFirst boolean no
Child Elements
<selective-consumer-router ...>
Applies one or more filters to the incoming message. If the filters match, the message is forwarded to the
component. Otherwise, the message is forwarded to the catch-all strategy on the router. If no catch-all
strategy is configured, the message is ignored and a warning is logged.
Attributes
transformFirst boolean no
<correlation-resequencer-router ...>
Holds back a group of messages and resequences them using each message's correlation sequence
property.
Attributes
timeout integer no
Child Elements
<message-chunking-aggregator-router ...>
Combines two or more messages into a single message by matching messages with a given Correlation
ID. Correlation IDs are set on messages when they are dispatched by certain outbound routers, such as
the Recipient List and Message Splitter routers. These messages can be aggregated back together again
using this router.
Attributes
timeout integer no
<custom-correlation-aggregator-router ...>
Configures a custom message aggregator. Mule provides an abstract implementation that has a template
method that performs the message aggregation. A common use of the aggregator router is to combine
the results of multiple requests such as "ask this set of vendors for the best price of X".
Attributes
timeout integer no
Child Elements
<collection-aggregator-router ...>
Configures a Collection Response Router. This will return a MuleMessageCollection message type that will
contain all events received for a each correlation group.
timeout integer no
Child Elements
<custom-inbound-router ...>
Allows for custom inbound routers to be configured.
Attributes
Child Elements
spring:property 0..*
<model ...>
The default model is a SEDA model.
Attributes
Child Elements
Queue Profile
Specifies the properties of an internal Mule queue. Internal queues are used to queue messages for each
component managed by Mule.
Attributes of <queue-profile...>
maxOutstandingMessages
integer no Defines the
maximum number
of messages that
can be queued.
Exception Strategy
See Exception Strategy Configuration Reference.
Service
See Service Configuration Reference.
Notifications
Register listeners for notifications and associate interfaces with particular events.
Attributes of <notifications...>
Notification Types
You can specify the following types of notifications using the event attribute of the <notification>
element:
"CONTEXT"
"MODEL"
"SERVICE"
"SECURITY"
"ENDPOINT-MESSAGE"
"COMPONENT-MESSAGE"
"MANAGEMENT"
"CONNECTION"
"REGISTRY"
"CUSTOM"
"EXCEPTION"
"TRANSACTION"
"ROUTING"
<pass-through-router ...>
This router always matches and simply sends or dispatches message via the endpoint that is configured.
Attributes
Child Elements
<filtering-router ...>
Uses filters to determine whether the message matches a particular criteria and if so will route the
message to the endpoint configured on the router.
Child Elements
<template-endpoint-router ...>
Allows endpoints to be altered at runtime based on properties set on the current message or fallback
values set on the endpoint properties. Templated values are expressed using square braces around a
property name.
Child Elements
<chaining-router ...>
Sends the message through multiple endpoints using the result of the first invocation as the input for the
next.
Child Elements
<exception-based-router ...>
Sends a message over an endpoint by selecting the first endpoint that can connect to the transport.
Child Elements
<multicasting-router ...>
Sends the same message over multiple endpoints.
Child Elements
<endpoint-selector-router ...>
// TODO
Child Elements
<list-message-splitter-router ...>
Accepts a list of objects that will be routed to different endpoints. The actual endpoint used for each
object in the list is determined by a filter configured on the endpoint itself.
Attributes
Child Elements
<expression-splitter-router ...>
Splits the message based on an expression. The expression must return one or more message parts in
order to be effective.
Attributes
<message-chunking-router ...>
Allows you to split a single message into a number of fixed-length messages that will all be routed to the
same endpoint.
Attributes
numberOfMessages integer no
Child Elements
<static-recipient-list-router ...>
Sends the same message to multiple endpoints over the same endpoint or to implement routing-slip
behaviour where the next destination for the message is determined from message properties or the
payload. It uses a static list of recipient endpoints, which are specified via the attribute recipientsProperty
and delimited by the attribute recipientsDelimieter.
recipientsProperty string no
recipientsDelimiter string no
synchronous boolean no
Child Elements
recipients 0..1
Attributes
synchronous boolean no
Child Elements
recipients 0..1
<custom-outbound-router ...>
Allows you to configure a custom outbound router by specifying the custom router class and by using
Spring properties.
Child Elements
spring:property 0..*
Global Property
A global property is a named string. It can be inserted in most attribute values using the #[...] syntax. So
the attribute value "#[foo]" would be replaced by the value associated with the property named "foo".
Attributes of <global-property...>
Property
Sets a Mule property. This is a name/value pair that can be set on components, services, etc., and
which provide a generic way of configuring the system. In Mule 2.x, you shouldn't need to use a generic
property like this, since almost all functionality is exposed via dedicated elements. However, it can
be useful in configuring obscure or overlooked options and in configuring transports from the generic
endpoint elements.
Attributes of <property...>
key string no
value string no
Properties
Sets Mule properties. These are name/value pairs that can be set on components, services, etc., and
which provide a generic way of configuring the system. In Mule 2.x, you shouldn't need to use generic
properties like this, since almost all functionality is exposed via dedicated elements. However, they can
be useful in configuring obscure or overlooked options and in configuring transports from the generic
endpoint elements.
Attributes of <jndi-provider-property...>
key string no
value string no
<service ...>
The standard SEDA service. A service describes how to receive messages, deliver them to a component,
and handle the results (if any).
Attributes
Child Elements
<custom-service ...>
A user-implemeted service (typically used only in testing).
Attributes
<description ...>
This can hold any kind of documentation consistent with the overall XML format). It is intended to be
"human readable" only and is not used by the system.
Attributes
Child Elements
<description ...>
This can hold any kind of documentation consistent with the overall XML format). It is intended to be
"human readable" only and is not used by the system.
Child Elements
<inbound ...>
The elements within "inbound" describe how a service receives messages.
Attributes
Child Elements
<outbound ...>
The elements within "outbound" describe how a services sends or dispatches messages.
Child Elements
<async-reply ...>
The elements within "async-reply" describe how asynchronous replies are handled.
Attributes
Child Elements
<queue-profile ...>
Specifies the properties of an internal Mule queue. Internal queues are used to queue messages for each
component managed by Mule.
Attributes
Child Elements
Exception Strategy
See Exception Strategy Configuration Reference.
Component
See Component Configuration Reference.
Attributes of <abstract-transaction...>
Attributes of <custom-transaction...>
Xa Transaction
Allow access to XA transactions.
Attributes of <websphere-transaction-manager...>
Attributes of <jboss-transaction-manager...>
Attributes of <jrun-transaction-manager...>
Attributes of <resin-transaction-manager...>
Attributes of <jndi-transaction-manager...>
spring:property 0..*
<mule xmlns="http://www.mulesource.org/schema/mule/core/2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:vm="http://www.mulesource.org/schema/mule/vm/2.0"
xsi:schemaLocation="
http://www.mulesource.org/schema/mule/core/2.0 http://www.mulesource.org/schema/mule/core/2.0/
mule.xsd
http://www.mulesource.org/schema/mule/vm/2.0 http://www.mulesource.org/schema/mule/vm/2.0/mule-
vm.xsd">
<model name="main">
<service name="myBasicService">
<inbound>
<inbound-endpoint ref="CustomerRequests"/>
</inbound>
<component class="com.acme.service.BasicService"/>
<outbound>
<outbound-pass-through-router>
<outbound-endpoint ref="CustomerResponses" transformer-refs="ThisToThat"/>
</outbound-pass-through-router>
</outbound>
</service>
Advanced Configuration
Other, more advanced things you may configure at this level:
• Agents - Agents are typically used for cross-cutting concerns such as logging or management
• Notifications - Be notified upon certain lifecycle events
• Security Manager - Authenticates requests based on one or more security providers
• Transaction Management - Mule transactions are configured on inbound endpoints, where an
endpoint can be configured to start a new transaction or join an existing one.
• Global Configuration Options - Miscellaneous global settings
• Global Properties - Placeholder values
Configuring Endpoints
[ Basic Configuration ] [ Endpoint Usage ] [ Global Endpoints ]
Endpoints are used to connect services. An endpoint is a specific channel on which a service can send
messages and from which another service can receive messages. For example, a purchasing component
may receive an order request over HTTP. Once the order has been processed by the component, a JMS
message may be sent over a topic to notify an auditing system, and a response can be sent back over
HTTP.
This page describes how to configure an endpoint. For details on the various attributes and elements you
can configure on an endpoint, see Endpoint Configuration Reference.
Basic Configuration
In its most basic form, an endpoint consists of a transport and a transport-specific channel/destination/
resource used to identify the channel and location where two services can exchange information. For
example:
URI-style Endpoints
<inbound-endpoint address="udp://localhost:65432"/>
<jetty:inbound-endpoint address="http://localhost:60211/mycomponent1" synchronous="true" />
<outbound-endpoint address="smtp://user:[email protected]"/>
<inbound-endpoint address="jms://test.queue"/>
Traditionally, endpoints in Mule have been specified as a URI such as the examples above. This form is
still supported, and indeed may prove to be more practical depending on your application. However, as of
Mule 2.0, the recommended way to specify endpoints is via transport-specific namespaces, as shown in
the following examples.
Transport-specific Endpoints
<file:inbound-endpoint path="./.mule/in"
comparator="org.mule.transport.file.comparator.OlderFirstComparator" reverseOrder="true"/>
<ssl:endpoint name="clientEndpoint" host="localhost" port="60198" synchronous="true"/>
<jetty:endpoint name="serverEndpoint" host="localhost" port="60203" path="services/Foo"
synchronous="false" />
<imaps:endpoint name="global1s" host="localhost" password="secret" port="123" user="bob"/>
<rmi:endpoint name="BadType" host="localhost" port="1099" object="MatchingUMO"
method="reverseString"/>
<quartz:endpoint name="qEP6" repeatCount="10" repeatInterval="1000" jobName="job"/>
<jms:inbound-endpoint queue="test.queue"/>
Properties
Properties on endpoints can be used to customize behavior. Any properties set on the endpoint can
be used to overload default properties on the associated transport's connector. For example, an SMTP
outbound endpoint might set the fromAddress property to workflow1 to override a default connector
value of sysadmin. Any standard properties for an endpoint will be available as attributes in the XML
schema if transport-specific endpoints are used. It is also possible to specify a non-standard property. For
example:
Setting properties
Connector
In many cases, the connector associated with an endpoint can simply be assumed based on the transport
and created implicitly. However, if more than one connector of the same transport exists, or if non-
default settings are used for the connector, you must refer to the connector from the endpoint using the
connector-ref attribute.
Specifying a connector
Filter
An endpoint can contain a filter to selectively ignore certain messages. The filter can be transport-specific
such as a JMS selector or file filter or can be a general-purpose filter such as JXPath. Filtering is not
supported by all transports, and setting a filter on an endpoint using some transports will result in an
UnsupportedOperationException. For more information, see Using Filters.
Filter example
<jms:endpoint queue="in.queue">
<jms:selector expression="JMSPriority > 5"/>
</jms:endpoint>
Transaction
A transaction can begin or commit when an event is received or sent via an endpoint. The endpoint must
be synchronous, and transaction support depends largely on the particular transport being used. For
more information see Transaction Management.
Transaction example
<jms:inbound-endpoint queue="in">
<jms:transaction action="BEGIN_OR_JOIN"/>
</jms:inbound-endpoint>
Endpoint Usage
Endpoints can be used in the following places:
• Inbound Routers
• Outbound Routers
• Services
• Catch-all Strategies
• Exception Strategies
Inbound Routers
Inbound router
<service name="Receiver">
<inbound>
Outbound Routers
Outbound routers
<service name="MessageChunker">
<inbound>
<jms:inbound-endpoint queue="big.messages"/>
</inbound>
<outbound>
<message-chunking-router messageSize="10">
<jms:outbound-endpoint queue="small.chunks"/>
</message-chunking-router>
</outbound>
</service>
<service name="LenderGatewayService">
<inbound>
<inbound-endpoint ref="LenderGateway" />
</inbound>
<outbound>
<chaining-router>
<outbound-endpoint remoteSync="true" ref="LenderService" />
<outbound-endpoint ref="BankingGateway" transformer-refs="SetLendersAsRecipients
ObjectToJMSMessage" />
</chaining-router>
</outbound>
</service>
Services
As a shortcut, endpoints can be configured directly on the service without a router in some cases.
Implicit router
<service name="Echo">
<inbound>
<!-- Inbound router is implicit -->
<stdio:inbound-endpoint system="IN"/>
</inbound>
<echo-component/>
<outbound>
<!-- Outbound router is explicit -->
<outbound-pass-through-router>
<stdio:outbound-endpoint system="OUT"/>
</outbound-pass-through-router>
</outbound>
</service>
Catch-all Strategies
A single "catch-all" endpoint can be configured for certain types of routers. See Using Message Routers.
Catch-all strategy
<service name="dataService">
Exception Strategies
A single error endpoint can be configured on an exception strategy. See Error Handling.
Exception strategy
<service name="dataService">
<inbound>
...cut...
</inbound>
<component class="com.acme.DataProcessor"/>
<outbound>
...cut...
</outbound>
<default-service-exception-strategy>
<jms:outbound-endpoint queue="error.queue"/>
</default-service-exception-strategy>
</service>
Global Endpoints
Global endpoints, while not required, are a recommended best practice for having a nicely organized
configuration file. A global endpoint can be thought of as a template for shared endpoint configuration.
Global endpoints can be used as they are defined globally, or they can be extended by adding more
configuration attributes or elements.
To reference a global endpoint, use the usual <inbound-endpoint> and <outbound-endpoint> elements,
and specify the global endpoint name using the ref attribute.
<model>
<service name="Priority1">
<file:inbound-endpoint ref="fileReader" path="/var/prio1"/>
...cut...
</service>
<service name="Priority2">
<file:inbound-endpoint ref="fileReader" path="/var/prio2"/>
...cut...
</service>
</model>
In the above example, the "fileReader" endpoint is used as a template for the inbound endpoints. The
properties reverseOrder and comparator only need to be declared once, and the property path changes
for each inbound endpoint.
Mule Endpoint URIs are any valid URI and describe how to connect to the underlying transport. Most
connectors in Mule can be created from an endpoint URI except where not enough connection information
can be expressed clearly in a URI, such as JMS connection properties. Endpoint URIs are set on Mule
Endpoints, which manage other connection instance information such as filters and transactions.
Mule Endpoint URIs usually appear in one of the following forms, although other provider
implementations can introduce their own schemes.
scheme://host[:port]//[address][?params]
The scheme must always be set. The host and port are set for endpoints that use unwrapped socket
based communications such as the TCP, UDP, HTTP, or multicast.
udp://localhost:65432
scheme://[username][:password]@host[:port][?params]
The user name and password are used to log in to the remote server specified by the host and port
parameters. The POP3 and SMTP connectors use this format or URI.
pop3://ross:[email protected]
smtp://ross:[email protected]
scheme://address[?params]
Here we only define a protocol and an address. This tells Mule to get a connector that handles the
specified scheme, or create one if needed, and to create a new endpoint using the specified address.
vm://my.queue
URI Parameters
There are two types of parameters you can set on the URI:
1. Known Mule parameters that control the way the endpoint is configured, such as transformers for
the endpoint.
2. Properties to be set on the connector or to be associated with the transport. This allows you to
set properties on a connector used by this endpoint. Additionally, all properties will be associated
with the transport, so you can mix connector and transport properties. For more information, see
Configuring Endpoints.
Known Parameters
Property Description
For example:
file:///C:/temp?transformers=FileToString,XmlToDom
jms://jmsEndpoint/topic:my.topic?connector=WMQConnector
Other Parameters
Any other parameters set on the URI will be set on the connector if a connector is created and also set on
the endpoint itself as properties.
Endpoint Encoding
When using XML configuration, certain character entities defined in the W3C SGML specification need
to be escaped to their SGML code. The most relevant are listed here. Don't forget to remove the space
before the ';'.
For characters such as > < " % #, the notation will be resolved and cause the constructor for the URI to
throw an exception. To use one of these characters, you can specify %HEXNUMBER
Additionally, for connectors such as Axis, FTP, and the Email connectors, if your login credentials include
@, you must escape it using %40. For example, instead of these URIs:
axis:http://wsuser@username:password@localhost/services/services/Version?method=getVersion
ftp://username:password@ftpserver
smtp://'[email protected]':'123456'@mailserver?address=QA
axis:http://wsuser%40username:password%40localhost/services/services/Version?method=getVersion
ftp://username:password%40ftpserver
smtp://'sender%40mydomain.com':'123456'%40mailserver?address=QA
Using Filters
[ Standard Filters ] [ Transport and Module Filters ] [ Creating Custom Filters ]
Filters specify conditions that must be met for a message to be routed to a service. There are several
standard filters that come with Mule that you can use, or you can create your own filters.
You can create a global filter and then reference it from your services. Global filters require the "name"
attribute, whereas filters configured on endpoints or routers do not.
<model>
<service>
<inbound>
<tcp:inbound-endpoint host="locahost" port="1234">
<!-- Here we reference the filter defined globally using it for this endpoint -->
<filter ref="payloadFilter"/>
</tcp:inbound-endpoint>
</inbound>
<echo-component/>
<service>
</model>
For reference to the configuration of each filter, see Filters Configuration Reference.
Standard Filters
Mule includes the following standard filters that you can apply to your routers:
• RegEx Filter
• Wildcard Filter
• Exception Type Filter
• Message Property Filter
• Logic Filters
• ° And Filter
° Or Filter
° Not Filter
<payload-type-filter expectedType="java.lang.String">
Expression Filter
Evaluates a range of expressions. Use the evaluator attribute to specify the expression evaluator to
use, one of the following: header, payload-type, exception-type, wildcard, regex, ognl, xpath, jxpath,
bean, groovy, or custom. Use the expression attribute to set the actual expression. If the expression
type is xpath, bean, or ongl, the expression should be a boolean. If the expression type is custom, set
the customEvaluator attribute to the name of the custom evaluator, which must be registered with the
Optionally, set the nullReturnsTrue attribute to true if you want to return true whenever the
expression is null.
JXPath is an XPath interpreter that can apply XPath expressions to XML DOM objects or any other object
graph. For more information about JXPath, see the JXpath user guide, JXPath tutorial, or XPath tutorial.
You can also use the JXPath filter from the XML module, which supports some additional properties.
OGNL is a simple yet very powerful expression language for plain Java objects. Similar to JXPath, it
works on object graphs, and thus the corresponding filter enables simple and efficient content routing for
payloads. For example:
or more simply:
<ognl-filter expression="[MULE:0].equals(42)"/>
This filter would block any messages whose payloads are not arrays or lists and do not contain the value
42 as the first element.
RegEx Filter
Applies a regular expression pattern to the message payload. The filter applies toString() to the
payload, so you might also want to apply a PayloadTypeFilter to the message using an AndFilter to make
sure the payload is a String.
Wildcard Filter
Applies a wildcard pattern to the message payload. The filter applies toString() to the payload, so you
might also want to apply a PayloadTypeFilter to the message using an AndFilter to make sure the payload
is a String.
For the string "the quick brown fox jumped over the lazy dog", the following patterns would match:
<exception-type-filter expectedType="java.lang.RuntimeException"/>
This filter allows you add logic to your routers based on the value of one or more properties of a
message. This filter can be very powerful because the message properties are exposed, allowing you to
By default, the comparison is case sensitive. You can set the caseSensitive attribute to override this
behavior.
The expression is always a key value pair. If you want to use more complex expressions, you can use the
logic filters. The following example shows two filters :
<and-filter>
<message-property-filter pattern="JMSCorrelationID=1234567890"/>
<message-property-filter pattern="JMSReplyTo=null"/>
</and-filter>
Logic Filters
There are three logic filters that can be used with other filters: And, Or, and Not. Logic filters can be
nested so that more complex logic can be expressed.
And Filter
An And filter combines two filters and only accepts the message if it matches the criteria of both filters.
<and-filter>
<payload-type-filter expectedType="java.lang.String"/>
<regex-filter pattern="the quick brown (.*)"/>
</and-filter>
Or Filter
The Or filter considers two filters and accepts the message if it matches the criteria of either one of the
filters.
<or-filter>
<payload-type-filter expectedType="java.lang.String"/>
<payload-type-filter expectedType="java.lang.StringBuffer"/>
</or-filter>
Not Filter
A Not filter accepts the message if it does not match the criteria in the filter.
<not-filter>
<payload-type-filter expectedType="java.lang.String"/>
</not-filter>
Configuring a Transport
You can configure a transport in the following ways:
• Define a connector configuration using the <connector> element in the Mule XML configuration file.
• Set transport properties on endpoints to customize the transport behavior for a single endpoint
instance.
• Use an endpoint URI that defines the scheme and connection information for the transport, such
as tcp://localhost:12345. See Mule Endpoint URIs for more information. The URI consists of the
protocol followed by transport-specific information, and then zero or more parameters to set as
properties on the connector.
This page describes the common properties for all transports. The actual configuration parameters for
each transport type are described separately for each transport. To see the details of a specific transport,
see Available Transports.
numberOfConcurrentTransactedReceivers
If No
createMultipleTransactedReceivers
is set to true, the number of
concurrent receivers that will be
launched.
Retry Policies
Retry policies are used to configure how a connector behaves when its connection fails. For complete
information, see Configuring Retry Policies.
• Service overrides
Attributes of <receiver-threading-profile...>
Attributes of <dispatcher-threading-profile...>
Service Overrides
Attributes of <service-overrides...>
transactedMessageReceiver
name (no spaces) no
xaTransactedMessageReceiver
name (no spaces) no
streamMessageAdapter
name (no spaces) no
If you are using the Enterprise Edition of Mule, there are several standard retry policies available that you
can configure using the Retry schema. If you are using the Community Edition of Mule, you must create
your own policies and configure them using standard Spring syntax rather than the Retry schema.
This section describes the retry policies you can configure directly in your XML by including the mule-
retry-ee.xsd schema. You import the schema as follows:
<mule xmlns="http://www.mulesource.org/schema/mule/core/2.1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:retry="http://www.mulesource.com/schema/mule/retry/2.1"
xsi:schemaLocation="
http://www.mulesource.org/schema/mule/core/2.1 http://www.mulesource.org/schema/mule/core/2.1/
mule.xsd
http://www.mulesource.com/schema/mule/retry/2.1 http://www.mulesource.com/schema/mule/retry/2.1/
mule-retry-ee.xsd">
Simple Policy
This policy allows the user to configure how many times a retry should
be attempted and how long to wait between retries.
Attributes of <simple-policy...>
For example:
<tcp:connector name="tcpConnector">
<retry:simple-policy count="5" frequency="1000"/>
</tcp:connector>
Forever Policy
Retry an infinite amount of times at the specified frequency.
For example:
<tcp:connector name="tcpConnector">
<retry:forever-policy frequency="5000"/>
</tcp:connector>
Custom Policy
A user-defined retry policy.
Attributes of <custom-policy...>
spring:property 0..*
For example:
<tcp:connector name="tcpConnector">
<retry:custom-policy class="org.mule.retry.test.TestRetryPolicyTemplate">
<spring:property name="fooBar" value="true"/>
<spring:property name="revolutions" value="500"/>
</retry:custom-policy>
</tcp:connector>
Retry Notifiers
A retry notifier is called upon each retry attempt and is also configurable.
Connect Notifier
Fires a ConnectionNotification upon each retry attempt.
For example:
<tcp:connector name="tcpConnector">
<retry:simple-policy>
<retry:connect-notifier/>
</retry:simple-policy>
</tcp:connector>
Attributes of <custom-notifier...>
spring:property 0..*
For example:
<tcp:connector name="tcpConnector">
<retry:simple-policy>
<retry:custom-notifier class="org.mule.retry.test.TestRetryNotifier">
<spring:property name="color" value="red"/>
</retry:custom-notifier>
</retry:simple-policy>
</tcp:connector>
The retry policy for a connector is used for both inbound and outbound connections. If you require
a different behavior for inbound and outbound connections, you can achieve this by configuring two
connectors with the different policies and reference them from the inbound and outbound endpoints,
respectively.
The default retry policy is used for any connector that does not have retry explicitly configured. You can
set the default policy using the <configuration> element:
<configuration>
<retry:simple-policy count="3"/>
</configuration>
package com.acme.retry;
<tcp:connector name="tcpConnector">
<spring:property name="retryPolicyTemplate">
<spring:bean class="com.acme.retry.AstronomicalRetryPolicyTemplate">
<spring:property name="totalPlanets" value="8"/>
</spring:bean>
</spring:property>
</tcp:connector>
Configuring Security
This page is under construction
Mule allows you to authenticate requests via endpoints using transport-specific or generic authentication
methods. It also allows you to control method-level authorization on your service components. The
Security Manager is responsible for authenticating requests based on one or more security providers.
There is a simple Mule security provider wrapper that delegates to Acegi, which means you can use any
of the Acegi security providers such as JAAS, LDAP, CAS (Yale Central Authenication service), and DAO.
All security is provided via the Mule security API , so you can easily plug in custom implementations.
<mule-configuration>
<security-manager>
<security-provider name="memory-dao"
className="org.mule.extras.acegi.AcegiProviderAdapter">
<properties>
<container-property name="delegate" reference="daoAuthenticationProvider"/>
</properties>
</security-provider>
</security-manager>
....
</mule-configuration>
Note that the 'delegate' property is a container property meaning we need a container to get it from.
Here we configure a Spring Container Context to load our Security Providers from. you can set multiple
security-provider elements.
<container-context
className="org.mule.extras.spring.SpringContainerContext">
<properties>
<property name="configFile" value="securityContext.xml"/>
</properties>
</container-context>
The Spring Acegi configuration is where the real Security Provider configuration occurs.
<beans>
<bean id="daoAuthenticationProvider"
class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">
<property name="userDetailsService">
<ref bean="inMemoryDaoImpl"/>
</property>
</bean>
Here we have a static DAO Security Provider that allows user credentials to be set in memory with two
users; ross and anon.
Encryption Strategies
The Security Manager can be configured with one or more Encryption strategies that can then be used
by encryption transformers, Security filters or secure Transport providers such as ssl or https. These
Encryption strategies can greatly simplify configuration for secure messaging as they can be shared
across components.
<security-manager>
<encryption-strategy name="PBE"
className="org.mule.impl.security.PasswordBasedEncryptionStrategy">
<properties>
<property name="password" value="mule"/>
</properties>
</encryption-strategy>
</security-manager>
This strategy can then be referenced by other components in the system such as filters or transformers.
<transformers>
<transformer name="EncryptedToByteArray"
className="org.mule.transformers.encryption.DecryptionTransformer">
<properties>
<property name="strategyName" value="PBE"/>
</properties>
</transformer>
</transformers>
Security Filters
Security filters can be configured on an object to either authenticate inbound requests or attach
credentials to outbound requests.
As the name suggests, these types of filters are configured on endpoints. To configure a Http Basic Auth
filter on a http endpoint use the following -
<endpoint address="http://localhost:4567">
<security-filter
className="org.mule.extras.acegi.filters.http.HttpBasicAuthenticationFilter">
<properties>
<property name="realm" value="mule-realm"/>
</properties>
</security-filter>
</endpoint>
When a request is received the Authentication header will be read from the request and authenticated
against all Security Providers on the Security Manager. If you only want to validate on certain ones you
can supply a comma-separated list of Security Provider names.
<endpoint address="http://localhost:4567">
<security-filter useProviders="default,another"
className="org.mule.extras.acegi.filters.http.HttpBasicAuthenticationFilter"/>
</endpoint>
• JAAS Security
• PGP Security
• Component Authorization Using Acegi
• Setting up LDAP Provider for Acegi
• Governance: provides a centralized control point for policy management and compliance, ensuring
that your SOA adheres to your firm's policies.
• Registry: automatically detects and displays dependencies among services and manages service
lifecycles.
• Repository: stores and manages artifacts (including Mule configuration files, web services
frameworks, and any other artifact), providing version management and collaborative comments,
and allows you to publish the artifacts in a web browser using the Atom Publishing Protocol.
Mule Galaxy can be deployed either alongside Mule or as a standalone component in an enterprise's SOA
infrastructure. Mule Galaxy is available with Mule Enterprise Edition.
For complete information on Mule Galaxy, see the Mule Galaxy site.
XML schema definitions are used for each module to define the objects and properties that the module
makes available to Mule. These configuration elements are introduced using a namespace for each
module and associating the namespace with the schema. This page describes how configuration is
handled in Mule and what steps are required when writing a new module or transport in Mule.
• Class names are removed from XML so that implementation details are hidden.
• All objects introduced by the module are self-contained by a namespace.
• The schema provides a domain-specific language (DSL) for the module where all objects and
properties are described in the schema with type validation.
• The schema can provide additional validation for types, value ranges, and required properties.
The Mule schema can be used directly or embedded inside Spring. In addition, Spring beans can be
created directly inside the Mule schema (just use <spring:bean .../>) and elements from other
namespaces can be placed in <other>...</other>.
When working inside Spring, the top-level element is <beans>, associated with the usual Spring beans
namespace. At the top of the XML file, there are two or more namespace declarations:
This tells the XML parser (and your IDE XML editor) to bind the default namespace (no namespace prefix)
to the Spring Beans namespace URI and the mule namespace to the Mule core namespace URI. The
schemaLocation attribute provides a list of namespace URIs and the location of where the schema can be
found.
To make another module available to your configuration, you add a new namespace declaration for it. For
example:
This approach is similar to the embedded within Spring approach, but the initial namespace is mule:
The Mule schema includes the ability to use Spring elements at certain points by including
<spring:bean> inside <mule>. These elements are handled explicitly by Mule code, which delegates their
processing to Spring.
Be careful when using Spring elements in your own schema, and check that they behave as expected.
The <bean> and <beans> elements are all forwarded to Spring for processing. In addition, the predefined
mule:mapType can be used and, when associated with the ChildMapDefinitionParser, will automatically
construct a map using Spring's <entry> elements (this is the only way that <entry> can be used
directly inside Mule elements). For examples, see the use of mapType in the Mule schema. Similar
behavior with ChildPropertiesDefinitionParser should also be possible (but ChildMapEntry and
ChildListEntryDefinitionParsers are unrelated to Spring).
Other namespaces can be introduced via <spring:beans> or by adding a dedicated element in a module
(see the Scripting module's <lang> element).
Documentation
You add documentation to the schema using the <xsd:annotation> and <xsd:documentation> tags:
While documentation can be added in various places within the schema, tools that use this information
follow certain conventions (see below). As a consequence, embedded documentation should:
IntelliJ Idea
Idea will show documentation defined for an element or attribute, or for the associated type if those
are missing. The information is displayed when the user presses Ctrl-Q. However, it will not display
"inherited" documentation or text associated with references.
Eclipse
The Web Tools Platform (WTP) XML editor shows documentation defined for an element or attribute, or
for the associated type if those are missing. The information is displayed when you press F2 when an
element or attribute is selected or has the cursor on it. The same information is also shown when using
the context-sensitive auto-completion functionality by pressing the "CTRL-." key combination.
The WTP XML editor will display "inherited" documentation but does not show documentation associated
with referenced global elements.
• Defining the XML Schema: Describes all the objects that your module exposes, such as
transformers, components, filters, routers, agents, etc.
• Writing the Namespace Handler: Responsible for configuring the XML parsers for each of the
elements that your schema defines.
• Writing a Definition Parser for each of the elements (objects) defined in the schema
• Testing your Namespace Handler
If you are not familiar with XML schema, you may want to take an introductory course here. However,
Mule defines most of what you need out of the box, so it's fairly straightforward to jump in and write your
own. Following are a few key concepts:
• Complex Types are defined for each object in the module. Complex types define the elements and
attributes that make up the type. For example, a connectorType would define shared attributes for
all connectors and define any nested elements such as <service-overrides>.
Note that complex types can be extended (much like inheritance), so new complex types can
be built upon existing ones. Mule provides a number of base complex types out of the box
for connectors, agents, transformers, and routers. If you write one of these, your schema
<xsd:import namespace="http://www.mulesource.org/schema/mule/core/2.0"/>
<xsd:complexType name="tcpConnectorType">
<xsd:complexContent mixed="true">
<xsd:extension base="mule:connectorType">
<xsd:attribute name="sendBufferSize" type="mule:substitutableInt"/>
<xsd:attribute name="receiveBufferSize" type="mule:substitutableInt"/>
<xsd:attribute name="receiveBacklog" type="mule:substitutableInt"/>
<xsd:attribute name="socketLinger" type="mule:substitutableInt"/>
<xsd:attribute name="sendTcpNoDelay" type="mule:substitutableBoolean"/>
<xsd:attribute name="tcpProtocolClassName" type="xsd:NMTOKEN"/>
<xsd:attribute name="sendTimeout" type="mule:substitutableInt"/>
<xsd:attribute name="receiveTimeout" type="mule:substitutableInt"/>
<xsd:attribute name="keepSendSocketOpen" type="mule:substitutableBoolean"/>
<xsd:attribute name="keepAlive" type="mule:substitutableBoolean"/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
This complex type extends the mule:connectorType type. Notice that we need to import the Mule
core schema since that is where the connectorType is defined.
Schema Types
Note that the types we use for int, boolean, and all numeric types are custom types
called substitutableInt or substitutableBoolean. These types allow for int values
and boolean values but also allow developers to use property placeholders, such
as ${tcp.keepAlive} as a valid value for the property. These placeholders will be
replaced at run-time by real values defined in property files.
Element definitions describe what elements are available in the schema. An element has a type, which
should be declared as a Complex Type. For example:
This makes the connector element available within the tcp namespace.
The schema should be called mule-<short module name>.xsd and stored in the META-INF of the module
or transport.
Versioning
In Mule, the version of the schema is maintained in the schema URI. This means that the namespace and
the targetNamespace implicitly contain the schema version. Schema URIs use the following convention:
http://www.mulesource.org/schema/mule/core/2.0
The first part of the URI http://www.mulesource.org/schema/mule/ is the same for each schema. It is
then followed by the module's short name, followed by the version of the schema.
Schema Mapping
To stop the XML parser from loading Mule schemas from the Internet, you add a mapping file that maps
the remote schema location to a local classpath location. This mapping is done in a simple properties file
called spring.schemas located in the META-INF directory for the module/transport.
spring.schemas
http\://www.mulesource.org/schema/mule/tcp/2.0/mule-tcp.xsd=META-INF/mule-tcp.xsd
The namespace handler is responsible for registering definition parsers, so that when an element in the
configuration is found, it knows which parser to use to create the corresponding object.
A namespace handler is a single class that is directly associated with a namespace URI. To make this
association, there needs to be a file called spring.handlers in the root of the META-INF directory of the
module or transport. The file contains the following:
spring.handlers
http\://www.mulesource.org/schema/mule/tcp/2.0=org.mule.providers.tcp.config.TcpNamespaceHandler
The TcpNamespaceHandler code is very simple because there is a base support class provided:
TcpNamespaceHandler.java
Here, there should be one or more registrations binding an element name with a definition parser.
Definition Parsers
The definition parser is where the actual object reference is created. It includes some Spring-specific
classes and terminology, so it's worth reading this introduction.
Mule already includes a number of useful definition parsers that can be used for most situations or
extended to suit your needs. You can also create a custom definition parser. The following table describes
the existing parsers. To see how they are used, see
org.mule.config.spring.handlers.MuleNamespaceHandler .
Parser Description
org.mule.config.spring.parsers.generic.OrphanDefinitionParser
Contructs a single, standalone bean from an
element. It is not injected into any other object.
This parser can be configured to automatically
set the class of the object, the init and destroy
methods, and whether this object is a singleton.
org.mule.config.spring.parsers.generic.ChildDefinitionParser
Creates a definition parser that will construct
a single child element and inject it into the
parent object (the enclosing XML element). The
parser will set all attributes defined in the XML
as bean properties and will process any nested
elements as bean properties too, except the
correct definition parser for the element will be
looked up automatically. If the class is read from
an attribute (when class is null), it is checked
against the constraint. It must be a subclass of
the constraint.
org.mule.config.spring.parsers.generic.ParentDefinitionParser
Processes child property elements in XML but
sets the properties on the parent object. This is
useful when an object has lots of properties and
it's more readable to break those properties into
groups that can be represented as a sub-element
in XML.
org.mule.config.spring.parsers.AbstractChildBeanDefinitionParser
This definition parser introduces the notion
of hierarchical processing to nested XML
elements. Definition parsers that extend
this class are always child beans that get
set on the parent definition parser. A single
method getPropertyName must be overriden
to specify the name of the property to set
on the parent bean with this bean. Note
that the property name can be dynamically
resolved depending on the parent element. This
implementation also supports collections and
Maps. If the bean class for this element is set to
MapEntryDefinitionParser.KeyValuePair, it is
assumed that a Map is being processed and any
child elements will be added to the parent Map.
org.mule.config.spring.parsers.AbstractMuleSingleBeanDefinitionParser
This parser extends the Spring provided
AbstractBeanDefinitionParser to provide
additional features for consistently customizing
bean representations for Mule bean definition
parsers. Most custom bean definition parsers
in Mule will use this base class. The following
enhancements are made:
Naming Conventions
The number and variety of definition parsers is growing rapidly. To make them more manageable, please
use the following conventions.
parent.
Testing the namespace handler is pretty simple. You configure the object in Mule XML, start the server,
and check that the values have been set correctly. For example:
}
}
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:import namespace="http://www.mulesource.org/schema/mule/core/2.0"
schemaLocation="http://www.mulesource.org/schema/mule/core/2.0/mule.xsd" />
<xsd:import namespace="http://www.mulesource.org/schema/mule/tcp/2.0"
schemaLocation="http://www.mulesource.org/schema/mule/tcp/2.0/mule-tcp.xsd"/>
Simple Recipe
The following recipe is sufficient for a simple transport (like UDP). The ordering helps guarantee complete
coverage.
Resources
• A useful set of PDF slides that give an overview of the new approach in Spring and (slides
29 on) given an introductory example. The Mule code is more complex, but follows the same
structure: org.mule.config.spring.handlers.MuleNamespaceHandler is the namespace handler;
org.mule.config.spring.parsers.AbstractMuleBeanDefinitionParser and subclasses are the
bean definition parsers.
• A couple of blog posts (1, 2) that give a developer's-eye overview.
• Useful papers on mutable/extensible containers 1, 2
Project Archetype
Mule provides Maven archetypes that you can use as code templates for your Mule projects. These
templates include a set of implementation notes and todo pointers that help you get started quickly. The
Mule project archetype will help you generate a tailored boilerplate project in seconds. If you want to
create a transport, use the Transport Archetype instead.
Follow the instructions below to create template files, including all the necessary Java boilerplate and
detailed implementation instructions in comments, for a new Mule project.
The project archetype is publicly available from the central maven repository.
Configuring Maven
Edit the file settings.xml (usually in $HOME/.m2) so that Maven will allow you to execute Mule plugins.
<settings>
...
<pluginGroups>
<pluginGroup>org.mule.tools</pluginGroup>
</pluginGroups>
...
</settings>
> cd yourDir
Next, you will execute the archetype and generate the code.
• artifactId: The short name for the project (such as 'myApp' or 'java6-extensions')
• muleVersion: The version of the Mule project archetype you want to use. This will also be the default
Mule version used for the generated artifact.
The plug-in will ask various questions (described below) and then generate the files. You can also use
this plug-in without user prompts by entering all the arguments at the command line. For a full list of
arguments that can be passed in, see the Command Line Options.
You should provide an accurate description of the project with any high-level details of what you can or
cannot do with it. This text will be used where a description of the project is required.
The version of Mule you want to use for your project. This will default to the archetype version passed in
on the command line.
If the project is going to be hosted on MuleForge, additional information will be added to your project for
linking to its issue tracker, web site, build server, and deployment information.
If your project offers configuration via XML, you should define an XML schema that defines how the
project is configured. If you do not use this option, users will have to use generic configuration to use
your project.
This should be a Java package path for you project, such as org/mule/modules/foo. Note that you must
use slashes for separators, not periods.
Specifies the type of project that will be created. Typically, the project structure will remain the same for
each project type, but the POM configuration may change to inherit from a different parent POM.
Will this project need to make objects available in the Registry as soon as it's loaded?
The registry bootstrap is a properties file that specifies class names of simple objects that can be made
available in the Mule Registry as soon as the module is loaded. This is useful for registering custom
transformers or property extractors.
The custom option allows you to deviate from the existing endpoint styles and parse your own.
[default:]
********************************************************************************
[INFO] muleVersion:
********************************************************************************
[default: 2.0.0]
********************************************************************************
[INFO] packagePath:
********************************************************************************
What is the base Java package path for this module? (i.e. org/mule/modules
or org/mule/examples):
[default: org/mule/applications]
********************************************************************************
[default: y]
********************************************************************************
[INFO] projectType:
********************************************************************************
[default: s]
********************************************************************************
[INFO] hasCustomSchema:
********************************************************************************
Will This project have a custom schema for configuring the module in Xml?
[default: n]
********************************************************************************
[INFO] hasBootstrap:
********************************************************************************
Will This project need to make objects available in the Registry as soon as it's loaded?
[default: n]
********************************************************************************
-Dinteractive=false
groupId - org.mule.application.<artifactId>
DgroupId=org.mule.applicationxxx
import org.mule.routing.outbound.AbstractOutboundRouter;
There are two methods you must implement that control how messages will be routed through the
system. First, you must implement the isMatch method. This determines if a message should be
processed by the router.
For example, to route only messages that have a payload containing the string "hello":
The second method you must implement is the route method. Each outbound router has a list of
endpoints that are associated with it. The route method contains the logic to control how the event is
propagated to the endpoints.
For example, if there were two endpoints you want to route to based on a condition, you would use this
method to select the endpoint:
Once you've selected an endpoint, you must then dispatch or send the message to it based on whether or
not the message is synchronous:
try
{
if (synchronous)
{
return send(session, message, ep);
}
else
{
dispatch(session, message, ep);
If the request is synchronous, you must use the send method to send the inbound messages
synchronously to the endpoint. The result from this is then returned. If the request is asynchronous, it is
sent using the dispatch method, and no response message is returned.
The other responsibility of inbound routers is to control how a message is processed by a service. It can
choose to:
Mule provides several transformers, including XML transformers (such as XML to Object, XSLT, and DOM
to XML), encryption transformers that encrypt and decrypt data, compression transformers that compress
and decompress data, encoding transformers (such as Base 64 and SGML entity encoding and decoding),
and object transformers that serialize and deserialize objects and convert between strings and byte
arrays. For a list of the default transformers in Mule, see Using Transformers.
Creating Transports
This page is under construction
Transports are used to provide connectivity to an underlying data source or message source in a
consistent way. Mule provides transports for many different protocols, including File, FTP, HTTP, JMS,
JDBC, Quartz, and many more. For a complete list, see Available Transports. There are also community-
created transports on MuleForge. If you need to send messages on a protocol other than those provided,
you can create a new transport.
Overview
When creating a new transport, you must implement a set of Mule interfaces in the org.mule.transport
package, and then extend the provided abstract classes. For a quick start, you can use the Maven
transport archetype as a code template for your transports.
1. inbound-only: Components can only subscribe to events. They cannot dispatch events.
2. outbound-only: Components can only dispatch events. They cannot subscribe to events.
3. inbound-outbound: Components can subscribe and dispatch events
Transport Interfaces
A transport consists of a set of interface implementations that expose the features for the underlying
transport. Cannot resolve external resource into attachment.
Interface Role
When writing a transport, you must implement the following interfaces that define the contract between
Mule and the underlying technology.
org.mule.api.transport.Connector
The connector is used by Mule to register listeners and create message dispatchers for the transport.
Configuration parameters that should be shared by all Message Receivers and Dispatchers are stored
on the connector. Usually, only one connector instance is needed for multiple inbound and outbound
endpoints as multiple Message Receivers and Dispatchers can be associated with a connector. However,
where the underlying transport API has the notion of a connection such as the JMS or JDBC API, there
should be a one-to-one mapping between the Mule connector and the underlying connection.
org.mule.api.transport.MessageReceiver
The Message Receiver is used to receive incoming data from the underlying transport and package it
as an event. The Message Receiver is essentially the server implementation of the transport (where the
Message Dispatcher is a client implementation). For example, the HTTP Message Receiver is an HTTP
server implementation that accepts HTTP requests. An implementation of this class is needed if the
transport supports inbound communication.
org.mule.api.transport.MessageDispatcher
The Message Dispatcher is used to send events, which is akin to making client calls with the underlying
technology. For example, the Axis Message Dispatcher will make a web service call. An implementation of
this class is needed if the transport supports outbound communication.
org.mule.api.transport.MessageDispatcherFactory
This is a factory class used to create MessageDispatcher instances. An implementation of this class is
needed if the transport supports outbound communication.
org.mule.api.transport.MessageAdapter
The message adapter is used to provide a consistent way of reading messages in Mule. The message
adapter provides methods for reading the payload of the message and reading message properties. These
properties may be message headers, custom properties, or other meta information about the message.
Implementation
Mule provides abstract implementations for all of the above interfaces. These implementations handle all
the Mule specifics, leaving a few abstract methods where custom transport code should be implemented.
Therefore, writing a custom transport is as easy as writing/embedding client and or server code specific
to the underlying technology. The following sections describes the implementations available to you.
You can set further properties on the connector that act as defaults. For example, you can set endpoint
properties that are used by default unless you override them when configuring a specific endpoint.
Sometimes the connector is responsible for managing a connection resource of the transport where the
underlying technology has the notion of a connection, such as in JMS or JDBC. These types of connectors
will have a one-to-one mapping between a Mule connector and the underlying connection. Therefore, if
you want to have two or more physical JMS connections in a single Mule instance, a new connector should
be created for each connection.
For other transports, there will be only one connector of a particular protocol in a Mule instance that
manages all endpoint connections. One such example would be socket-based transports such as TCP
where each receiver manages its own ServerSocket and the connector manages multiple receivers.
Methods to Implement
Message Receivers
Message Receivers will behave a bit differently for each transport, but Mule provides some standard
implementations that can be used for polling resources and managing transactions for the resource.
Usually there are two types of Message Receivers: Polling and Listener-based.
• A Polling Receiver polls a resource such as the file system, database, and streams.
The AbstractMessageReceiver provides methods for routing events. When extending this class, you should
set up the necessary code to register the object as a listener to the transport. This will usually be a case
of implementing a listener interface and registering itself.
Methods to Implement
Some transports poll a resource periodically waiting for new data to arrive. The polling message receiver,
which is based on AbstractPollingMessageReceiver , implements the code necessary to set up and destroy
a listening thread and provides a single method poll() that is invoked repeatedly at a given frequency.
Methods to Implement
It's common for receivers to spawn a thread per request. All receiver threads are allocated using the
WorkManager on the receiver. The WorkManager is responsible for executing units of work in a thread. It
has a thread pool that allows threads to be reused and ensures that only a prescribed number of threads
will be spawned.
When scheduling work with the WorkManager it is recommended that Developers call scheduleWork(...)
on the WorkManager rather than startWork(...).
Message Dispatchers
Messages Receivers are equivalent to a server for the transport in that it will serve up client requests.
Whereas, Message Dispatchers are the client implementation of the transport. They are responsible for
making client requests over the transport, such as writing to a socket or invoking a web service. The
AbstractMessageDispatcher provides a good base implementation leaving 3 methods for the custom
MessageDispatcher to implement.
Methods to Implement
Custom transports do not need to worry about dispatcher threading. Unless threading is turned off,
the Dispatcher methods listed above will be executed in their own thread. This is managed by the
AbstractMessageDispatcher.
When a request is made for a dispatcher, it is looked up from a dispatcher cache on the
AbstractConnector. The cache is keyed by the endpoint being dispatched to. If a Dispatcher is not found
one is created using the MessageDispatcherFactory and then stored in the cache for later. If developers
want a new Dispatcher to be created for each request they can set the disposeDispatcherOnCompletion
property on the AbstractConnector to true. This will essentially turn off dispatcher caching.
Message Adapters
MessageAdapters are usually simple objects that provide a uniform way of accessing an event payload
and associated metadata from a format used by the underlying transport. Almost all messaging protocols
have the notion of message payload and header properties, which means that a MessageAdapter just
needs to allow access to the header properties using standard Map notation i.e.
//Jms message id
String id = (String)message.getProperty("JMSMssageID");
or
//Http content length
int contentLength = message.getIntProperty("Content-Length");
Note that the property names use the same name that is used by the underlying transport; 'Content-
Length' is a standard Http header name and JMSMessageID is the equivalent bean property name on the
javax.jms.Message interface.
Methods to Implement
Service Descriptors
Each transport has a service descriptor that describes what classes are used to construct the transport.
For complete information, see Transport Service Descriptors.
Coding Standards
Package Structure
All mule providers have a similar package structure. They follow the convention of -
org.mule.transport.<protocol>
Where protocol is the protocol identifier of the transport such as 'tcp' or 'soap'. Any transformers and
filters for the transport are stored either a 'transformers' or 'filters' package under the main package.
Note that where a provider may have more than one implementation for a given protocol i.e. There are
two Soap implementations in Mule, Axis and CXF, the package name to be used should be soap not axis
or cxf.
Internationalisation
Any exceptions messages used in your transport provider implementation should be stored in a resource
bundle so that they can be internationalised . The message bundle is a standard java properties file and
must be located at -
META-INF/services/org/mule/i18n/<protocol>-messages.properties
Transport Archetype
[ Configuring Maven ] [ Using the Archetype ] [ The Questions Explained ] [ Example Console Output ] [
Command Line Options ]
Mule provides Maven archetypes that you can use as code templates for your Mule projects. These
templates include a set of implementation notes and todo pointers that help you get started quickly. The
Mule transport archetype will help you generate a tailored boilerplate transport project in seconds. If you
want to create a non-transport module, use the Project Archetype instead.
Follow the instructions below to create template files, including all the necessary Java boilerplate and
detailed implementation instructions in comments, for a new transport.
The transport archetype is publicly available from the central maven repository.
Configuring Maven
Edit the file settings.xml (usually in $HOME/.m2) so that Maven will allow you to execute Mule plugins
without having to specify the org.mule.tools prefix.
<settings>
...
<pluginGroups>
<pluginGroup>org.mule.tools</pluginGroup>
</pluginGroups>
...
</settings>
> cd yourDir
Next, you will execute the archetype and generate the code. Substitute the version number with the Mule
release you're using.
• transportId: The short name of the protocol (such as 'tcp' or 'jms') or the application name (such
as 'sap')
• muleVersion: The version of the Mule transport archetype you want to use. This will also be the
default Mule version used for the generated artifact.
The plug-in will ask various questions (described below) and then generate the files. You can also use
this plug-in without user prompts by entering all the arguments at the command line. For a full list of
arguments that can be passed in, see the Command Line Options.
You should provide an accurate description of the transport with any high level details of what you can or
cannot do with it. This text will be used where a description of the project is required.
The version of Mule you want to use for your transport. By default this will default to the version passed
in on the command line.
If the transport is going to be hosted on MuleForge, then additional information will be added to your
project for linking to its issue tracker, web site, build server and deployment information.
Will this transport have a custom schema for configuring the transport in Xml?
It's recommended that all new transports targeted for Mule 2.0 should define an Xml schema that defines
how the transport is configured. If you do not use this option, users will have to use generic configuration
to use your transport.
Can this transport receive inbound events? For example, the File transport allows you to listen for files
written to a directory. Jms allows you to listen for events being written to a topic or queue.
In order to receive a message some transports need to do polling. E.g. the the file transport needs
to poll a directory to know something has been written there, whereas JMS provides a callback
(MessageListener) to deliver the message. This is only asked if the transport can receive inbound
requests.
If this transport will have a default inbound transformer, enter the name of the transformer?
If the protocol of the application being connected to has its own message type, you can define a
default inbound transformer, that will be invoked by default when defining endpoints that use this
transport. You need to enter the name of the transformer class (without package name) to generate i.e.
JmsMessageToObject.
Can events be written to this transport. In the case of the file transport, you can write file data to a
directory and with JMS you can write to a queue or topic.
If this transport will have a default outbound transformer, enter the name of the
transformer?
If the protocol of the application being connected to has its own message type, you can define a default
outbound transformer, that will be invoked by default when defining outbound endpoints that use this
transport. You need to enter the name of the transformer class (without package name) to generate i.e.
ObjectToJmsMessage.
If the underlying resource for this transport is transactional, you can have Mule generate a transaction
wrapper that will allow users to enable transactions on endpoints defined using this transport.
Not all technologies (such as JavaSpaces) support the standard JTA transaction manager. Mule can still
work with different non-JTA Transaction Managers, and this archetype can generate the necessary stubs
for you.
The option allows you to deviate from the existing endpoint styles and parse your own.
Will this transport have a custom schema for configuring the transport in Xml?
[y] or [n]
[default: y]
********************************************************************************
[INFO] hasReceiver:
********************************************************************************
Does the Message Receiver need to poll the underlying resource? [y] or [n]
[default: n]
********************************************************************************
[INFO] inboundTransformer:
********************************************************************************
If this transport will have a default inbound transformer, enter the name of the
transformer? (i.e. JmsMessageToObject)
[default: n]
********************************************************************************
[INFO] hasDispatcher:
If this transport will have a default outbound transformer, enter the name of the
transformer? (i.e. ObjectToJmsMessage)
[default: n]
********************************************************************************
[INFO] hasTransactions:
********************************************************************************
-Dinteractive=false
groupId - org.mule.transport.<transportId>
DgroupId=org.mule.transport.tcp
endpointBuilder -DendpointBuilder=s r
Customizing a Transport
Mule provides one or more connectors for each transport. For some transports, a connector is responsible
for managing a connection resource of the transport where the underlying technology has the notion of a
Connection, such as in JMS or JDBC. These types of connectors will have a one-to-one mapping between
a Mule connector and the underlying connection. Therefore, if you want to have two or more physical
JMS connections in a single Mule instance, for example, the application developer can define a new JMS
connector in the XML configuration for each connection.
Other transports have only one connector that manages all endpoint connections for that transport's
protocol. For example, in socket-based transports such as TCP, each message receiver manages its own
ServerSocket and the connector manages multiple receivers.
Deployment Scenarios
[ Embedding Mule in a Java Application or Webapp ] [ Embedding Mule in an Application Server ] [ Using
Spring ] [ Using Mule NetBoot ]
There are several ways in which you can deploy Mule. The simplest way is from the command prompt,
or from a script or IDE. For more information, see Running Mule. Following are additional deployment
scenarios:
• Geronimo: The Geronimo application server uses ActiveMQ as its default JMS provider. For details,
see ActiveMQ Integration.
• JBoss
• WebLogic
• WebSphere
Using Spring
Mule fully integrates with Spring, allowing you to take advantage of Spring's many features, including
support for JNDI and EJB session beans. You can also use Spring remoting to access Mule from an
external applications. For details, see Using Mule with Spring.
This page describes how to deploy the Mule JCA Resource Adapter to the WebLogic Application Server,
allowing EJBs to send and receive Mule events. For details on configuring WebLogic JMS in Mule, see
WebLogic JMS Integration.
These instruction assume you have downloaded and installed WebLogic Application Server version 10.3
and that you have downloaded the Mule JCA Resource Adapter. Note that WebLogic 8.x and 9.x are also
supported, but these instructions are specific to version 10.3, both on BEA Weblogic and Oracle WebLogic.
1. Launch the Configuration Wizard. For example, on Windows choose Start > All Programs > BEA
Products > Tools > Configuration Wizard.
2. In the Welcome screen, select the option to create a new domain and click Next.
3. In the Select Domain Source screen, select the option to generate a domain for WebLogic Server
and click Next.
4. In the Configure Administrator Username and Password screen, enter the user name and password
you want to use, and then click Next.
5. In the Configure Server Start Mode and JDK screen, select Development Mode, select the Sun SDK
1.5 instead of JRockit, and then click Next.
6. In the Customize Environment and Services Settings screen, leave No selected and click Next.
7. In the Create WebLogic Domain screen, enter Mule2.1 for the domain name, leave the location
set to the default user projects domains directory, and then click Create. Note that you can use
whatever domain name you like, but the rest of this page assumes the name Mule2.1.
8. When the domain has been created, click Done.
For example, on Windows, you would modify startWebLogic.cmd and change this line:
set CLASSPATH=%CLASSPATH%;%MEDREC_WEBLOGIC_CLASSPATH%...
to this:
Deploying Mule
There are many ways to deploy applications to the WebLogic server. These instructions demonstrate the
two most common approaches: through auto-deployment, which provides a fast method for deploying
for testing and evaluation, and through the Administration console, which provides more control over the
configuration.
To Auto-deploy Mule:
1. Start the WebLogic server. For example, on Windows choose Start > BEA Products > WebLogic
Server.
2. Start the Admin Server for the Mule2.1 domain. For example, on Windows you would choose Start
> BEA Products > User Projects > Mule2.1 > Start Admin Server for WebLogic Server
Domain.
3. When prompted, log in to the console using the user name and password you specified when
creating the domain. If you close the console and need to restart it later, you can go to the URL
http://localhost:7001/console/console.portal.
4. In the Domain Structure on the left, click Deployments, and then click Lock & Edit.
5. Click Install, and then navigate to the location where you downloaded the Mule RAR file.
6. Select the RAR file and click Next.
7. Specify that you want to go to the deployment's configuration screen, and then click Finish.
8. In the Change Center on the left, click Activate Change.
Mule is now deployed to WebLogic via the Mule JCA Resource Adapter. You must now replace the default
configuration file in the RAR file with the configuration file for your Mule application.
1. Unpackage the RAR file and copy your configuration file to the top level where all the JAR files are
located.
2. Open the META-INF folder, and then open weblogic-ra.xml for editing.
3. Immediately after the <enable-global-access-to-classes>true</enable-global-access-to-
classes> entry and right before outbound-resource-adapter, add the following lines, where echo-
axis-config.xml is the name of your configuration file:
<properties>
<property>
<name>Configurations</name>
<value>echo-axis-config.xml</value>
</property>
</properties>
The following describes how to deploy the Mule JCA Resource Adapter to the WebSphere application
server allowing EJBs to send and receive Mule events. For details on configuring WebSphere MQ in Mule,
see WebSphere MQ Integration.
TODO
To start Mule from any Java application, you can call one of its configuration builders. To use Mule XML
configuration:
Make sure you store a reference to the MuleContext, as you will need it to stop Mule.
muleContext.stop();
muleContext.dispose();
To embed Mule inside a webapp, you provide one or more configuration file locations as context params
and include a context listener to initialize the Mule Server. If you are using Mule XML configuration, use
the following -
<context-param>
<param-name>org.mule.config</param-name>
<param-value>mule-config-main.xml,mule-components.xml</param-value>
</context-param>
<listener>
<listener-class>org.mule.config.builders.MuleXmlBuilderContextListener</listener-class>
</listener>
The configuration parameter can be a classpath location or file location. You can also specify multiple
configuration files on the classpath or on the file system.
To interact with the Mule server from your application, JSP, or servlet, you can use the Mule Client.
//create a client
MuleClient client = new MuleClient();
There are three main approaches you can take to deploying Mule to JBoss:
1. Simple WAR deployment: in this approach, you simply embed Mule in your application and build the
WAR. Your custom implementation classes are part of the WAR.
2. EAR application: you can embed the WAR inside the EAR file and include additional files such as
EJBs.
3. JCA deployment: you can use the Mule JCA Resource Adapter. The Mule JCA adaptor allows you to
use "JCA Message Inflow" to Message Driven Beans (MDB's) and use the Mule "ManagedConnection"
for tighter integration when sending message from your Jee application via Mule.
Classloader Isolation
When JBoss comes to classloading, unless classloader isolation is specified, JBoss will first try to use
its own classes for deployment and only when these are not found will it look for them in the libraries
of the deployment file. Since the versions of the libraries used to load Mule are not the same as the
ones used by JBoss, various errors such as ClassCastExceptions can appear, so classloading isolation is
important. Therefore, for best results, you should use classloader isolation in your JBoss configuration.
For more information, see http://wiki.jboss.org/wiki/ClassLoadingConfiguration. If you're using the JCA
adapter, and you have other applications running on JBoss, you should use classloader isolation. However,
classloader isolation is not supported for JCA deployment on JBoss. Therefore, you must wrap your JCA
adapter in an EAR and configure classloader isolation for the EAR.
• JBoss allows EAR, WAR, and SAR files to have classloader isolation. This feature is not yet available
for the RAR file.
• The Mule JCA Resource Adapter contained in the EAR file is specific for JBoss deployment.
• In order to avoid deployment issues with JBoss the mule-jboss-ds.xml file has to be moved from
the mule-module-jca-jboss-<muleVersion>.jar file up to the EAR level.
Adaptation of the RAR File for Use with the EAR File
In mule-jca-jboss-x.rar (where x is the Mule version number), you must remove mule-jboss-ds.xml
from mule-module-jca-jboss-2.x.jar. Note that if you are going to repackage mule-jca-jboss-x.rar,
repackage it in a simple zip file format instead of other compression formats.
The file structure of the EAR file should have the following format:
META-INF
| - application.xml
Following are the configuration files for the XML files in the above file structure:
mule-jboss-ds.xml
<connection-factories>
<tx-connection-factory>
<jndi-name>mule/ConnectionFactory</jndi-name>
<local-transaction />
<track-connection-by-tx />
<rar-name>my-ear.ear#mule-jca-jboss-2.x.rar</rar-name>
<connection-definition>org.mule.module.jca.MuleConnectionFactory</connection-definition>
</tx-connection-factory>
</connection-factories>
The mule-jboss-ds.xml file is an adaptation of the one you removed from mule-module-jca-
jboss-2.x.jar. Note that because the RAR file is found inside the EAR, the name inside the <rar-name>
tag should be the EAR file name and the RAR file name separated by the # symbol. This will be your data
source.
application.xml
This file is required for telling the EAR file to use mule-jca-jboss-2.x.rar as a connector, allowing it to
be deployed as a resource adapter.
jboss-app.xml
The following configuration file creates a loader-repository that loads the classes during the classloading
operation. The java2ParentDelegation property must be set to false to enable classloader isolation.
The configuration specifies mule-jboss-ds.xml as a service to be loaded.
1. Put the resource files (xslt, properties, etc.) in your JAR file (these should be picked up
automatically when Mule starts)
2. Create a folder in the root of the mule-jca-jboss-2.x.rar file and put your Mule configuration in
there. For the time being, let's call this folder "conf".
3. Edit the ra.xml file found in the mule-jca-jboss-2.x.rar META-INF folder and reference your
configuration file name as seen below.
Alternatively you can put your jar files with classes/resources that will be used by mule in your EAR, but
in order to do this you will need to add a "Class-Path" entry in the rar's MANIFEST.MF referencing the
required libraries.
<config-property-name>Configurations</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>conf/my-config1.xml</config-property-value>
The <config-property-value> should contain a list of configuration files separated by a comma. The
"conf/" is the path name telling the loader to look at the conf folder found in the root of the RAR file. If
only the name of the configuration file is given, the loader will only look for the configuration file inside
the mule-module-jca-core-2.x.jar.
JBoss MQ Configuration
For information on configuring a JBoss JMS connector, see JBoss Jms Integration.
Resolving Cross-dependencies
The situation becomes more complex when you want to deploy Mule-dependent code in a separate EAR
file (for example, you have a custom transformer that extends Mule's AbstractTransformer class). The
user EAR depends on the Mule libraries to be loaded to be able to load the custom transformer library,
while Mule expects the user EAR to be loaded to be able to use the transformer class that is found in
the user EAR. To solve these cross-dependencies, you can create a shared library (in another EAR file,
perhaps) and specify the library in the <loader-repository> element of the jboss-app.xml file in
both the Mule EAR and the user EAR. Mule Enterprise Edition users can see an example of this in the
Knowledge Base article titled "Embedding in JBoss: How to Share Classes Between Your Mule EE EAR and
Another Application".
Mule as MBean | Creating a Simple MBean | Creating JBoss Service Descriptor | Deploy
MBean to JBoss | References | External References | Related
Mule as MBean
An MBean[MULE:1] is a named managed object representing a resource in an JMX environment. We can
have an MBean deployed with Mule in it easily, the steps as follows:
Just as you have not yet noticed, we are using JBoss application server in this document.
package foo.mbean;
package foo.mbean;
import org.jboss.system.ServiceMBeanSupport;
import org.mule.config.builders.MuleXmlConfigurationBuilder;
import org.mule.umo.manager.UMOManager;
import org.mule.umo.manager.UMOServerNotification;
try{
MuleXmlConfigurationBuilder builder = new MuleXmlConfigurationBuilder();
UMOManager manager = builder.configure("mule-config.xml");
manager.start();
manager.registerListener(this);
}
catch(Exception e){
e.printStackTrace();
}
this.getLog().info("MBean started");
}
}
this.getLog().info("Done stopping Mule MBean Service!");
}
catch (Exception ex) {
this.getLog().error("Stopping Mule caused and exception!", ex);
}
}
}
The extension of ServiceMBeanSupport is simply to provide you more control over the API provided by
JBoss.
So, your distro looks like this (using the examples above):
.
./foo
./foo/FooService
./foo/FooServiceMBean
./META-INF
./META-INF/jboss-service.xml
Pack it, either as a JAR (which can then be renamed to a *.sar, and eventually you will need to extract it
as JBoss might not be picking it up for whatever reason that I have no idea about) or as a directory called
<whatever>.sar.
References
External References
1. Wikipedia - MBean
2. The Java Tutorials - Standard MBeans
Related
When developing service components, you focus on developing code to handle the business logic, not
to integrate the service component with Mule. For example, if you are developing a service component
that adds customer data to an invoice, you focus on writing code that queries the customer database
and updates the invoice as needed. You do not have to write any special code to handle the message
that's passed to the service component or to integrate with Mule, as all integration is handled through
configuration. You can develop the service component as a POJO, or as a web service using popular
containers such as Spring, EJB, or Plexus.
Mule does allow you to enable service components to obtain information about or even control the current
message instead of just working with the message payload. To enable the service component to work
directly with the message, you must implement the Callable() interface in the service component (see
Entry Points below).
To get started with developing Mule service components, you can use the Mule IDE. The Mule IDE is an
Eclipse plug-in that provides an integrated development environment for developing Mule applications.
You can also use the standard components provided with Mule, or use them as a starting point for
building your own.
Entry Point
The entry point is the method in your component that is invoked by Mule when a message is received.
Mule uses an entry point resolver to dynamically choose the method to invoke based on the payload
type of the message. When the match is found, the method is cached with the parameter types so
that introspection is only done once per method for the life of the service. If multiple methods in the
component match the payload type, or no method matches, an error is thrown. You can also call a
method on the component that has no arguments.
For details on configuring entry point resolvers, see Entry Point Resolver Configuration Reference.
If you want to call a method with no arguments, you can use the
org.mule.model.resolvers.NoArgumentsEntryPointResolver . Regardless of the payload of the
current message, this resolver looks only for no-argument methods in the component. Additionally,
ReflectionEntryPointResolver supports the resolution of no-argument service methods if the payload
received is of type NullPayload.
If you want to create your own entry point resolver, you create a class that implements the
EntryPointResolver interface and specify it with the <custom-entry-point-resolver> element in your
Mule configuration.
1. When a message is received, the entry point method is invoked as described above.
2. The response or outbound message is obtained as follows:
• If the method invoked is not void, (that is, Callable.onEvent() returns an Object), the method
return value is used. If null is returned, no further processing is done for the current request.
• If the method is void, the parameters used to invoke the method are used. This assumes that
the parameters themselves were altered or there was no change to the message.
3. If the inbound endpoint used in synchronous then the result of the component invocation is returned
to caller.
4. The outbound message is then routed according the services <outbound> configuration:
See Mule Messaging Styles for more detail about the different configuration options that affect message
flow.
From the MuleEventContext, you can send and receive events synchronously and asynchronously,
manage transactions, and override the default event flow behavior. For example:
//or to request
InboundEndpoint endpoint = ...
MuleMessage quote = context.request(endpoint, 5000);
• If your service method is not void, you can return null. This approach tells Mule there is no further
event information to process.
• If your service method is void, Mule will use the inbound message payload as the outbound message
payload. You can override this behavior using the setStopFurtherProcessing method as described
below.
To halt the message flow, you can either call setStopFurtherProcessing() from the MuleEventContext
or else throw an exception. This will cause the ExceptionStrategy on the component to be invoked.
Note:
The use of additional services or the use of component bindings is much preferred to the above
techniques to control message flow from within your component implementation. This is because it allows
for a much more decoupled implementation that can be modified via your configuration file and avoids
the need to use Mule API in your component implementations. To take this approach, do one of the
following:
• Ensure your service components are implemented in such a way that they do a single unit of work
that do not need to do any message sending/receiving. This additional sending/receiving/routing is
then done using Mule services.
• Design your component in such a way that interface methods can be mapped to outbound endpoints
and then use bindings to map these in configuration. For information on how to configure bindings,
see Configuring Java Components.
Component Lifecycle
Optionally, your component can implement several lifecycle interfaces. Following are some of the most
commonly used interfaces:
• org.mule.api.lifecycle.Initialisable is called only once for the lifecycle of the component. It is called
when the component is created when the component pool initializes.
• org.mule.api.lifecycle.Startable is called when the component is started. This happens once when
the server starts and whenever the component is stopped and started either through the API or
JMX.
• org.mule.api.lifecycle.Stoppable is called when the component is stopped. This happens when the
server stops or whenever the component is stopped either through the API or JMX.
• org.mule.api.lifecycle.Disposable is called when the component is disposed. This is called once when
the server shuts down.
If your custom component already has its own lifecycle methods, possibly implementing your own API, or
you just prefer not to depend on Mule's, you can implement and configure a LifecycleAdaptorFactory
to map Mule's lifecyle to your component's lifecycle. To do this, you implement your own
org.mule.api.component.LifecycleAdaptorFactory and org.mule.api.component.LifecycleAdaptor . See
Configuring Java Components for information on how to configure a custom life-cycle adaptor factory.
<entry-point-resolver-set ...>
An extensible set of entry point resolvers. These determine how a message is passed to a component
in Java. Each entry point resolver is tried in turn until one succeeds in delivering the messge to the
component. This element can be set on the model or component; the model value provides a default
which individual component values can override.
Attributes
Child Elements
<legacy-entry-point-resolver-set ...>
An extensible set of entry point resolvers (which determine how a message is passed to a component in
Java) that already contains resolvers to implement the standard logic. This is already provided by default
and is only needed explicitly if it will be extended with other entry point resolvers. This element can be
set on the model or component; the model value provides a default which individual component values
can override.
Child Elements
<custom-entry-point-resolver-set ...>
A custom entry point resolver set. This allows user-supplied code to determine how a message is passed
to a component in Java. This element can be set on the model or component; the model value provides a
default which individual component values can override.
Attributes
Child Elements
spring:property 0..*
<callable-entry-point-resolver ...>
An entry point resolver for components that implement the Callable interface. This passes a
MuleEventContext to the component. This element can be set on the model or component; the model
value provides a default which individual component values can override. This element can also be used
directly or as part of a set of resolvers; the resolvers in a set are used in turn until one is successful.
Child Elements
<custom-entry-point-resolver ...>
A custom entry point resolver. This allows user-supplied code to determine how a message is passed to
a component in Java. This element can be set on the model or component; the model value provides a
default which individual component values can override. This element can also be used directly or as part
of a set of resolvers; the resolvers in a set are used in turn until one is successful.
Attributes
Child Elements
spring:property 0..*
<property-entry-point-resolver ...>
Use a message property to select the component method to be called. This element can be set on the
model or component; the model value provides a default which individual component values can override.
This element can also be used directly or as part of a set of resolvers; the resolvers in a set are used in
turn until one is successful.
Attributes
Child Elements
<method-entry-point-resolver ...>
Deliver the message to a named method. This element can be set on the model or component; the model
value provides a default which individual component values can override. This element can also be used
directly or as part of a set of resolvers; the resolvers in a set are used in turn until one is successful.
Attributes
Child Elements
Attributes
Child Elements
<array-entry-point-resolver ...>
Deliver the message to a method which takes a single array as argument. This element can be set on the
model or component; the model value provides a default which individual component values can override.
This element can also be used directly or as part of a set of resolvers; the resolvers in a set are used in
turn until one is successful.
enableDiscovery boolean no
Child Elements
<no-arguments-entry-point-resolver ...>
Call a method without arguments (the message is not passed to the component).
Attributes
enableDiscovery boolean no
Child Elements
<include-entry-point ...>
A possible method for delivery.
Attributes
Child Elements
Error Handling
This page is ready for review
Error handling includes setting exception strategies and connection strategies. Additionally, you can
use exception routers to specify where the message goes when an error occurs. This page describes
these strategies and routers. For details on configuring exception strategies, see Exception Strategy
Configuration Reference.
Exception Strategies
Exception strategies are used to handle exception conditions when an error occurs processing an event.
There are two objects that support Exception strategies; components and connectors, plus a common
component exception strategy for components can be set on the model.
Exception strategies associated with components or the model are used to handle component exceptions.
These are typically business logic exceptions.
The user will often want to customize the exception handler to control how these exceptions are logged
and routed.
Exceptions strategies associated with the connector handle exceptions thrown when events are received
or sent using a connector. It is less common that these strategies will be customized by the developer,
but they may be configured to route exceptions to a common error queue.
The default exception strategy used by the model (and thus all components managed by the model)
is org.mule.service.DefaultServiceExceptionStrategy , which you configure with the <default-service-
exception-strategy> element. To configure it at the model level, add the element before the services:
<model name="CreditCheck">
<default-service-exception-strategy>
<vm:outbound-endpoint path="systemErrorHandler"/>
</default-service-exception-strategy>
<service> ... </service>
<service> ... </service>
</model>
<model name="CreditCheck">
<service>
...
<default-service-exception-strategy>
<vm:outbound-endpoint path="systemErrorHandler"/>
</default-service-exception-strategy>
</service>
</model>
You set an endpoint on an exception strategy to forward the event that failed to a destination such as an
error queue.
To implement your own strategy, your class can extend org.mule.AbstractExceptionListener , but a
recommended approach is to extend org.mule.service.DefaultServiceExceptionStrategy and just overload
the defaultHandler() method. Bean properties can be set on your custom exception strategy in the
same way as other Mule configured objects using a <properties> element.
If you want to change the way exceptions are logged, override the logException() method from the
org.mule.AbstractExceptionListener .
<outbound-router>
<router className="org.mule.routing.outbound.ExceptionBasedRouter">
<endpoint address="tcp://10.192.111.10:10001" />
<endpoint address="tcp://10.192.111.11:10001" />
<endpoint address="tcp://10.192.111.12:10001"/>
</router>
</outbound-router>
Functional Testing
[ FunctionalTestCase ] [ FunctionalTestComponent ] [ Additional Features ] [ Additional Example: Event
Callback With a Spring Component ]
Because Mule is light-weight and embeddable, it is easy to run a Mule Server inside a test case. Mule
provides an abstract JUnit test case called org.mule.tck.FunctionalTestCase that runs Mule inside a test
case and manages the lifecycle of the server. The org.mule.tck.functional package contains a number of
supporting classes for functionally testing Mule code, including FunctionalTestComponent . These classes
are described in more detail in the following sections.
FunctionalTestCase
FunctionalTestCase is a base test case for Mule functional tests. Your test cases can extend
FunctionalTestCase to use its functionality.
FunctionalTestCase fires up a Mule server using a configuration you specify by overriding the
getConfigResources():
You can use the method getConfigResources to specify a configuration file or comma-
separated list of configuration files to use. All configuration files must exist in your
classpath.
You then create tests that interact with the Mule server. FunctionalTestCase extends
junit.framework.TestCase, so JUnit the framework for creating and running your test cases. For
example, this simple test would send a message to a vm endpoint .
Notice the use of MuleClient to interact with the running Mule server. MuleClient is used to send
messages to and receive messages from endpoints you specify in your Mule configuration file (mule-
conf.xml in this case). The example mule-conf.xml file used in this example is shown below:
FunctionalTestComponent
The previous example of FunctionalTestCase covers many common (synchronous) test scenarios, where
the service responds directly to the caller. FunctionalTestComponent can help support richer tests, such
as:
The component includes two methods: the onCall method and the onReceive method that basically do
the same thing.
In both methods, FunctionalTestComponent takes the message that is passed to it (either from the
MuleEventContext or from the Object) and transform it into a String. It then creates a message and
sends it back to the caller. It also checks whether any of its properties are set and acts accordingly.
Event Callbacks
User-defined event callbacks get called when the test component is invoked. Following is an example of a
test case and Mule configuration that uses callbacks:
<model name="TestComponentModel">
<service name="TestComponentService">
<inbound>
<inbound-endpoint address="vm://test"/>
</inbound>
<component>
<singleton-object class="org.mule.tck.functional.FunctionalTestComponent"/>
</component>
</service>
</model>
</mule>
Notice that in this configuration, we did not use the "<test:component>" element, since we need
FunctionalTestComponent to be singleton for the callback to work properly.
For an example of an event callback on a Spring component, see the additional example below.
Notifications
To do this, we must first make our test case implement the FunctionalTestNotificationListener
interface. Then, we must implement the method exposed by this listener, which is onNotification.
In the example below, we check notification.getAction to see whether it is the
FunctionalTestNotification fired by the FunctionalTestComponent. If it is, we print it out to the
console.
Now, in order for our listener to start listening for notifications, we must register it:
FunctionalTestComponent can return mock data specified either in a file or embedded in the Mule
configuration. For example, to have the FunctionalTestComponent return the message "donkey", you
would configure the component as follows:
<test:component>
<test:return-data>donkey</test:return-data>
</test:component>
<test:component>
<test:return-data file="abc.txt"/>
</test:component>
Forcing Exceptions
You can use throwException to always return the exception specified by exceptionToThrow, as follows:
By default, every message that is received by the FunctionalTestComponent is stored and can be
retrieved. If you do not want this information stored, you can set enableMessageHistory to false. For
example, if you are running millions of messages through the component, an out-of-memory error would
probably occur eventually if this feature were enabled.
To enable:
Messages are stored in an ArrayList. To retrieve a stored message, you use the getReceivedMessage
method to retrieve it by number (e.g., getReceivedMessage(1) to retrieve the first message stored),
or use getLastReceivedMessage to retrieve the last message that was received. You can use
getReceivedMessages to return the total number of messages stored.
You can use appendString to append text to the response message, as follows:
Delayed Responses
You can set waitTime to delay responses from this FunctionalTestComponent. In this example,
responses are delayed five seconds:
You can set doInboundTransform to false to disable the inbound transformer. For example:
ApplicationContext ac =
(ApplicationContext)muleContext.getRegistry().lookupObject(SpringRegistry.SPRING_APPLICATION_CONTEXT);
FunctionalTestComponent testComponent = (FunctionalTestComponent) ac.getBean("FTC");
testComponent.setEventCallback(callback);
<model name="TestComponentModel">
<service name="TestComponentService">
<inbound>
<inbound-endpoint address="vm://test" />
</inbound>
<component>
<spring-object bean="FTC" />
</component>
Internationalizing Strings
[ Internationalized Messages ] [ Exceptions ] [ Using Custom Message Bundles ] [ Creating Message
Instances from your Code ]
Mule supports internationalization of exception messages and any other type of string message. Mule has
support for the following Languages:
• English
• Japanese
Internationalized Messages
Mule uses the Java ResourceBundle class to load messages from properties files on the classpath based
on the current system's locale. Mule provides a full set of messages in English and Japanese only, but
there may be additional languages provided in the future.
You never create instances of Message directly. Instead, you use subclasses of MessageFactory . The
messages for Mule's core project are accessible through the org.mule.config.i18n.CoreMessages class.
Each of Mule's modules and transports has such a messages class. Its name is equal to the module with
Messages appended. For example, for the JMS transport you will use JmsMessages to retrieve messages.
The dedicated messages class per module/transport has the following advantages:
Exceptions
MuleException is the base class of all Mule checked exceptions and can only be constructed using
internationalized messages. To create a message for an exception, you use MuleExtension as follows:
where the number is the message ID and the actual message comes after. Note that message parameters
are specified using '{0}' notation, which is standard when using the Java MessageFormat class.
To access the messages of your own resource bundle, you create a subclass of MessageFactory as
follows:
To load a message from this bundle, pass in the resource bundle name as follows:
This loads the message with ID 2 from x-messages.properties, formats the message with the
parameters "one" and "two", and prints out the message to System.out as follows:
A transport is a type of module that carries messages between Mule services via a specific protocol. You
can customize a transport, or you can create a new one. For a list of the available transports you can use,
see Available Transports.
Mule provides a Maven Project Archetype and a Maven Transport Archetype that create template files,
including all the necessary Java boilerplate and detailed implementation instructions in comments, for a
new Mule project or transport. For more information, see Using Maven in the Mule Developer's Guide.
Internationalizing Mule
If you will use Mule in countries where English is not spoken, you can extend Mule by internationalizing
the strings in the messages and exceptions. Additionally, there are guidelines you should take
into consideration to make sure your code handles different locales. For more information, see
Internationalizing Strings and Internationalization Guidelines.
Mule provides functional test classes in the org.mule.tck and org.mule.tck.functional packages
that allow you to test your configuration as well as your custom modules and transports. For more
information, see Functional Testing. Additionally, the Mule test JAR file contains abstract test cases
that you can use for unit testing your simple extensions (e.g., AbstractTransformerTestCase
and AbstractOutboundRouterTestCase) as well as your custom modules and transports (e.g.,
AbstractConnectorTestCase, AbstractReceiverTestCase, AbstractDispatcherTestCase, and
AbstractEndpointTestCase). For more information, see Unit Testing.
Performance Tests
After you have ensured that your setup and configuration are correct and that your customizations are
working, you should ensure that your system is performing correctly. You can run Japex benchmark tests
to test individual packages. Additionally, the Mule Profiler Pack helps you identify memory leaks in your
customizations.
For more information on hosting your project on MuleForge, see the Despot's Guide.
Prerequisites
• Internet connection
• Java 5
Instructions
We'll use a Hello Example bundled with Mule to demonstrate the setup.
1. Download Mule 1.4.4-SNAPSHOT from the downloads page. Instructions apply to Mule 2.x as well.
2. Configure JAVA_HOME, MULE_HOME and run Mule for the first time to accept the license.
3. Download JavaRebel 1.0-M3 snapshot from http://www.zeroturnaround.com/download/
4. Unpack, copy javarebel.jar to $MULE_HOME/bin to keep things simple.
5. Change into $MULE_HOME/examples/hello
6. Generate project files mvn idea:idea (mvn eclipse:eclipse for, right, Eclipse)
7. Change module output path to compile into $MULE_HOME/lib/user
8. Delete mule-example-hello.jar from $MULE_HOME/lib/user. It contains the same classes we're
compiling. JavaRebel supports only exploded class reloading currently.
9. Make the project.
10. Start Mule with an extra switch to enable JavaRebel:
mule -config hello-config.xml -M-javaagent:../../bin/javarebel.jar -M-noverify
Note that we reference the config file as a resource - it's been put on the classpath in lib/user when
you built the project.
11. Type your name when prompted, watch the standard reply. Now let's have some fun.
12. Modify org.mule.samples.hello.Greeter#greet() method. Let's make it more rebellious: modify
the code to set a new greeing:
Hey, it works in debug mode as well, including remote. Just add the -debug switch to the Mule start
command and connect your debugger on port 5005 (default). Just make sure to say No when you see
debugger's prompt to reload classes - let JavaRebel rock IDEA users may need to get the JavaRebel
debugger plugin, see the troubleshooting section below.
Troubleshooting
• I get weird exception with strange class names - don't put javarebel.jar in $MULE_HOME/
lib/user. It's easier not to do it, then explain why it may fail for certain cases (complex classloader
tricks).
• It won't reload! - if nothing else works, then the worst to happen is restarting Mule.
• It won't reload Mule core classes! - these instructions apply to custom user classes only.
• Debugger never stops at breakpoint in IDEA - This is a known issue, JetBrains and
ZeroTurnaround are actively working on it. Doesn't affect Eclipse users (uses different mechanism).
Update: this has been resolved now. Download the JavaRebel Debugger plugin from IntelliJ IDEA
plugin repo (or go to http://plugins.intellij.net/plugin/?id=1699). These changes might be included
in IDEA's core in the future.
JMX Management
[ Using the Default JMX Support Agent ] [ Jmx Default Config ] [ Configuring the JMX Agent ] [ Jmx
Server ] [ Remote Management ] [ JMX Notifications Agent ] [ Endpoint Notifications Publisher Agent ] [
Log4J Agent ] [ Log4J Notifications Agent ] [ Chainsaw Notifications Agent ] [ MX4J Adapter ] [ Jmx Mx4j
Adaptor ] [ YourKit Profiler ]
Java Management Extensions (JMX) is a simple and standard way to manage applications, devices,
services, and other resources. JMX is dynamic, so you can use it to monitor and manage resources as
they are created, installed, and implemented. You can also use JMX to monitor and manage the Java
Virtual Machine (JVM).
Each resource is instrumented by one or more Managed Beans, or MBeans. All MBeans are registered in
an MBean Server. The JMX server agent consists of an Mbean Server and a set of services for handling
Mbeans.
There are several agents provided with Mule for JMX support. The easiest way to configure JMX is to use
the default JMX support agent.
• JMX agent
• RMI registry agent (if necessary) on rmi://localhost:1099
• Remote JMX access on service:jmx:rmi:///jndi/rmi://localhost:1099/server
• Log4J JMX agent, which exposes the configuration of the Log4J instance used by Mule for JMX
management
• JMX notification agent used to receive server notifications using JMX notifications
• (Optional) MX4J adapter, which provides web-based JMX management, statistics, and configuration
viewing of a Mule instance
Attributes of <jmx-default-config...>
For example:
The default agent does a lot of useful plumbing for JMX but at the expense of defaulting many
parameters. If you need to customize some subsystems, you could either:
You configure the JMX agent using the <jmx-server> element. You can set the following properties on the
agent.
Jmx Server
Attributes of <jmx-server...>
For example:
<management:jmx-server >
<management:connector-server url="http://myjmxserver.com:1099" rebind="false" />
<management:credentials>
<spring:entry key="jsmith" value="foo" />
<spring:entry key="dthomas" value="bar" />
</management:credentials>
</management:jmx-server>
Note that the JMX domain for the Mule server is taken from the Mule server ID. To set the server ID, you
the -M-Dmule.serverId=YOUR_MULE_SERVER_ID system property or set it programatically by calling
org.mule.config.DefaultMuleConfiguration.setId().
Remote Management
You can configure the Mule JMX subsystem for remote management with third-party tools like MC4J. Mule
provides an RMI registry agent, which binds to an existing RMI registry or creates a new one on a defined
URI.
You configure the RMI registry agent using the <rmi-server> element. This element has two attributes:
serverUri, which you set to the URI of the RMI server (the
default is rmi://localhost:1099), and createRegistry, which you set to true if you want to create a new
registry instead of binding to an existing one.
Attribute Description
For example:
For example:
<management:jmx-log4j/>
</mule>
The Log4J notifications agent also takes the <level-mapping> child element, which takes one or more
pairs of severity/eventId attributes. The severity attribute specifies the severity level of the notifications
you want to log for the corresponding event ID. The severity level can be DEBUG, INFO, WARN, ERROR,
or FATAL. The eventId attribute specifies the type of event to log. The event ID is the notification type
plus the action, such as ModelNotification.stop.
For example:
The Chainsaw notifications agent also takes the <level-mapping> child element, which takes one or
more pairs of severity/eventId attributes. The severity attribute specifies the severity level of the
notifications you want to send to the Chainsaw console for the corresponding event ID. The severity
level can be DEBUG, INFO, WARN, ERROR, or FATAL. The eventId attribute specifies the type of
event to send to the Chainsaw console. The event ID is the notification type plus the action, such as
ModelNotification.stop.
For example:
MX4J Adapter
MX4J is an open source implementation of the JMX technology. The MX4J agent for Mule configures an
MX4J HTTP adapter to provide JMX management, statistics, and configuration viewing of a Mule instance.
You configure the MX4J agent using the <jmx-mx4j-adaptor> element.
Attributes of <jmx-mx4j-adaptor...>
For example:
<management:jmx-mx4j-adaptor jmxAdaptorUrl="https://myjmxserver.com:9999">
<management:socketFactoryProperties>
<spring:entry key="keystore" value="/path/to/keystore" />
<spring:entry key="storepass" value="storepwd" />
</management:socketFactoryProperties>
</management:jmx-mx4j-adaptor>
For security's sake, the management console is accessible from the localhost only. To loosen this
restriction, change "localhost" to "0.0.0.0", which allows access from any computer on the LAN. For more
information, see the MX4J documentation.
MX4J Security
You can protect the JMX web console with a user name and password. If the login property has been
specified, the authentication scheme is applied.
In addition to protecting the console, you can protect the in-transit data using SSL. If the
socketFactoryProperties element contains at least one property, the agent switches to HTTPS
connections. If this element is omitted from the configuration, the agent will always use HTTP, even if you
specify https:// in the jmxAdaptorUrl property.
Viewing Statistics
Mule traps many different statistics about the running state of a server and number of events processed.
You can view the Mule statistics report in the JMX Management Console by pointing your browser to
http://localhost:9999/ and then clicking on any JMX domain name (except for JMImplementation), or go
to the Statistics tab and query the JMX domain for statistics from there.
<management:yourkit-profiler />
About Models
[ Configuring a Model ] [ Model Interface ]
A model is a grouping of services. A model manages the runtime behavior of the service components
that a Mule instance hosts. The manner in which these components are invoked and treated is all
encapsulated inside the current Mule model.
Configuring a Model
To configure a model, you add the <model> element to your Mule configuration file. You then add services
within the model. For configuration details, see the Model Configuration Reference.
Model Interface
Every Mule model implements the Model interface. This interface represents the behavior of a Mule server
and works with the following objects. For a complete list of fields and methods, see in the Model interface
org.mule.api.model.Model . Also, see org.mule.model.AbstractModel , which is an abstract class that
implements this interface and is the parent for all models.
Object Description
An agent is a service that is associated with or used by Mule but is not a Mule-managed component.
Agents have the same lifecycle as the Mule instance they are registered with, so you can initialize and
destroy resources when the Mule instance starts or is disposed.
Mule provides several agents for JMX support, including notifications and remote management. You
can also create custom agents to plug any functionality into Mule, such as running functionality as a
background process or embedding a server in Mule.
Configuring an Agent
Agents are defined in the Management module. To use an agent, specify the management namespace and
schema, and then specify the properties for the agents you want to use. For example:
<mule xmlns="http://www.mulesource.org/schema/mule/core/2.0"
...
xmlns:management="http://www.mulesource.org/schema/mule/management/2.0"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-
beans-2.5.xsd
http://www.mulesource.org/schema/mule/core/2.0 http://www.mulesource.org/schema/mule/core/2.0/
mule.xsd
http://www.mulesource.org/schema/mule/management/2.0 http://www.mulesource.org/schema/mule/
management/2.0/mule-management.xsd"
...>
<management:jmx-default-config port="1098" registerMx4jAdapter="true" />
For a list of agents provided with Mule and how to configure them, see JMX Management. You can also
create a custom agent as described below.
For example:
Mule Instances
This page is under construction
Mule provides an internal notification mechanism that you can use to access changes that occur on
the Mule Server, such as a service component being added, a Mule Model being initialized, or the Mule
Manager being started. You can set up your agents or service components to react to these notifications.
Don't confuse notifications with the service events that Mule manages between your service
components and external applications. Notifications are based on changes to the objects
that comprise the Mule Server, whereas service events are the business operations that
your business services process.
Configuring Notifications
Message notifications provide a snapshot of all information sent into and out of the Mule Server. These
notifications are fired whenever a message is received or sent. These additional notifications have some
impact on performance, so they are disabled by default. To enable message notifications, you set the
type of messages you want to enable using the <notifications> element in your Mule configuration file.
You also register the notification listeners and associate interfaces with specific events. For example, first
you create beans for the notification listeners, specifying the class of the type of notification you want to
receive:
<spring:bean name="componentNotificationLogger"
class="org.myfirm.ComponentMessageNotificationLogger"/>
<spring:bean name="endpointNotificationLogger"
class="org.myfirm.EndpointMessageNotificationLogger"/>
Next, you specify the types of messages for which you want to enable the notifications using the
<notification> element, and then register the listeners using the <notification-listener> element:
<notifications>
<notification event="COMPONENT-MESSAGE"/>
<notification event="ENDPOINT-MESSAGE"/>
<notification-listener ref="componentNotificationLogger"/>
<notification-listener ref="endpointNotificationLogger"/>
</notifications>
When you set the COMPONENT-MESSAGE event, a notification is sent before and after a component
is invoked. When you set ENDPOINT-MESSAGE, a notification is sent whenever a message is sent,
dispatched, or received on an endpoint. Because the listeners implement the interface for the type of
notification they want to receive (for example, the ComponentMessageNotificationLogger class would
implement org.mule.api.context.notification.ComponentMessageNotificationListener), the
listeners receive the correct notifications.
For a list of notification event types, see Notifications Configuration Reference. For a list of notification
listener interfaces, see Notification Interfaces below.
If you want to change the interface that is associated with an event, you specify the new interface with
the interface-class and interface attributes:
<notifications>
If you create a custom notification, you also specify the event-class attribute:
<notifications>
<notification event="CUSTOM-MESSAGE" event-class="org.myfirm.MyMessageNotificationsCustomMessage"
interface-class="org.myfirm.MyMessageNotifications" interface="myCustomListener"/>
...
Disabling Notifications
If you want to block a specific interface from receiving an event, you specify it with the <disable-
notification> element. You can specify the event, event class, interface, and/or interface class to block.
<notifications>
<disable-notification interface="ComponentMessageNotificationListener"/>
...
When registering a listener, you can specify that it only receive notifications from a specific component
using the subscription attribute. For example, to specify that the listener only receive messages from a
service component called "MyService1", you would configure the listener as follows:
You can also register listeners and filter the subscriptions from your Java code:
MuleServer.getMuleContext().registerListener(listener, "MyService1");
To register interest in events from all service components with "Service" in the name, you would use a
wildcard string as follows:
MuleServer.getMuleContext().registerListener(listener, "*Service*");
Any objects implementing CustomNotificationListener will receive this event. It's a good idea to
extend CustomNotification and define actions for your custom event type. For example:
Non-system objects in Mule can only fire custom notifications through the
manager. Attempting to fire other events such as ModelNotification will cause an
UnsupportedOperationException.
Depending on the listener implemented, only certain events will be received. For example, if the object
implements ManagerNotificationListener, only events of type ManagerNotification will be received.
Objects can implement more than one listener to receive more types of events.
MuleServer.getMuleContext().registerListener(listener);
Each event has an action code that determines the type of event. The action code can be queried in the
onEvent method to determine its type. For example, to have an object do something when the model
initializes:
MyObject.java
For a list of the action codes available with each notification type, see the Javadocs for the
org.mule.context.notification package and click on the class of the notification type you want.
Notification Payloads
All notifications extend java.util.EventObject, and the payload of the object can be accessed using the
getSource() method. The following table describes the event payloads for each type of event.
A static export of the on-line documentation is created for each major release. This can be useful for
reading off-line.
Profiling Mule
[ Installing the Profiler Pack ] [ Enabling the Profiler Agent ] [ Running the Profiler ] [ Embedded Mule ]
The Mule Profiler Pack uses YourKit to provide CPU and memory profiling, helping you identify memory
leaks in your custom Mule extensions. The Profiler is useful during development and testing. In your
production environment, you should turn off the Profiler because of the high performance overhead. You
can also use any other Profiler, such as JProfiler, by adding it as an agent in your configuration.
If you are installing Mule Community Edition, go to the downloads page, and under the latest stable
community release, expand the Downloads section. You can then click the link to the .zip, .tar, or .gz
version of the Profiler pack. After downloading, unpack it on top of the Mule installation.
Embedded Mule
If you are running Mule embedded in a webapp, the Profiler configuration is completely delegated to
the owning container. Launch YourKit Profiler, Tools -> Integrate with J2EE server... and follow the
instructions. Typically, a server's launch script is modified to support profiling, and you then use this
modified start script instead of the original.
EJB configuration
The resource adapter supports inbound and outbound communication.
<session>
<description>A stateless session bean that sends a message over a Mule transport
</description>
<display-name>SenderEJB</display-name>
<ejb-name>SenderEJB</ejb-name>
<home>org.mule.samples.ejb.SenderHome</home>
<remote>org.mule.samples.ejb.Sender</remote>
<ejb-class>org.mule.samples.ejb.SenderBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
<resource-ref>
<res-ref-name>mule/connectionFactory</res-ref-name>
<res-type>org.mule.ra.MuleConnectionFactory</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Unshareable</res-sharing-scope>
</resource-ref>
</session>
Inbound Configuration
The endpoint property must be a valid endpoint URI to receive Mule events.
<message-driven>
<description>An MDB listening on a Tcp socket</description>
<display-name>TcpReceiverMDB</display-name>
<ejb-name>TcpReceiverMDB</ejb-name>
<ejb-class>org.mule.samples.ejb.SimpleReceiverMessageBean</ejb-class>
<messaging-type>org.mule.api.lifecycle.Callable</messaging-type>
<transaction-type>Container</transaction-type>
<activation-config>
<activation-config-property>
<activation-config-property-name>endpoint</activation-config-property-name>
<activation-config-property-value>tcp://localhost:12345
</activation-config-property-value>
</activation-config-property>
</activation-config>
</message-driven>
Streaming
This page is under construction
Several of Mule's transports support streaming, which enables efficient processing of large data objects
such as files, documents, and records by streaming the data through Mule rather than reading the whole
thing into memory. The following transports support streaming:
• CXF
• File
• HTTP/S
• Jetty/Jetty SSL
• Servlet
• SOAP
• STDIO
• TCP
• UDP
• VM
Advantages of Streaming
Streaming provides the following advantages:
org.mule.impl.model.streaming.StreamingService
interface -
Notice that the <model> type is 'streaming' and that each of the <endpoint> elements have their
'streaming' attribute set.
Finally, there is a
org.mule.components.simple.StreamingBridgeComponent
Please notice the use of the ForwardingConsumer router set on the inbound-router.
Suggested Reading
ESB
ESB Introduction Part 1
This first article in this series described the basic concepts and role of the Enterprise Service Bus (ESB). It
focuses on describing scenarios and issues for ESB deployment to support a Service-Oriented Architecture
(SOA). One or more of these scenarios might apply to the SOA and ESB needs of your organization. - by
Rick Robinson
The ESB Learning Guide - everything you want to know about ESB is here.
Enterprise Integration
Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions - by Gregor
Hohpe, Bobby Woolf
Provides a consistent vocabulary and visual notation framework to describe large-scale integration
solutions across many technologies. It also explores in detail the advantages and limitations of
asynchronous messaging architectures.
SEDA
SEDA
SEDA is an acronym for staged event-driven architecture, and decomposes a complex, event-driven
application into a set of stages connected by queues. This design avoids the high overhead associated
with thread-based concurrency models, and decouples event and thread scheduling from application
logic. Mule uses ideas from SEDA to provide a highly scalable server.
JBI
The Sun JBI Site
Concurrency
Java Concurrency in Practice by Brian Goetz
Quality Improvement in Volunteer Free and Open Source Software Projects: Exploring the Impact of
Release Management by Martin Michlmayr
Third-party Software
Mule products include the following third-party software as part of the source code, examples, or as
dependencies. The license type for each third-party software product is indicated in parentheses.
Transaction Management
[ Single-resource Transactions ] [ XA Transactions ] [ Transaction Manager Lookup ] [ Transaction
Coordination ]
Mule's transaction framework is agnostic to the underlying transaction manager. The transaction could
be a JDBC transaction, XA transaction, or a JMS transaction or message acknowledgment. All transaction
types can be handled the same way. Mule transactions are configured on inbound endpoints, where an
endpoint can be configured to start a new transaction or join an existing one. The outbound endpoints
will automatically enlist in the current transaction, provided that the managed resource is compatible with
the transaction. Transactions are configured on an endpoint using <transaction>, which maps to the
org.mule.transaction.MuleTransactionConfig class. This element defines what action an endpoint should
take when it receives an event and the transaction factory to use to create transactions.
If you have multiple inbound or outbound endpoints in a service and you specify a
transaction for one of them, you must specify transactions for all of them. For example, if
you have two outbound endpoints and you specify a transaction for the first one, you must
also specify a transaction for the second one.
Single-resource Transactions
Single-resource transactions are transactions that are provided by the underlying resource, such as
JDBC transactions and JMS transactions. These kind of transactions can be used to receive and/or send
messages using a single resource only.
This configuration defines a global JMS endpoint that receives on a "test.In" queue and another global
JMS endpoint that sends on a "test.Out" queue. The action attribute tells Mule what to do for each
message. In this case, a new transaction will be created for every message received. The outbound
endpoint will use the resource enlisted in the current transaction, if one is running. In this case, it will use
the same JMS session that has been used to receive the event. When the message has been routed from
the inbound endpoint to the outbound endpoint, the transaction will be committed or rolled back.
You can send multiple messages using the recipient list router, which will send all messages in the same
transaction.
XA Transactions
You can use XA transactions if you want to enlist multiple managed resources within the same
transaction. The inbound endpoints are configured in the same manner as for single-resource
transactions, but the connectors need to be configured to use XA-enabled resources.
If you run Mule outside an application server, you can use JBoss Transaction Manager to configure an
embedded transaction manager.
• VM Transport
• JDBC Transport
• JMS Transport
The following example of an XA transaction configuration uses a single transaction to read from a JMS
queue and write to a database.
<service name="JmsToJdbc">
<inbound>
<inbound-router>
<jms:inbound-endpoint queue="my.queue" reuseSession="false"/>
<xa-transaction action="ALWAYS_BEGIN" timeout="60000"/>
</jms:inbound-endpoint>
</inbound-router>
</inbound>
<outbound>
<outbound-pass-through-router>
<jdbc:outbound-endpoint address="writeTest" type="2">
<xa-transaction action="ALWAYS_JOIN"/>
</jdbc:outbound-endpoint>
</outbound-pass-through-router>
</outbound>
</service>
Because the inbound JMS endpoint has an XA transaction configured on it, any outbound endpoints must
also be configured with XA transaction support to become part of the XA transaction. This requires that
the transport type supports XA transactions. For this configuration to work, you will need to configure a
JMS connector that uses a JMS XA Connection Factory and a JDBC connector that is configured to use an
XA data source.
Note: Depending on your application server vendor, the transaction manager might be available via JNDI
or only through proprietary APIs.
Weblogic javax.transaction.TransactionManager
org.mule.transaction.lookup.We
For example, to use Weblogic's transaction manager, you would configure Mule as follows:
<transaction-manager factory="org.mule.transaction.lookup.WeblogicTransactionManagerLookupFactory"
/>
Transaction Coordination
Transaction demarcation is set on endpoints. The actual management of transactions is handled by the
Mule Transaction Coordinator . Note that any transacted event flows will be synchronous. The Transaction
Coordinator is a singleton manager that looks after all the transactions for a Mule instance and provides
methods for binding and unbinding transaction and retrieving the current transaction state.
META-INF/services/org/mule/providers/<protocol>.properties
Following are the properties that can be set in a transport service descriptor.
Tuning Performance
About Threading Profiles | Calculating Threads | Additional Performance Tuning Tips | Threading Profile
Configuration | About Pooling Profiles | About Queue Profiles
A Mule application is a collaboration of a set of services. Messages are processed by services in three
stages:
Tuning performance in Mule involves analyzing and improving these three stages for each service. You
can start by applying the same tuning approach to all services and then further customize the tuning for
each service as needed.
Messaging Styles
Mule can send messages asynchronously or synchronously. By default, Mule uses the SEDA model, which
is asynchronous. Asynchronous is the "fire-and-forget" style, where a message is sent with no response.
If you need a response back, you must configure the Mule service as synchronous. When a service is
configured as asynchronous, a connector receiver and dispatcher are used, whereas a synchronous
service uses only the connector receiver.
If you are using synchronous processing, the same thread will be used to carry the message all the way
through Mule, whereas if you are doing asynchronous processing, the receiver thread is used only to
carry the message to the component, at which point the message is transferred to a component thread,
and the receiver thread is released back into the receiver thread pool so it can carry another message.
Finally, the component transfers the asynchronous message to a dispatcher thread where it is sent on its
way.
In summary, the receiver, component, and dispatcher all have separate thread pools that are in use
during asynchronous processing, whereas only the receiver thread pool is in use for synchronous
processing. The exception to this rule is the rare case when your component does explicit dispatching, in
which case the dispatcher thread is used even for synchronous requests.
Calculating Threads
To calculate the number of threads to set, you must take the following factors into consideration.
Concurrent User Requests
In general, the number of concurrent user requests is the total number of requests to be processed
simultaneously at any one time by the Mule server. For a service, concurrent user requests is the number
of requests a service inbound endpoint can process simultaneously. Concurrent user requests at the
connector level is the total concurrent requests of all services who share the same connector.
Processing Time
Processing time is the average time Mule takes to process a user request from the time a connector
receiver starts the execution until it finishes and then sends the response to the outbound endpoint by
connector dispatcher or back to the caller by connector receiver after a round trip.
Response Time
In a thread pooling environment, when a request arrives, there is no guarantee that a thread will be
immediately available. In this case, the request is put into an internal thread pool work queue to wait for
the next available thread.
If a service runs in synchronous mode, the response time is the amount of time the end user is required
to actually wait for the response to come back. If the service runs in asynchronous mode, it is the
total time from when a request arrives in Mule until it is dispatched out of the service by the outbound
dispatcher. The formula for response time is the following:
Response time = average of thread pool waiting time in work queue + average of processing time
Usually, processing time data is generated from the unit test, whereas concurrent user requests and
response times come directly from business requirements.
To calculate how many threads you should assign to the receiver thread pool, multiply the required
number of simultaneous requests by the number of components that use that connector for their inbound
endpoints. For example, if you have three components whose inbound endpoints use a connector,
If you have requirements for timeout settings for synchronous processing, you need to do some
additional calculations for the receiver thread pool.
1. Calculate the required simultaneous requests multiplied by the components as described above.
2. Figure out how long each round trip request takes by running some test cases with synchronous
requests.
3. Subtract the round-trip time from the timeout setting dictated by your business requirements. This
is your maximum wait time.
4. Divide the maximum wait time by the round-trip time to get the batch time.
5. Divide the required simultaneous requests by the batch time to get the thread size for
maxThreadsActive.
6. Set maxBufferSize to the required simultaneous requests minus the maxThreadsActive setting.
For example, if you require the ability to process 200 requests simultaneously, and your timeout setting
is 10 seconds, and a request takes 2 seconds, your maximum wait time is 8 seconds (10 seconds
timeout minus round-trip time). Divide the maximum wait time (8 seconds) by the round-trip time (2
seconds) to get your batch time (4 seconds per batch). Finally, divide your requests requirement (200
requests) by the batch time (4 seconds) to get the maxThreadsActive setting (50) for the receiver
thread pool. Subtract this same number (50) from the required simultaneous requests (200) to get your
maxBufferSize (150).
After you have calculated your receiver threads, look at how many components use synchronous
processing and asynchronous. If most do asynchronous process, apply the same number to the
component thread pool and dispatcher thread pool. If you do mostly synchronous process, these numbers
can be much lower. When you configure your component thread pool, be sure to set the the component
pool at the same time as described in "About Pooling Profiles" below.
log4j.rootCategory=INFO, mulelogfile
log4j.appender.mulelogfile=org.apache.log4j.FileAppender
log4j.appender.mulelogfile.layout=org.apache.log4j.PatternLayout
log4j.appender.mulelogfile.layout.ConversionPattern=%-22d{dd/MMM/yyyy HH:mm:ss} - %m%n
log4j.appender.mulelogfile.file=custommule.log
• If polling is enabled for a connector, one thread will be in use by polling, so you should increment
your maxThreadsActive setting by one. Polling is available on connectors such as File, FTP, and
STDIO that extend AbstractPollingMessageReceiver .
• If you are using VM to pass a message between components, you can typically reduce the total
number of threads because VM is so fast.
• If you are processing very heavy loads, or if your endpoints have different simultaneous request
requirements (for example, one endpoint requires the ability to process 20 simultaneous requests
but another endpoint using the same connector requires 50), you might want to split up the
connector so that you have one connector per endpoint.
Thread pools in Mule use the JDK 1.4-compatible util.concurrent backport library, so all
the variables defined on org.mule.config.ThreadingProfile are synonymous with
ThreadPoolExecutor.
Attributes of <receiver-threading-profile...>
Attributes of <component-threading-profile...>
Attributes of <dispatcher-threading-profile...>
Each service has its own pooling profile. You configure the pooling profile using the <pooling-profile>
element on the <pooled-component> element.
Pooling Profile
Attributes of <pooling-profile...>
exhaustedAction WHEN_EXHAUSTED_GROW/
no WHEN_EXHAUSTED_GROW
Specifies the
WHEN_EXHAUSTED_WAIT/ behavior of the
WHEN_EXHAUSTED_FAIL Mule component
pool when the
pool is exhausted.
Possible
values are:
"WHEN_EXHAUSTED_FAIL",
which will throw a
NoSuchElementException,
"WHEN_EXHAUSTED_WAIT",
which will
block (invoke
Object.wait(long))
until a new or
idle object is
available, or
WHEN_EXHAUSTED_GROW,
which will create
a new Mule
and return
it, essentially
making maxActive
meaningless. If a
positive maxWait
value is supplied,
it will block for at
most that many
milliseconds,
after which a
NoSuchElementException
will be thrown. If
maxThreadWait
If required, you can write your own persistence strategy to write to a database or some other store.
Persistence strategies must implement QueuePersistenceStrategy .
You configure the queue profile using the <queue-profile> element on the model. Note that you can use
Mule HQ to monitor your queues and see historically how many messages it has contained.
Queue Profile
A Queue Profile is used to describe the properties of an internal Mule queue. Internal queues are used to
queue events for each component managed by Mule.
Attributes of <queue-profile...>
maxOutstandingMessages
integer no Defines the
maximum number
of messages that
can be queued.
Unit Testing
Mule provides a Test Compatibility Kit (TCK) of unit tests that you can use to test your simple
extensions as well as your custom modules and transports. The unit tests are located in the -
tests.jar file, such as mule-core-2.0.2-tests.jar for Mule version 2.0.2. All unit tests inherit from
org.mule.tck.AbstractMuleTestCase .
• Components tested with a TCK test case ensure that the common behavior of the component is
compatible with the Mule framework.
• Using a TCK test case allows the developer to concentrate on writing tests for specific behavior of
their component.
• Where testing of a method in the Service Component API cannot be tested by the TCK test case,
the test cases provides an abstract method for the test, ensuring the developer tests all areas of the
component.
• The TCK provides a default test model that is a simple set of test classes. The developer doesn't
need to worry about writing new test classes for their test cases each time.
• The abstract test cases in the TCK use JUnit's TestCase, so they are compatible with other test
cases.
Using IDEs
You can use an integrated development environment (IDE) such as Eclipse, IntelliJ, and Mule IDE to
rapidly develop Mule applications. For more information on the Mule IDE, see the Mule IDE User Guide.
Usually, you simply attach the src.zip file that comes with the Mule distribution to the Mule JARs in your
project so you can browse the source code while developing your classes. If you want to build Mule from
source, see the following topics in the Mule Developer's Guide:
Configuring JMS - A guide for configuring various JMS servers with Mule, including ActiveMQ, JBoss MQ,
Joram OpenJms, Oracle AQ, SeeBeyond, Sun JMS Grid, UberMQ, Weblogic JMS, and IBM WebSphere MQ.
Examples
Error Handler Example and Loan Broker Example - Demonstrate using the Active MQ connector and
various JMS transformers.
Using JMS Redelivery - How to configure Jms Redelivery in Mule (Mule 1.x).
Configuring Multiple JMS Clients - How to configure more than one JMS connection in a single Mule
instance (Mule 1.x).
Configuring a Component Exception Queue - configuring a JMS error queue for your components (Mule
1.x).
JMS Provider Bridging - Moving JMS messages between JMS servers from different vendors (Mule 1.x).
Configuring JMS
The following links describe how to set up various JMS Servers in Mule. For general configuration
information, see JMS Transport. Note that the configurations provided are just examples. Configuration
values will change depending on your application environment.
• ActiveMQ
• FioranoMQ
• JBoss MQ
• OpenJms
• Oracle AQ
• SeeBeyond
• SonicMQ
• Sun JMS Grid
• SwiftMQ
• Tibco EMS
• WebLogic JMS
• WebSphere MQ
jms:////order/incoming
For topics, add the standard prefix, so it takes the following form:
jms:////topic:order/incoming
Note: If using JBoss, remember to omit the queue/ and topic/ from the full JNDI name.
ActiveMQ Integration
You can integrate Mule with Apache ActiveMQ. To configure a default embedded broker, you use the
<activemq-connector> or <activemq-xa-connector> (for transaction support) element in your Mule
configuration. These connectors take all the same attributes and elements as the JMS connector with the
additional attribute brokerURL.
The specification attribute tells Mule to use the JMS 1.1 specification, which is the specification
ActiveMQ supports. The connectionFactory-ref attribute specifies a set of connection factory properties
you define in your Spring configuration.
activemq-spring.xml
Your ActiveMQ configuration file uses standard settings. For example, to use in-JVM messaging without
persistent queues (very useful for testing), the file might look like this:
activemq-config.xml
<beans>
<broker>
<connector>
<serverTransport uri="vm://localhost"/>
</connector>
<jms:connector name="FioranoJMSConnector"
connectionFactoryJndiName="PrimaryCF"
jndiInitialFactory="fiorano.jms.runtime.naming.FioranoInitialContextFactory"
specification="1.1"
jndiProviderUrl="http://localhost:1856"
username="anonymous"
password="anonymous">
• FioranoMQ2007/fmq/lib/client/all/fmq-client.jar
• FioranoMQ2007/framework/lib/all/fiorano-framework.jar
Sample Usage
The following steps illustrate modifying the "Echo" sample shipped with Mule. Instead of using
System.out in the outbound router, we will write the output onto a Topic in FioranoMQ using the above
configuration.
Modify the outbound router in the echo-config.xml under examples\echo\conf to use a Topic:
<jms:outbound-endpoint topic="muleTopic"/>
Start the durable connection sample available in FioranoMQ from a command prompt in fmq/samples/
PubSub/DurableSubscribers as shown below:
Now on starting Mule with the above echo-config.xml file we can push messages onto the topic and
consequently to the subscriber.
The durable connection property can also be tested by killing the subscriber, pumping in more messages
and then again starting the subscriber.
Example:
<jms:connector name="jmsConnector"
connectionFactoryJndiName="ConnectionFactory"
jndiDestinations="true"
forceJndiDestinations="true"
jndiInitialFactory="com.swiftmq.jndi.InitialContextFactoryImpl"
jndiProviderUrl="smqp://localhost:4001/timeout=10000"
specification="1.1"/>
After you have configured the connector, copy swiftmq.jar into the Mule lib/user directory and start
the SwiftMQ Router. You can now use SwiftMQ from Mule.
<jms:connector name="jmsConnector"
connectionFactoryJndiName="ConnectionFactory"
jndiDestinations="true"
forceJndiDestinations="true"
jndiInitialFactory="com.swiftmq.jndi.InitialContextFactoryImpl"
jndiProviderUrl="smqp://localhost:4001/timeout=10000"
specification="1.1"/>
The Loan Broker ESB example uses the following JMS queues (Mule syntax):
SwiftMQ does not allow dots '.' in queue names. Instead, use underscores '_' in SwiftMQ's
routerconfig.xml:
<swiftlet name="sys$queuemanager">
<queue-controllers>
<queue-controller name="01" persistence-mode="non_persistent" predicate="tmp$%"/>
<queue-controller name="02" predicate="sys$%"/>
<queue-controller name="03" predicate="swiftmq%"/>
<queue-controller name="04" predicate="rt$%"/>
<queue-controller name="05" predicate="unroutable"/>
<queue-controller name="06" predicate="%$%"/>
<queue-controller name="07" predicate="%"/>
</queue-controllers>
<queues>
<queue name="esb_banks"/>
<queue name="esb_credit_agency"/>
<queue name="esb_lender_service"/>
<queue name="esb_loan_quotes"/>
</queues>
</swiftlet>
To match with the Loan Broker ESB example's JMS queue names, define JNDI aliases in SwiftMQ's
routerconfig.xml:
<swiftlet name="sys$jndi">
<aliases>
<alias name="esb.banks" map-to="esb_banks@router1"/>
<alias name="esb.credit.agency" map-to="esb_credit_agency@router1"/>
<alias name="esb.lender.service" map-to="esb_lender_service@router1"/>
<alias name="esb.loan.quotes" map-to="esb_loan_quotes@router1"/>
</aliases>
<jndi-replications/>
<remote-queues/>
</swiftlet>
You now rebuild the Loan Broker ESB example with Ant or Maven so that the configuration changes can
take effect, then start the SwiftMQ Router and the Loan Broker ESB example.
Note that the @ sign can be escaped with %40 in the Mule URI, so for an alternate configuration you can
use the following:
Keep in mind that a SwiftMQ JNDI alias also decouples a queue from its physical location. You can move
a queue to another router without affecting clients. So it's always best practice to avoid physical queue
names.
<spring:beans>
<util:properties id="jndiEnv">
<spring:prop key="java.naming.factory.initial">org.jnp.interfaces.NamingContextFactory</
spring:prop>
<spring:prop key="java.naming.provider.url">jnp://localhost:1099/</spring:prop>
</util:properties>
<jee:jndi-lookup id="connectionFactory" jndi-name="java:/ConnectionFactory" environment-
ref="jndiEnv"/>
</spring:beans>
If you use user credentials to connect to JBoss MQ, make sure that the user has the 'guest'
role assigned to it. This will ensure that there are no issues if Temporary Topics or Queues
(e.g., in RemoteSync calls) are used.
OpenJMS Integration
The following example configuration describes how to configure a Mule JMS connector for OpenJMS.
You will probably need to change the connectionFactoryJndiName to one that is configured from your
OpenJMS configuration.
<jms:connector name="jmsConnector"
jndiInitialFactory="org.exolab.jms.jndi.InitialContextFactory"
jndiProviderUrl="tcp://localhost:3035"
connectionFactoryJndiName="QueueConnectionFactory"/>
<jms:connector name="jmsConnector"
jndiInitialFactory="com.stc.is.naming.NamingContextFactory"
jndiProviderUrl="[ServerName]:18006"
connectionFactoryJndiName="/jms/connectionfactory/queue/[LogicalHostName]_[JMS iqManager Name]"/>
</jms:connector>
You will need the following files from the Java API Kit on your classpath:
• com.stc.jmsis.jar
• fscontext.jar
• providerutil.jar
• jms.jar
• jta.jar
• log4j.jar
• log4j.properties
SonicMQ Integration
The following configuration was tested with versions 6.1 and 7.0 of SonicMQ.
<jms:connector name="jmsSonicMQConnector"
jndiInitialFactory="com.sonicsw.jndi.mfcontext.MFContextFactory"
specification="1.1"
connectionFactoryJndiName="sonic-cf"
jndiProviderUrl="tcp://localhost:2506"
username="Administrator"
password="Administrator">
<spring:property key="connectionFactoryProperties">
<spring:map>
<spring:entry key="clientID" value="clientIDString"/>
<spring:entry key="connectID" value="connectIDString"/>
<spring:entry key="connectionURLs" value="somURLStrings here"/>
<spring:entry key="defaultUser" value="userString"/>
<spring:entry key="defaultPassword" value="passwordString"/>
<spring:entry key="prefetchCount" value="10"/>
<spring:entry key="prefetchThreshold" value="10"/>
<spring:entry key="faultTolerant" value="true"/>
<spring:entry key="persistentDelivery" value="true"/>
<spring:entry key="loadBalancing" value="true"/>
<spring:entry key="sequential" value="false"/>
</spring:map>
</spring:property>
<spring:property key="jndiProviderProperties">
<spring:map>
<spring:entry key="com.sonicsw.jndi.mfcontext.domain" value="Domain1"/>
<spring:entry key="java.naming.security.principal" value="Administrator"/>
<spring:entry key="java.naming.security.credentials" value="Administrator"/>
<!-- optional, default is 30sec -->
<spring:entry key="com.sonicsw.jndi.mfcontext.idleTimeout" value="5000"/>
</spring:map>
</spring:property>
</jms:connector>
<jms:connector name="jmsConnector"
jndiProviderUrl="tibjmsnaming://host:port"
connectionFactoryJndiName="QueueConnectionFactory"
username="username"
password="password"
jndiDestinations="true"
forceJndiDestinations="true"
jndiInitialFactory="com.tibco.tibjms.naming.TibjmsInitialContextFactory"
specification="1.1">
<spring:property name="jndiProviderProperties">
<spring:map>
<spring:entry key="java.naming.security.principal" value="jndiUsername"/>
<spring:entry key="java.naming.security.credentials" value="jndiPassword"/>
</spring:map>
</spring:property>
</jms:connector>
For XA transactions, you must create an XA Connection Factory from the TIBCO administration-tool
(tibemsadmin) as follows:
WebLogic 9.x
For WebLogic 9.x, the configuration is almost the same. The only differences are:
• Supported JMS specification level is 1.1 (1.0.2b should still work, however)
• The unified JMS connection factory can be used as a result of the above. The following example
demonstrates using the default factories available out of the box.
<jms:connector name="jmsConnector"
jndiProviderUrl="t3://localhost:7001"
connectionFactoryJndiName="weblogic.jms.ConnectionFactory"
jndiDestinations="true"
forceJndiDestinations="true"
jndiInitialFactory="weblogic.jndi.WLInitialContextFactory"
specification="1.1"/>
WebSphere MQ Integration
If you are using WebSphere MQ, there are two transports you can use:
• The Mule WMQ transport provides support for native MQ. This transport is available only with Mule
Enterprise 1.6 or later.
• The JMS Transport includes a WebSphere connector that does not provide support for native MQ
but provides more functionality than the Mule WMQ connector and is available with the community
edition of Mule. The rest of this page describes the WebSphere connector in the JMS transport.
To configure the WebSphere MQ JMS connector for Mule, you do the following:
Configuring Mule
In your Mule configuration file, add the following connector configuration:
<jms:connector name="jmsConnector"
connectionFactoryJndiName="jms/ConnectionFactory"
jndiInitialFactory="com.ibm.websphere.naming.WsnInitialContextFactory"
specification="1.1">
<spring:property name="connectionFactoryProperties">
<spring:map>
<spring:entry key="hostName" value="myMQServer"/>
<spring:entry key="transportType" value="1"/>
<spring:entry key="name" value="myMQConnector"/>
</spring:map>
</spring:property>
</jms:connector>
The hostName property is mandatory and refers to a name that will be used for this connection. This is
different from the host property, which refers to an IP address or network name of the server hosting
WebSphere MQ. In addition to the name attribute for the connector, you must also set a name property for
WebSphere.
If you're using IBM's connection factory, you may additionally need the following configuration - the
connection factory is configured in Spring here:
<jms:connector name="jmsConnector"
connectionFactoryJndiName="jms/ConnectionFactory"
jndiInitialFactory="com.ibm.websphere.naming.WsnInitialContextFactory"
specification="1.1"
connectionFactory-ref="MQConnectionFactory"/>
<spring:beans>
Note that WebSphere MQ v5.3 requires at least Fix Pack 6 (CSD06) applied for JMS 1.1 support. Earlier
levels must set the specification property to 1.0.2b.
The latest WebSphere MQ Fix Packs can be downloaded here: http://www-1.ibm.com/support/
docview.wss?uid=swg27006037
You will also need the following IBM WebSphere JARs on your classpath:
• com.ibm.mq.jar
• com.ibm.mqjms.jar
• connector.jar
If you are using WAS, refer to this discussion for some known limitations.
Using Mule HQ
Overview
Mule HQ provides a centralized way to manage all of your Mule deployments as well as all of the disparate
systems and services in your SOA infrastructure. For example, a typical stack that Mule HQ monitors
might include Redhat Enterprise Linux, MySQL, JBoss Application Server, OpenMQ, and Mule.
Mule HQ provides integrated log, configuration, and server event tracking. It can detect Mule servers
and associated software and hardware, and report real-time and historical details of events. If you need
to debug a problem with your deployment, you can turn on the Profiler and view the details of memory
consumption at the message level.
Mule HQ is available with Mule Enterprise Edition only. It can monitor both Community Edition and
Enterprise Edition instances of Mule 1.x and 2.1 servers.
HQ Architecture
Mule HQ is based on Hyperic HQ. This section describes the Hyperic HQ Server and Agent.
Hyperic HQ Server
As HQ's central nervous system, the HQ Server coordinates all system functions, including:
In large environments, the HQ Server can be clustered to enhance fault tolerance and to share the overall
system load across multiple machines.
Acting as the sensory facilities of the HQ system, Agents are deployed throughout the network
infrastructure to provide points-of-presence for discovering inventory, gathering data, controlling
software, and other "in the trenches" tasks.
The HQ Shell's Agent installer makes quick work of installing and managing all your HQ Agents - without
ever having to visit each managed machine.
Your Mule configuration files must be available to Mule HQ on a relative or absolute path.
They cannot be embedded in a JAR file.
The default JMX support agent configures several JMX agents simultaneously. To add this to your
configuration, you add the management workspace and the <management:jmx-default-config> element
to your configuration file. For example:
You can also provide more advanced configuration, such as using the RMI registry agent and specifying
the JMX server explicitly:
<management:rmi-server serverUri="rmi://localhost:9000"/>
<management:jmx-server>
<management:connector-server url="service:jmx:rmi:///jndi/rmi://localhost:9000/server"/>
<management:credentials>
<spring:entry key="user" value="pass"/>
</management:credentials>
</management:jmx-server>
The Mule Profiler pack allows you to profile your application (see Profiling Mule). After downloading and
installing the Profiler pack, you add the following element to your Mule configuration file:
<management:yourkit-profiler />
You must also add the -profile attribute to the bash/cmd script. For example, if you are using Windows,
you would edit stockquote.bat as follows:
If you are using a non-Windows operating system, you would edit it as follows:
if [ 1 = $i ]
then
exec "$MULE_BASE/bin/mule" -config "./conf/stdio-config.xml,./conf/stockquote-rest-config.xml" -
builder spring -profile
The configuration file you specify in the batch file depends on which variation and Mule instance you want
to use. The previous example specified the REST version of the Stock Quote example.
When you run Mule, you must specify the -M-Dmule.serverId=MULE_SERVER_ID switch on the command
line (where MULE_SERVER_ID is the name of your Mule server) or set it programatically by calling
org.mule.config.DefaultMuleConfiguration.setId(). This will create the Mule.MULE_SERVER_ID JMX
domain, which Mule HQ will use to detect the Mule instance. You'll set this same domain ID when you
configure Mule in Mule HQ.
Verify that your configuration changes were applied by starting the Mule instance you just configured (be
sure to specify the server ID as described in the previous section). For example, launch the stock quote
example and select REST when prompted:
Installing Mule HQ
This section describes how to install the HQ Server and Agent. By default, Mule HQ uses its own
internal database. To install Mule HQ with an external database, see Installing Mule HQ with an External
Database.
Prerequisites
1. Log in as a non-root user and install Mule. Make sure that this non-root user account has Java in
the environment variable PATH and has write permission to <MULE_BASE>/conf/wrapper* files or
<MULE_HOME>/conf/wrapper* files, depending on whether MULE_BASE is set.
2. Configure your Mule instance to support Mule HQ (see Enabling Mule to Use Mule HQ).
3. On UNIX platforms, ensure that libXp.so.6 is installed. HQ Server requires this library to create
charts and other graphics in the user interface.
For more information on prerequisites, see the Installation Overview on the Hyperic site.
Install Mule HQ
1. On the computer where you want to install Mule HQ, log in as the same non-root user you used
when you installed Mule, and then create a directory called MuleHQ, such as C:\Program Files
\MuleHQ.
Example Installation
This example illustrates what you see during installation. For simplicity, everything will be installed on the
localhost. The values you enter during installation are marked in bold.
Buildfile: C:\Temp\mule-hq-installer\installer-3.1.2-EE\bin\..\data\setup.xml
Initializing Mule HQ 3.1.2-EE Installation...
Loading taskdefs...
Taskdefs loaded
Choose which software to install:
1: Mule HQ Server
2: Mule HQ Shell
3: Mule HQ Agent
You may enter multiple choices, separated by commas.
1,3
HQ server installation path [default 'C:\Program Files']:
C:\Program Files\MuleHQ
HQ agent installation path [default 'd:/server/MuleHQ']:
Loading install configuration...
Install configuration loaded.
Preparing to install...
Validating agent install configuration...
Validating server install configuration...
Checking server webapp port...
Checking server secure webapp port...
Checking server JRMP port...
Checking server JNP port...
Verifying admin user properties
Validating server DB configuration...
Installing the agent...
Looking for previous installation
Unpacking agent to: d:/server/MuleHQ/agent-3.1.2-EE...
Installing the JRE ...
Unpacking JRE x86-win32-jre.exe to: d:/server/MuleHQ/agent-3.1.2-EE...
Setting permissions on agent binaries...
Fixing line endings on text files...
--------------------------------------------------------------------------------
Installation Complete:
Agent successfully installed to: d:/server/MuleHQ/agent-3.1.2-EE
--------------------------------------------------------------------------------
You can now start your HQ agent by running this command:
d:\server\MuleHQ\agent-3.1.2-EE\hq-agent.exe start
Installing the server...
Unpacking server to: d:/server/MuleHQ/server-3.1.2-EE...
Creating server configuration files...
Copying binaries and libraries to server installation...
Copying server configuration file...
Copying server control file...
Copying server binaries...
Copying server libs...
Setting up server database...
Setting up JDBC driver...
Copying database files...
For more detailed installation instructions, see the following Hyperic documentation:
• Windows
• Non-Windows
You can install the HQ Server as a Windows Service so that you can leave the HQ Server running even
after you log out of Windows. To install it as a service, navigate to the Mule HQ Server bin directory
(such as C:\Program Files\MuleHQ\server-3.1.2-EE\bin) and enter the following command at the
command prompt:
hq-server.exe -i
This command creates two services: Hyperic HQ Database and Hyperic HQ Server. You start the database
service first and then the server.
Starting Mule HQ
To start Mule HQ, you start the database, then the server, and then the agent.
Navigate to the Mule HQ Server bin directory and execute the following commands:
db-start
hq-server
Note that there will be no console output from the first script. The second script should indicate that the
core system was initialized and that it is configuring from URL: resource:log4j.xml. Leave this command
window open while you are running Mule HQ.
If you installed the HQ Server as Windows services, you can start and stop the services from the Services
application in the Control Panel, or you can enter the following commands at the command prompt:
In a new command window, navigate to the agent directory (such as C:\Program Files\MuleHQ
\agent-3.1.2-EE) and enter the following command at the command prompt:
hq-agent
You must now answer several questions at the prompt. If you are testing the setup, you can specify
localhost for the server IP address and accept the defaults for everything else. For more information on
the agent settings, see Mule HQ Agent Settings.
If the connection fails, and you are using an evaluation version of Mule HQ, your license
may have expired. Click here to contact MuleSource about purchasing a license.
Stopping Mule HQ
To stop the server, log out of your Windows session, or enter the following command:
hq-server stop
If you installed the HQ Server as a Windows service, you can stop the service from the Services
application, or by entering net stop "Hyperic HQ Server" at the command prompt.
Logging in to Mule HQ
To log in to Mule HQ, do the following:
1. In a web browser, navigate to port 7080 of the server on which Mule HQ is installed, such as
http://localhost:7080/ or http://hostname.network.com:7080/.
The Mule HQ Login screen appears.
If the login screen does not appear, and you are using an evaluation version of
Mule HQ, your license may have expired. Click here to contact MuleSource about
purchasing a license.
Importing Mule
The Dashboard consists of several portlets that provide information about the HQ deployment. The first
portlet is the Auto-Discovery portlet, which discovers platforms, servers, and services on your system
and displays them here. After first starting Mule HQ, the portlet displays several entries (platform and
servers) for the newly registered HQ Agent on the local machine and for any other resource it has found
You can manually import the platform, or use scripts to manage integration with Mule.
On the Dashboard, select the radio button next to your host (and next to any other platform and server
entries in this portlet) and click Add to Inventory.
Mule HQ provides scripts for managing integration with Mule from the command line or programmatically.
To enable these scripts, copy the file commons-cli-1.1.jar from MULE_HOME\lib\boot to the following
location under your Mule HQ server directory: hq-engine\server\default\deploy\hq.ear\lib
To run these scripts, you enter the following command at the command prompt:
The following optional parameters constrain the subcommand to a specific Mule platform (otherwise, all
Mule platforms are affected):
Command Description
After importing a Mule instance manually or through the scripts, the Mule servers are added to Mule HQ.
After importing the Mule platform, if you want to run auto-discovery manually to discover recently added
Mule instances, do the following:
Click the Dashboard to see the newly discovered resources that are ready for import.
To configure Mule:
1. On the Dashboard, click the Mule platform, click the Mule instance you want to configure, and click
the Inventory tab.
2. Scroll down until you see the Configuration Properties group, click it to expand its contents, and
then click Edit.
3. Enter the following settings:
• Specify the domain as Mule followed by a period followed by the Mule server ID you specified
when you ran Mule (see Setting the Server ID), such as Mule.MyMuleServer. This step is very
important. If the domain was already imported through auto-discovery, you can leave it as is.
• Specify the JMX URL used by your Mule instance. This URL is displayed on the startup screen
when you start Mule under Agents Running. If you do not see the JMX Agent listed, you have
not properly configured your Mule instance to work with Mule HQ--see Enabling Mule to Use
Mule HQ above.
• Leave the user name and password as empty values.
• Enable the Auto-Discover Components, Connectors, and Other Services option.
Make sure the metrics you want are collected often enough so you see the
results faster. Otherwise, it defaults to 1 minute.
4. Click OK.
For complete instructions on configuring resources in HQ, see Getting Started with HQ.
1. Navigate to the conf directory in your Mule HQ Server directory, and then open hq-server.conf for
editing.
2. Configure your mail server and set up email addresses for all Mule HQ users you want to notify, then
save and close the file.
3. In Mule HQ, click Mule, click the Alert tab, click New, and then specify a condition where the
availability metric's value is less than 100%.
4. Save the alert definition and specify the users to be notified for this condition.
To work around this limitation, Mule can start a local RMI registry (the JBoss 4.x registry will not work,
as it is not pure RMI) and connect via this lookup. To enable this approach, set the port attribute on
the <jmx-default-config> element in Mule as shown in Configure the JMX Support Agent above. This
ensures both the registry and JMX connector are coordinated properly and allows you to assign custom
connection ports. You then specify the JMX ServiceURL in MuleHQ as:
service:jmx:rmi:///jndi/rmi://localhost:1098/server
Because Mule HQ will not automatically discover this Mule instance, you must add it manually in the Mule
HQ application. You can specify a dummy server directory but specify the correct JMX URL and port. After
loading Mule HQ Server, the new Mule instance is discovered along with its components, routers, and
more.
• Monitoring Basics
• Controlling Resources
Following is a description of some of the key features for monitoring and controlling your resources in
Mule HQ.
As you monitor your components, note that statistics are not generated for
BridgeComponents, such as the BridgeComponent in the Stock Quote example.
You can use the Stop, Start, and Restart control actions on the Control tab in Mule HQ to control a Mule
server, component, endpoint, router, or connector.
• The Stop command stops the Mule server and all related processes.
• The Start command launches a new Mule server instance using the HQ Agent. The HQ Agent creates
and executes a new command line using the configuration parameters stored in the inventory.
• The Restart command send a "restart" signal to restart the JVM and re-read the configuration
file. The Wrapper is not stopped, and external parameters like debug, profile, service, and the
configuration file are unchanged. Therefore, Restart is not the same as using the Stop and Start
commands.
Mule is integrated with YourKit Java Profiler 7.0, the industry leader among profiling tools. If you installed
Mule and Mule HQ with the profiling option, you can use the Profiling tab in Mule HQ to create a snapshot,
start CPU profiling, and more. Captured snapshots are saved in ~/Snapshots/ on Linux.
If you did not install the Profiling kit with Mule or did not enable it, the Profiling tab indicates that the
profiler is not installed or enabled. If you want to install it now, you can download the ZIP or GZ version
of the mule-profiler-pack file here and follow the instructions here to install it.
Patch Management
The Mule Center tab in Mule HQ provides a list of all your Mule servers. It also allows you to install Mule
patches to remote servers that have been distributed to you by MuleSource.
You can view the Mule log files from remote servers in Mule HQ by clicking the Show Log link on the
Indicators tab when viewing the details of a Mule server.
hq-server.exe -u
hq-agent.exe -u
For complete information on uninstalling HQ, see Uninstalling Hyperic HQ on the Hyperic site.
PostgreSQL
Oracle
MySQL
Notes
PostgreSQL 8.0
During installation, Mule HQ creates a language in the PostgreSQL database, but Mule HQ cannot create
the language automatically in PostgreSQL 8.0. Therefore, to use version 8.0, you must run the following
command on the Mule HQ database before starting the Mule HQ Server.
The createlang executable is located in the bin directory of your PostgreSQL installation.
MySQL 5.0
MySQL 5.0 or higher is not yet supported by Hyperic HQ and is currently in Beta. Support is expected for
Hyperic HQ 3.2.
To make the Agent deployment process easier, you can specify these settings in the agent.properties
file located in the agent root directory. The file looks like this:
agent.properties
agent.setup.camIP=172.30.46.145
agent.setup.camPort=7080
agent.setup.camSSLPort=7443
agent.setup.camSecure=yes
agent.setup.camLogin=hqadmin
agent.setup.camPword=hqadmin
agent.setup.agentIP=*default*
agent.setup.agentPort=*default*
where values of camIP, camLogin and camPword parameters should be replaced with your HQ Server IP,
user name, and password. By setting these values in the file, you will no longer need to interactively
answer questions when you first start up the Mule HQ Agent.
Additionally, the MuleServerDetector uses an Internet connection to get some DTDs. If you use an
external HTTP proxy for your Internet connection, you must add the following value to the agent.javaOpts
property:
-Dhttp.proxyHost=<PROXY_HOST> -Dhttp.proxyPort=<PROXY_PORT>
For more information on agent properties see the HQ Agent Configuration page on the Hyperic site.
Spring Extras Module Extensions for using the Spring framework with
Mule.
Acegi Module
This module provides Acegi-based security and delegates authorization to some other provider.
Security Manager
Attributes of <delegate-security-provider...>
security-property 0..*
Attributes of <http-security-filter...>
realm string no
JAAS Module
This module provides security via JAAS.
Security Manager
This is the security provider type that is used to configure JAAS related functionality.
password-encryption-strategy 0..*
Security Provider
This is the security provider type that is used to configure JAAS related functionality.
Attributes of <security-provider...>
loginContextName string no
credentials string no
loginConfig string no
loginModule string no
Transaction Manager
To configure an instance of the JBoss transaction manager within Mule, add this element to your Mule
XML config file. You can configure arbitrary properties on the transaction manager that will be passed on
to the underlying transaction manager. For example:
<jbossts:transaction-manager>
<property key="test" value="TEST"/>
</jbossts:transaction-manager>
You can then declare XA transactions on endpoints supporting XA transactions, and all those transactions
will be managed by the JBoss transaction manager.
Table of Contents
• Scripting Module
• ° Script Context Bindings
° Transformers
° Component
° - Attributes of <component...>
- Child Elements of <component...>
- Example Configurations
- Example Configurations
° Script
° - Attributes of <script...>
- Child Elements of <script...>
° Groovy Refreshable
° - Attributes of <groovy-refreshable...>
° Lang
° Script Configuration Builder
Scripting Module
The scripting module provides facilities for using scripting languages in Mule. Any scripting languages
that supports JSR-223 can be used inside Mule. Scripts can be used as implementations of service
components or transformers. Also, scripts can be used for expression evaluations, meaning message
routing can be controlled using script evaluations on the current message. You can even configure Mule
instances from scripts.
Name Description
Transformers
These are transformers specific to this transport. Note that these are added automatically to the Mule
registry
at start up. When doing automatic transformations these will be included when searching for the correct
transformers.
Name Description
Component
Defines a script component backed by a JSR-223 compliant script engine such as Groovy, JavaScript, or
Ruby. Scripting allows you to either directly embed your script inside the XML config or reference a script
using Spring's dynamic language support: http://static.springframework.org/spring/docs/2.5.x/reference/
dynamic-language.html.
Attributes of <component...>
Example Configurations
This example demonstrates how to configure a Groovy Script component with an in-line script.
Example Configurations
This example demonstrates how to orchestrate message flows using bindings. The example calls out to
two different services and passes the results on to the outbound router.
Script
Represents a script that can be used as a component for a service or a transformer. The script text can
be pulled in from a script file or be embedded inside this element. A script to be executed by any JSR-223
compliant script engine such as Groovy, JavaScript(Rhino), Python, Ruby or Beanshell (etc).
Attributes of <script...>
Groovy Refreshable
A wrapper for a component object that allows the underlying object to be reloaded at runtime. This
makes it possible to hot-deploy new component logic without restarting.
Attributes of <groovy-refreshable...>
Lang
This element allows the http://www.springframework.org/schema/lang namespace to be embedded.
Within this element developers can include the spring lang namespace.
mule -M-Dorg.mule.script.engine=groovy
-builder org.mule.module.scripting.builders.ScriptConfigurationBuilder
-config ../conf/mule-config.groovy
For more information about configuring a Mule instance from code or script see Configuration Overview.
This module provides extensions for using the Spring framework with Mule, such as using the Spring
container to build components managed by Mule.
Package Description
SXC Module
The SXC module contains an outbound router and a filter which utilize the SXC project for streaming
XPath routing.
SXC allows listening for XPath expressions as the document is being parsed. As soon as an expression
is found, an event is fired, and parsing is stopped. This allows for much more efficient XPath evaluation.
XPath evaluators such as Jaxen work with a DOM model, so even when working with lazy-loading DOMs,
such as AXIOM, there is more overhead than in just reading directly off the XML stream.
SXC does not support all XPath expressions, only a limited subset. For a reference of what it supports,
see the SXC documentation. To request support for a missing XPath feature, please file a SXC JIRA.
<sxc:filtering-router>
<outbound-endpoint address="vm://log"/>
<sxc:filter pattern="//purchaseOrder[@country]"/>
<sxc:namespace prefix="test" uri="http://foo"/>
</sxc:filtering-router>
XML Module
This page is under construction
Name Description
dom-to-xml-transformer
dom-to-output-handler-transformer
jxpath-extractor-transformer
object-to-xml-transformer
xml-to-dom-transformer
xml-to-object-transformer
Filters
Filters can be used on inbound endpoints to control which data is received by a service.
Name Description
is-xml-filter
jxpath-filter
jaxen-filter
Attributes of <message-splitter...>
splitExpression string no
externalSchemaLocation
string no
validateSchema boolean no
namespace 0..*
Attributes of <round-robin-splitter...>
splitExpression string no
externalSchemaLocation
string no
validateSchema boolean no
deterministic boolean no If
endpointFiltering
is false and this
option is true (the
default) then the
first message part
if routed to the
first endpoint, the
second part to the
second endpoint,
etc, with the nth
part going to the
(n modulo number
of endpoints)
endpoint. If
false then the
messages will
• Spring Remoting
An example of accessing Mule from an external application using Spring remoting.
ApplicationListener.java
To publish events to listeners, you call the publishEvent() method on the ApplicationContext. This will
publish the same event to every listener in the context. You can also plug in custom event handlers to the
application context.
xmlns:spring="http://www.springframework.org/schema/beans"
...
<spring:beans>
<spring:bean id="applicationEventMulticaster"
class="org.mule.module.spring.events.MuleEventMulticaster">
<spring:property name="subscriptions">
<spring:list>
<spring:value>jms://my.queue</value>
<spring:value>pop3://ross:[email protected]</value>
</spring:list>
</spring:property>
</spring:bean>
</spring:beans>
With this configuration, any emails received for [email protected] or any JMS messages sent to
my.queue will be received by all Spring event listeners. Note that the MuleEventMulticaster does
not interfere with normal Spring event behavior. If a non-Mule applicationEvent is sent via the
ApplicationContext, all beans registered to receive events will still get the event.
The inbound endpoints can be any valid Mule Endpoint, so you can receive JMS messages, SOAP
requests, files, HTTP and servlet requests, TCP, multicast, and more.
You can have beans subscribe only to relevant events. The MuleSubscriptionEventListener includes two
methods for getting and setting an array of endpoints on which the bean will receive events.
TestSubscriptionBean.java
package org.mule.module.spring.events;
public class TestSubscriptionEventBean extends TestMuleEventBean implements
MuleSubscriptionEventListener
{
private String[] subscriptions;
xmlns:spring="http://www.springframework.org/schema/beans"
...
<spring:beans>
<spring:bean id="subscriptionBean" class="org.mule.module.spring.events.TestSubscriptionEventBean">
<spring:property name="subscriptions">
<spring:list>
<spring:value>vm://event.*</value>
</spring:list>
</spring:property>
</spring:bean>
</spring:beans>
Publishing events is just as easy as receiving them. You use the standard publishEvent() method on
the application context. Your bean can get a reference to the application context by implementing
ApplicationContextAware or by querying MuleApplicationEvent .
//Call publishEvent on the application context, and Mule does the rest
applicationContext.publishEvent(muleEvent);
For more information on publishing events, see the Error Handler Example.
You can construct service components from Spring beans that you define in a separate Spring
context file or right in the Mule configuration file. This pages provides an example using two beans; a
RestaurantWaiter bean that receives and logs orders and then passes them to the KitchenService bean,
which receives the orders.
//notify kitchen
this.kitchen.submitOrder(order);
}
<beans>
<bean id="restaurantWaiter" scope="prototype" class="com.foo.RestaurantWaiter">
<property name="kitchenService">
<ref local="kitchenService"/>
</property>
</bean>
We now have beans called restaurantWaiter and kitchenService that will be created by Spring. Notice
the resturantWaiter bean scope is set to prototype (by default, all beans in Spring are singletons unless
specified otherwise). This is important because Mule will pool your components, and telling Spring not to
create a singleton ensures that each pooled instance will be a unique instance.
If you want to configure the beans right in your Mule configuration file instead of in a separate Spring
context file, you could specify them like this:
xmlns:spring="http://www.springframework.org/schema/beans"
...
xmlns:vm="http://www.mulesource.org/schema/mule/vm/2.0"
xmlns:spring="http://www.springframework.org/schema/beans"
...
<spring:import resource="conf/applicationContext.xml"/>
...
<service name="Restaurant Waiter">
<inbound>
<vm:inbound-endpoint path="order.queue"/>
</inbound>
<pooled-component>
<spring-object bean="restaurantWaiter"/>
</pooled-component>
</service>
When the Mule server starts, each of the <service> elements are loaded, and the bean you specified in
the <spring-object> tag is created. When an event is received on vm://orders.queue, an Order object
is passed to the takeOrder() method on the RestaurantWaiter, which then logs the order and passes it
to the KitchenService.
For more information on component configuration, see Configuring Components. For more information on
the elements you use to configure components, see Component Configuration Reference.
xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="
...
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-
jee-2.5.xsd"
...
<jee:remote-slsb id="creditAgencyEJB" jndi-name="local/CreditAgency"
business-interface="org.mule.example.loanbroker.credit.CreditAgency">
<jee:environment>
java.naming.factory.initial=org.openejb.client.LocalInitialContextFactory
java.naming.provider.url=rmi://localhost:1099 openejb.base=${openejb.base}
openejb.configuration=${openejb.configuration} logging.conf=${logging.conf}
openejb.nobanner=${openejb.nobanner}
</jee:environment>
</jee:remote-slsb>
...
<mule:service name="CreditAgencyService">
<mule:inbound>
<mule:inbound-endpoint ref="CreditAgency" />
For more information, see Enterprise Java Beans (EJB) integration and the jee schema reference on the
Spring site.
In most Mule applications, messages are triggered by an external occurrence such as a message being
received on a queue or a file being copied to a directory. However, if you want to send and receive
messages programmatically, you can create a Mule client.
The Mule client is a simple interface for Java clients to send and receive messages from a Mule server and
other applications. The client serves the following functions:
• Sending and receiving messages to and from a local or remote Mule server
• Communicating with other applications using any Mule transport
• Making requests to a Mule server behind a firewall using the RemoteDispatcher
The Mule client can be used as a web services client to make SOAP requests using popular SOAP
implementations such as Apache CXF. It can also send messages directly to a service component and
bypass the transports layer completely, which is useful for testing your service components or when
triggering an event from a script or JSP page.
The Mule client can be used with any of the Mule transports, making it a universal client for many types
of transports such as JDBC, JMS, FILE, POP3, XMPP, HTTP, etc.
The following sections describe how to use the MuleClient in various scenarios.
To make a regular synchronous call to a service and receive a result, you can use the send() method:
The client send() and dispatch() methods expect the following arguments:
1. The Mule URL endpoint: any valid Mule Endpoint used to determine the transport, endpoint, and
other information about delivery of the message. This can also be an endpoint name stored in
configuration.
2. The message payload: any object carried by the message.
3. Properties: any properties or meta-data to associate with the message being sent
For clarity, the examples on this page use a physical endpoint URI, such as jms://myQueue.
However, it is much better practice to define all your endpoints inside a Mule configuration
file using the <endpoint> tag and then reference those endpoint names in your code.
Essentially, the Mule client will have the same configuration information as the Mule server, since they will
both have access to the same registry.
If you are running the Mule client in stand-alone mode, you can still configure it using its own Mule XML
configuration file(s). You pass in these files when the client is created:
Note that you must start the local Mule context used by the client. You can also create your own Mule
context and pass it into the client:
//Create a MuleContextFactory
MuleContextFactory muleContextFactory = new DefaultMuleContextFactory();
//create the configuration builder and optionally pass in one or more of these
ConfigurationBuilder builder =
new SpringConfigurationBuilder("http-client-config.xml, shared-client-config.xml"));
//The actual context builder to use
MuleContextBuilder contextBuilder = new DefaultMuleContextBuilder();
//A person object is returned, and all type mapping is handled for you
Person person (Person)result.getPayload();
System.out.println(person.toString());
This code will attempt to receive a message from a mailbox called ross on mail.my.org and will return
after five seconds if no message was received. Calling request() works for all Mule supported transports,
but it is more usual to make event request calls where there is a store to be queried such as a queue, file
directory, or some other repository.
//Set the JMSReplyTo property, which is where the response message will be sent
props.put("JMSReplyTo", "replyTo.queue");
//This is the message sent back from the first component to process our message
System.out.println(message.getPayload());
When you need to dispatch or request events in Mule, you should use the current
org.mule.api.MuleEventContext and call the send/dispatch/request methods on the context instead.
To gain access to the MuleEventContext inside your services, you can implement the
org.mule.api.lifecycle.Callable interface.
If you need to make an event request from a transformer, filter, or interceptor, you should reconsider your
design strategy for that event flow.
To handle situations where multiple results occur, Mule has introduced a new message type
org.mule.api.MuleMessageCollection . This type of message contains all message results in the order they
were received. Note that org.mule.api.MuleMessageCollection extends org.mule.api.MuleMessage , so
the interface is similar. If there are multiple results, the MuleMessage.getPayload() method returns a
java.util.List containing the payloads of each of the returned messages.
When using the Mule client, you can cast the message return type to get access to all MuleMessage
objects.
Future Results
The Mule client allows you to make synchronous calls without blocking by using the sendAsync() method,
which returns a FutureMessageResult that can be queried later.
if(result.isready())
{
Object payload = result.getMessage().getPayload();
}
The FutureMessageResult returned is a placeholder for the real result message when the call returns.
By using a future result, you can continue with other tasks while the remote call executes. Calling
getMessage() will block until the call returns. Optionally, you can specify a timeout of how long to wait
(as shown in the example). You can also check if the call has returned using result.isReady().
To use the remote dispatcher, you enable it on the server instance by configuring the remote dispatcher
agent. You can ensure that the server can handle both asynchronous and synchronous calls by setting
the synchronous attribute to true. You can also set the remoteSyncTimeout setting, although often it is
better to control it at the MuleClient call level, as each call might have a different timeout requirement.
<client:remote-dispatcher-agent>
<client:remote-endpoint address="http://localhost:81" synchronous="true" remoteSyncTimeout="10000"/
>
</client:remote-dispatcher-agent>
On the client side, you can now communicate with the remote server via the remote dispatcher agent.
For example:
StockQuote sq = (StockQuote)result.getPayload();
The Mule client executes the StockManager component on a remote Mule server, returning the result to
the client. Mule handles all the call marshalling. The first null argument is an optional string of comma-
separated transformers to use on the result message. The second null argument contains properties
associated with the request.
If you do not want to wait for the result to be returned from the remote server, you can use the
sendAsyncToRemoteComponent() method, which returns a FutureMessageResult:
StockQuote sq = (StockQuote)result.getMessage(1000).getPayload();
You can specify the wire format to use for dispatching messages by configuring one of the following:
If you do not set the wire format, the serialization format is used. For more information on transformers,
see Using Transformers.
For example:
<client:remote-dispatcher-agent>
<client:remote-endpoint address="http://localhost:81" synchronous="true" remoteSyncTimeout="10000"/
>
<client:xml-wire-format/>
</client:remote-dispatcher-agent>
StockQuote sq = (StockQuote)result.getPayload();
Note that the call is sendDirect, which tells the Mule client to go directly to the component and not
through a transport. You can specify a comma-separated list of transformers to use in the second
argument of this call.
The Mule RESTpack is geared toward helping you build RESTful applications with Mule. REST is a very
powerful concept that enables scalable, decentralized growth.
Understanding REST
REST can be confusing. For an introduction to its advantages, disadvantages, and notes on using it, see
Making Sense of REST.
HTTP Connector
The Mule HTTP Transport contains most of the basic HTTP functionality that the connectors in the
RESTpack build on, including:
The Mule Abdera connector makes it possible to integrate easily with Atom feeds and Atom Publishing
Protocol servers via the Apache Abdera project. The connector supports consuming Atom feeds,
publishing of Atom entries and server side AtomPub service.
To download and learn about using the Mule Abdera connector, go to the MuleForge Abdera page.
Jersey is the open source JAX-RS (JSR 311) reference implementation for building RESTful web services
via simple annotations. The Mule Jersey connector enables developers to embed these JAX-RS services
inside of Mule.
To download and learn about using the Mule Jersey connector, go to the MuleForge Jersey page.
Restlet Connector
Restlet is an open source REST framework, providing a powerful abstraction for building and consuming
RESTful services. The Mule Restlet connector facilitates the deployment and consumption of RESTful
To download and learn about using the Restlet connector, go to the MuleForge Restlet page.
Imagine that each resource is an object. You can then perform the following operations on this object:
Operation Description
Modeling your application can be broken down into roughly four steps:
1. Decompose your application into resources whose state you wish to access and modify.
2. Define the applicable operations of each resource
3. Give each resource a URI
4. Decide how to represent each resource
Anything inside your application can be a resource. So how do you decide what resources to create?
Typically you'll want to make a piece of your application a resource if:
1. You wish to link to that specific piece of data
2. You wish to modify or delete the data the resource represents
The prototypical example is often a CRUD based application. For instance, you may have a database of
orders which need to be fulfilled. If this was to be broken down into resources, you may have a "/orders"
URI for listing the contents of the orders database. You would also have an individual resource for each
order (i.e. "/order/1") which could be accessed, modified or deleted.
After (or while) breaking down your application into resources, you must determine which HTTP methods
you wish to support. It is very important that you respect the semantics of each HTTP method. GET,
HEAD, and OPTIONS are safe. PUT and DELETE are idempotent. POST is unsafe and may have side-
effects.
See the section on reliability for an explanation of how to apply these methods to build a robust service.
There are many different data types you can choose to represent your resource. Many times you will not
have to think about what data type to use as it will be obvious. For instance, if you store an image of a
product in the database - the typical way to serve that would be return an image type, i.e. "image/jpeg".
A structured data type such as XML would make no sense.
For structured data, the choices are more complex. There is XML, specific formats of XML such as Atom,
JSON, XHTML, CSV, etc. On top of this, you may wish to multiple different representations of the resource
as well.
The most common formats for structured data are XML, Atom, JSON and XHTML. The table below gives a
quick summary of these formats and when you may wish to consider applying them.
XML
XML is the universal data format. Every system can understand it. It also has advanced tools for
modeling, parsing and querying such as XML schema, XPath, and XQuery. It is typically slower than other
formats as it is verbose, but can perform well for most applications.
Atom
Atom is a standard XML format for syndication. An Atom feed contains a series of entries. Each entry has
a place for a title, last update time, summary, content, authors, and more. It also allows extensions for
proprietary fields. Atom inherits all the benefits of XML, but introduces another very important property
- it is universally understood. If a user or machine understands Atom, it automatically understands your
application to some degree.
JSON
JSON stands for JavaScript Object Notation. One of its great advantages is that it is itself JavaScript. This
means that it becomes trivial to parse and use JSON inside a JavaScript application - especially when
compared to navigating XML. It is also extremely simple. It does not have the concept of namespaces nor
does it have modeling tools XML schema.
XHTML
Over the recent years Microformats have arise as a very powerful alternative to XML based data.
Microformats create a standard XHTML representation for data which allows it to both be parsed reliably
by machines and be used inside a web browser. Consider using a data format whenever possible as it
often allows you to tackle two birds with one stone.
Reliability
An important part of distributed system design is dealing with problems that occur in between the client
and the server it is talking to. Some examples of this include proxies going down or connections being
dropped.
HTTP does not have an inbuilt mechanism for achieving reliable deliveries of messages. Instead, reliability
is typically achieved through idempotent operations. An idempotent operation is one that can be repeated
over and over and still yield the same result. In the case of HTTP, this means that a message can be sent
again and again until confirmation is received. Even if the message is received twice, the ultimate result,
changing the resource state, will be the same.
Let us say that you want to update a resource which represents a customer - maybe they've changed
their address. In this case you would want to PUT the new representation to this resource which contains
The same concept can be applied to the DELETE operation. The DELETE request can simply be repeated it
succeeds.
Creating new resources is trickier to do reliably in a RESTful manner. Typically resources are created
with a POST message. A simple example might go like this: you create a new order by POSTing the
representation to the "/orders" resource. You would then be redirected to the new resource. What
happens if the connection drops here though? You are not sure if the new order resource has been
created. If you simply retry the POST you could end up with two orders, which would be less than idea.
The trick is to use a two step process. First, the client must do a POST to the "/orders" resource with no
data. The server will then respond with a Location header which contains a new URL that the order can be
PUT to.
Now reliability can be achieved by simply repeating each step until it succeeds. If the POST fails and the
client submits the POST again, the worst that can happen is the creation of a URL that is not used. These
URLs can either be ignored or they can be expired. If the PUT fails, it can simply be retried.
There is a limitation of the above approach for reliability though - message ordering is not preserved.
To preserve message ordering, you will have to develop application specific extensions or move to a
technology like HTTPR or WS-ReliableMessaging.
Security
There are many options to provide security to your application depending on your requirements.
Authentication
HTTP has built in support for authentication. The "basic" and "digest" mechanisms are the most
commonly used authentication mechanisms. Basic authentication passes a username and password
in plain text to the server. Because of this, it should only be used over an SSL connection. Digest
authentication sends the username as plain text and an MD5 checksum of the password.
Another option for authentication is to use client side certificates with SSL. If the server has a copy of the
client's public key, it can verify that the messages were in encrypted with that key, and hence from the
client.
Privacy
The most often used mechanism for message privacy is SSL. It is efficient and widely supported. Other
alternatives include the message level security mechanisms mentioned below.
Limitations of SSL
There are two primary limitations of using SSL. First, it does not work well with intermediaries. Imagine
a situation where a gateway handles the SSL processing. In this case, your application will receive none
of the SSL information. This means you cannot use SSL certificates to verify who the client/server is
and that there may be unsecured routes along the network. Second, there is limited ability for other
authentication tokens, such as SAML.
If you need message level security XML Signature/Encryption is one of your few options. This does
constrain you to use an XML data format though.
Another option that has been discussed is S/MIME. This has many disadvantages to it though which are
discussed here.
REST is the formalized architecture of HTTP based on the concepts of resources, links, and a uniform
interface. REST can be a somewhat confusing subject. Even the very acronym itself, which stands for
"Representation State Transfer", is a little obtuse. Luckily, there are some great resources out there.
One of the best resources out there is RESTful Web Services by Leonard Richardson and Sam Ruby.
It explains REST as well as many of the practical issues surrounding the issue of building RESTful web
services in great detail. You can find it at your local bookstore, Amazon, or online at O'Reilly's Safari
website.
For a good online (and free) introduction, Stefan Tilkov has written two excellent articles: A Brief
Introduction to REST and Addressing Doubts about REST.
And of course, there is the authoritative, but dense, thesis by Roy T. Fielding
You should familiarize yourself with the concepts of REST before continuing to read this page.
RESTful applications can be easily integrated in the web to great benefit. Your resources can be linked to
and from web pages. You can take advantage of Microformats to handle both UI and data related issues.
You can also take advantage of the existing web infrastructure and ecosystem: proxies, caches, browsers/
clients, load balancers, web standards, and more.
Increased Scalability
The web is the largest distributed system in the world. This is enabled by the inherent constraints in
RESTful architectures. For example, RESTful interactions are stateless. The server does not have to worry
about managing state between requests, as all state is kept on the client. Also, caching semantics are
built into the protocol. You can enable caching on any RESTful application without any special knowledge
since all interactions are based on the uniform interface.
Evolvability
All resources are identified by URIs. URIs provide a simple way to deal with the evolution of a system
as they can be used to partition servers and manage versioning. All one needs is a proxy to do
redirects based on the URI. Because there is no need to inspect the actual HTTP message payload, the
performance impact of this is negligible.
RESTful systems are based on hypermedia, so they provide links between different resources. Clients are
responsible for navigating the hypertext links. For instance, they browse to an order resource. They may
then browse to different items in the order via a link. If you need to direct a client to a different server or
move a server, simply change the link. Because the client knows the entry point link, it can still navigate
to the various items as your system evolves.
RESTful systems are fundamentally client-server based and are ill-suited to a number of message-
oriented scenarios. Publish-subscribe scenarios are one example. As there is no mechanism inside HTTP
for asynchronous responses, you often have to set up a second HTTP server if you want to receive
asynchronous replies.
Performance
HTTP is fundamentally a text-based protocol and is not geared toward performance. While it is not slow,
there are other protocols that may be more suitable for situations that are very performance-sensitive.
Transactions
HTTP does not include the concept of transactions. It is possible to model a transaction as an HTTP
resource, but it will not be as efficient as protocols such as JMS. It is also not appropriate to use
transactions with HTTP in many cases, as it can potentially consume many resources across multiple
servers if transactions are long lived.
Go Beyond XML
SOAP/WSDL web services are XML based. To create messages that encapsulate binary data, you must
use standards such as MTOM that wrap the XML in a MIME message, which often ends up being extra
work. With HTTP, resources can be any media.
Transport Neutrality
One of the great benefits of SOAP is that it is transport neutral. If this is a requirement for your
application, RESTful services are probably not the way to go.
Reliability
RESTful systems typically achieve reliability through idempotent operations. See the section on RESTful
reliability for more information.
Security
The RESTful and WS-* approaches to security also differ greatly. WS-* advocates a layered approach. It
creates WS-Security for encryption and authorization, it uses WS-Trust for token exchange, and it uses
WS-SecureConversation to create more efficient security tokens for encrypted communication. These
RESTful systems can achieve security through both the transport layer (SSL) and a variety of message-
level mechanisms. Support for different security scenarios is arguably one of the reasons to choose WS-
* instead of REST for some specific (but rare) scenarios. See the section on RESTful security for more
information on how to build secure RESTful services.
Using Transformers
[ Overview ] [ Configuring Transformers ] [ Types of Transformers ] [ Chaining Transformers ] [ Standard
Transformers Reference ] [ Transformation Best Practices ]
Overview
In Mule 2.0, there are both standard and custom transformers. Standard transformers are configured
with XML that conforms to a Mule configuration schema. Custom transformers are configured using the
fully qualified class name of the transformer.
Standard Transformers
Standard transformers are easier to use than custom transformers. You don't need to know the Java
name of the transformer, and all properties are explicitly declared in a Mule configuration schema.
Here is an example of declaring the standard Append String transformer, which appends string text to the
original message payload:
If the original message payload was the string "foo", the transformer above would convert the string to
"foo ... that's good to know!".
For a list of the standard transformers, see Standard Transformers Reference below.
Transport-specific Transformers
Many transports and modules have their own transformers, such as the ObjectToJMSMessage for the JMS
transport. For information on transport transformers, see Available Transports and click a transport name
to see its transformers.
Custom Transformers
Custom transformers are typically user-defined transformers. Custom transformers are useful when the
transformer has not or will not be added to a Mule configuration schema, as is often the case with user-
defined transformers. They require more knowledge about the transformer, such as the transformer class
name and properties.
For example, if we were to declare the Append String transformer above as a custom transformer, it
would look like this:
<xm:xml-to-object-transformer name="XMLToExceptionBean"
returnClass="org.mule.example.errorhandler.ExceptionBean"/>
<custom-transformer name="ExceptionBeanToErrorMessage"
class="org.mule.example.errorhandler.ExceptionBeanToErrorMessage"
returnClass="org.mule.example.errorhandler.ErrorMessage"/>
...
<model name="errorhandler-test">
<service name="Error Manager">
<inbound>
<inbound-endpoint address="file://./test-data/in" transformer-refs="XMLToExceptionBean
ExceptionBeanToErrorMessage">
<file:filename-wildcard-filter pattern="*.xml" />
</inbound-endpoint>
</inbound>
...
</service>
...
<service name="Business Error Manager">
<inbound>
<inbound-endpoint address="jms://exception.queue" transformer-refs="JMSMessageToObject
XMLToExceptionBean ExceptionBeanToErrorMessage" />
</inbound>
...
</service>
</model>
This example uses the transformer-refs attribute on the endpoint to specify the transformers to use.
This is a fast way of specifying global transformers, but if you want to enter a local transformer or a mix
of local and global transformers, you must use the <transformer> element instead. For example, if only
one of the transformers were defined globally, you would refer to the global transformer and configure
the local transformer as follows:
Types of Transformers
The above examples illustrate configuring inbound transformers, which are applied to the message after
it is received on the inbound endpoint and before it is passed to the service's component. You specify
inbound transformers under the <inbound-endpoint> element.
You can also specify an outbound transformer in exactly the same way except on the routers in the
<outbound> element, in which case the message is transformed after it has been processed by the
service's component but before it has been sent to the outbound endpoint specified by that router. For
example:
Lastly, you can specify a response transformer, which converts message payloads on their way from the
service to the caller. To configure a response transformer, you use the responseTransformers-refs
attribute on the router, or you can use the <response-transformer> element. For example:
<inbound>
<vm:inbound-endpoint path="my.inbound.endpoint" responseTransformer-refs="myAppender"/>
</inbound>
<some-component/>
In this example, the response message from "some-component" is transformed using the "myAppender"
transformer before being returned to the caller.
Chaining Transformers
You can chain transformers together so that the output from one transformer becomes the input for the
next. To chain transformers, you create a space-separated list of transformers in the transformer-refs
or responseTransformer-refs attributes or by creating multiple <transformer> elements as shown
above.
<transformer ref="ByteArrayToString"/>
<transformer ref="StringToObject"/>
<transformer ref="ObjectToInputStream"/>
XML
Transformer Description
XmlToObject <-> ObjectToXml Converts XML to a Java object and back again
using XStream.
DomToXml <-> XmlToDom Converts DOM objects to XML and back again.
Scripting
The Scripting transformer transforms objects using scripting, such as JavaScript or Groovy scripts. This
transformer is in the org.mule.module.scripting.transformer package.
Encryption
Transformer Description
Compression
The compression transformers are in the org.mule.transformer.compression package. They do not require
any special configuration.
Transformer Description
Encoding
The encoding transformers are in the org.mule.transformer.codec package. They do not require any
special configuration.
Transformer Description
Basic
The basic transformers are in the org.mule.transformer.simple package. They do not require any special
configuration. For details on these transformers, see Transformers Configuration Reference.
Transformer Description
There is no one standard approach for how and where transformations should occur. Some maintain that
because transformation should always be applied on inbound/outbound data, transformations should be
available as part of the enterprise service bus instead of inside the service components. This approach
matches the concepts of Aspect Oriented Programming (AOP). Others conclude that it is far more efficient
to encode the transformation logic into the service components themselves. In the second case, however,
there is no distinction between code that is related to a business process and code that is generic enough
to be reused, which contradicts the philosophy of an ESB.
While there is no industry best practice, MuleSource recommends that developers examine their
transformation logic to see if it will always be used (AOP) or if it is specific to a business process. In
general, if it will always be used, you should use a transformer, and if it is specific to a single business
process, it should be part of the service component.
References:
http://msdn2.microsoft.com/en-us/library/aa480061.aspx
http://blogs.ittoolbox.com/eai/applications/archives/transformation-in-a-soa-12186
DOM/XML Transformers
This page is ready for review
The DomToXml transformer converts DOM objects to XML, and the XmlToDom transformer converts
XML strings to DOM objects. These transformers support the standard transformer attributes plus the
following:
Attributes of <dom-to-xml-transformer...>
Attributes of <xml-to-dom-transformer...>
Example
To use the DOM/XML transformers, you add them to your Mule XML configuration as follows:
<xm:dom-to-xml-transformer name="DomToXml"/>
<xm:xml-to-dom-transformer name="xmlToDom" returnClass="org.w3c.dom.Document" />
JXPath Transformer
The JXPath transformer evaluates an XPath expression against the current message and returns the
result. By default, a single result will be returned. If multiple values are expected, set the singleResult
property to false, which will return a list of values. This property is available for strings only (not XML).
<transformers>
<transformer name="invoice" className="org.mule.transformers.xml.JXPathExtractor">
<properties>
<property name="expression" value="/book/title"/>
<property name="singleResult" value="false"/>
</properties>
</transformer>
Transformer
A reference to a transformer defined elsewhere.
Attributes of <transformer...>
Auto Transformer
A transformer that uses the transform discovery mechanism to convert the message payload. This
transformer works much better when transforming custom object types rather than Java types, because
there is less chance for ambiguity.
Attributes of <auto-transformer...>
Custom Transformer
A user-implemented transformer.
Attributes of <custom-transformer...>
spring:property 0..*
Attributes of <message-properties-transformer...>
No Action Transformer
A transformer that has no effect.
Attributes of <no-action-transformer...>
Attributes of <base64-encoder-transformer...>
Attributes of <base64-decoder-transformer...>
Attributes of <xml-entity-encoder-transformer...>
Attributes of <xml-entity-decoder-transformer...>
Attributes of <gzip-compress-transformer...>
Attributes of <gzip-uncompress-transformer...>
Attributes of <byte-array-to-hex-string-transformer...>
Attributes of <hex-string-to-byte-array-transformer...>
Attributes of <byte-array-to-object-transformer...>
Attributes of <object-to-byte-array-transformer...>
Attributes of <object-to-string-transformer...>
Attributes of <byte-array-to-serializable-transformer...>
Attributes of <serializable-to-byte-array-transformer...>
Attributes of <byte-array-to-string-transformer...>
Encrypt Transformer
A transformer that encrypts a message.
Decrypt Transformer
A transformer that decrypts a message.
Attributes of <decrypt-transformer...>
Expression Transformer
A transformer that evaluates one or more expressions on the current event. Each expression equates to a
parameter in the return message. The return message for two or more expressions will be an Object[].
Attributes of <expression-transformer...>
return-argument 0..1
XML-Object Transformers
This page is ready for review
This pair of transformers converts XML code to objects and back again.
Object to XML
The Object to XML transformer converts any object to XML using XStream. You configure this transformer
using the <object-to-xml-transformer> element. It takes the standard transformer attributes plus
one additional attribute, acceptUMOMessage, which specifies whether to serialize the whole message to
XML and not just its payload. This is useful with transports such as TCP where message headers are not
supported and would otherwise be lost.
For example:
XML to Object
The XML to Object transformer converts XML created by the Object to XML transformer in to a Java object
graph using XStream. You configure this transformer using the <xml-to-object-transformer> element.
It takes the standard transformer attributes.
For example:
...
public void testComponent4Endpoints() throws Exception
{
// test inbound
Service service = muleContext.getRegistry().lookupService("TestComponent4");
assertNotNull(service);
assertNotNull(service.getInboundRouter().getEndpoints());
assertEquals(1, service.getInboundRouter().getEndpoints().size());
ImmutableEndpoint endpoint = (ImmutableEndpoint)service.getInboundRouter().getEndpoints().get(0);
assertNotNull(endpoint);
Attributes of <xml-prettyprinter-transformer...>
expandEmptyElements
boolean no Whether to
expand empty
elements from
<tagName> to
<tagName></
tagName>.
Xslt Transformer
A transformer used to perform XSLT transforms on the current message payload. Transform objects are
pooled for better performance. You can set context properties on the transformer by pulling them from
the current message using Expression Evaluators.
Attributes of <xslt-transformer...>
maxActiveTransformers
integer no The total number
of xslt transforms
that will get
pooled at any
given time.
transformerFactoryClass
name (no spaces) no he fully qualified
class name of the
javax.xml.TransformerFactory
instance to use.
If not specified
the default
JDK factory
TransformerFactory.newInstance
will be used.
Example
The following example demonstrates how to configure an inline XSLT transformer pulling parameters from
the current message.
To use the XSLT transformer, you add it to your Mule XML configuration as follows:
This example configures a transformer using inline XSLT expressions. It also defines two context
parameters:
These parameters are pulled from the current message and made available in the XSLT context so that
they can be referenced in your XSLT statements. You can use any valid expression. In this example, the
header evaluator is used to pull a header from the current message.
Your configured XSLT transformer can be referenced by an endpoint. In the following example, the result
is written to System.out. The test data looks like this:
Using Axis with Mule - Links to several topics describing Axis support in Mule.
Building a CXF Web Service - Describes how to build a CXF web service and use it in Mule.
Using the Mule Client - Describes the Mule Client, which can be used as a SOAP client.
Web Service Wrapper - Describes how to use the WebServiceWrapperComponent class to send the result
of a web service call to another endpoint.
REST Service Wrapper Component - see HTTP Transport - Proxies REST-style services as local Mule
components. For more information on REST, see Using the Mule RESTpack.
Echo Example - A simple example of exposing a Mule service as a web service using Axis.
Using .NET Web Services with Mule - Tips for using .NET web services with Mule.
• Axis Web Services and Mule - Introduction to exposing Mule services over Axis and invoking SOAP
services.
• Configuring Axis - Controlling WSDL generation, named parameters, Advanced Service
configuration, and more.
• Axis Transport - Basic configuration of the Axis transport.
• Axis SOAP Transports - Using Axis over JMS, VM, SMTP, and other Mule transports.
• Axis SOAP Styles - Configuring services for Doc/Lit, Message or RPC style invocations.
The client examples below show how to invoke an Axis web service hosted in Tomcat using the Mule
client. The example behaves exactly the same way if the service is hosted in Mule unless explicitly noted
otherwise. These tests were run against Tomcat 5.5.12 and Axis 1.3.1. Each test uses the Calculator
service as used in the Axis User Guide.
Client Example
This example is very similar to the Doc/Lit example, except that we set the message style to 'wrapped/
literal', and there is no need to add any server configuration, as the method name is stored in the
message.
In the next example, we can see how to change the namespace of the method as well as naming the
parameters. This is very useful when calling services from other platforms.
Client Example
Note that we do not pass the method name in the query string of the URL. Instead, we create a
SoapMethod object and add it to the parameters passed to the client call.
Instead of hard-coding the namespaces and parameter names, you can specify them in an endpoint
configuration in the Mule configuration file and reference the endpoint from your Mule client. The
configuration file will look like this:
<axis:endpoint name="calculatorAddEndpoint"
address="http://localhost:62088/axis/Calculator?method=add"
style="WRAPPED" use="LITERAL">
<axis:soap-method method="add">
<axis:soap-parameter parameter="Number1" type="int" mode="IN"/>
<axis:soap-parameter parameter="Number2" type="int" mode="IN"/>
<axis:soap-return type="int"/>
</axis:soap-method>
</axis:endpoint>
This endpoint configuration can be used by the Mule client or on a component outbound router. The client
code is now much simpler:
Notice the URL for the MuleClient call contains the name of the service endpoint, not the physical location
of the resource.
Mule hosted Web services using Axis cannot be invoked using Doc/Lit. Use Doc/Lit/Wrapped
instead. Users can still invoke remote web services using Doc/Lit as shown in the example
below.
Client Example
For this example, we must tell the Mule client to use 'document/literal' for the message style, and we
pass this information into the call on the Mule client. This requires some configuration on the Axis server.
The biggest limitation of Doc/Lit is that operation/method name is not passed with the message.
Using Doc/Lit with Axis might appear to work even when you don't add operation info to
the Axis server configuration. This happens when there is a single parameter for the service
and the parameter name is the same as the operation/method name you want to invoke.
For more information, see Axis Operations.
RPC Encoded
Because Axis uses RPC/Encoded by default, there is no need to pass any additional configuration
information. The client call looks like this:
Mule transports can deliver SOAP requests between Axis clients and Axis services hosted by Mule. This
means you can easily use JMS, VM, SMTP, or even XMPP (Jabber) to send SOAP requests. This page
describes how to configure these transports.
<jms:activemq-connector name="jmsConnector"/>
Next, create the service. In this example, we will create a service that listens to a queue called
echoComponent. The method parameter specifies the operation to invoke. The SOAPAction property
specifies the name of the queue again, which is required if your service name and queue name are not
identical.
<model name="echoSample">
<service name="echoService">
<inbound>
<inbound-endpoint address="axis:jms://echoComponent?method=echo¶m=hello" SOAPAction="jms://
echoComponent"/>
</inbound>
<echo-component/>
</service>
</model>
You can also add any other JMS endpoint options, such as transactions. See the JMS Transport
documentation for a full description.
SOAP Over VM
The VM transport also supports SOAP, which can be useful for testing or prototyping. You configure the
endpoints the same as JMS SOAP endpoints. For example:
<model name="test">
<service name="mycomponent">
<inbound>
<inbound-endpoint address="axis:vm://mycomponent"/>
</inbound>
<component>
<singleton-object class="org.mule.tck.testmodels.services.TestServiceComponent"/>
</component>
</service>
<service name="mycomponent2">
<inbound>
<axis:inbound-endpoint address="vm://mycomponent2">
<axis:soap-service interface="org.mule.api.component.simple.EchoService"/>
<axis:soap-service interface="org.mule.tck.testmodels.services.DateService"/>
</axis:inbound-endpoint>
</inbound>
<component>
<singleton-object class="org.mule.tck.testmodels.services.TestServiceComponent"/>
<servlet>
<servlet-name>muleServlet</servlet-name>
<servlet-class>org.mule.transport.servlet.MuleReceiverServlet</servlet-class>
<load-on-startup/>
</servlet>
<servlet-mapping>
<servlet-name>muleServlet</servlet-name>
<url-pattern>/mule/services/*</url-pattern>
</servlet-mapping>
Note that you set the host, port, and path on the connector, not the endpoint, using the servletUrl
property.
//Client
axis:xmpp://mule1:[email protected]/axis?method=echo¶m=hello
//Server
axis:xmpp://mule1:[email protected]/axis
Axis Transport
The Axis transport allows Mule-managed components to be published as Axis services and allows
components to invoke web services using Axis client calls.
Programmatic Configuration
If you want to programmatically configure your Axis service you can implement the
org.mule.transport.soap.axis.AxisInitialisable interface. This will pass the SOAPService object to your
component where it can be manipulated.
Connector
The Axis connector consumes and provides web services via Axis. It supports all the common connector
attributes and properties as well as the following additional attributes:
Attributes of <connector...>
treatMapAsNamedParams
boolean no The Axis
connector
treats a Map
as a container
for named
parameters and
unpacks them
from the map.
If your exposed
service needs to
take a Map as a
parameter, set this
property to false
to prevent the
connector from
unpacking the
Map.
bean-type 0..*
supported-scheme 0..*
Inbound Endpoint
Attributes of <inbound-endpoint...>
clientConfig string no
soapAction string no
SOAPAction string no
serviceNamespace string no
For example:
<service name="Calculator">
<inbound>
<axis:inbound-endpoint address="http://localhost:62088/axis" style="WRAPPED" use="LITERAL">
<axis:soap-method method="qname{add:http://muleumo.org/Calc}">
<axis:soap-parameter parameter="Number1" type="any" mode="IN" />
<axis:soap-parameter parameter="Number2" type="any" mode="IN" />
<axis:soap-return type="any" />
</axis:soap-method>
</axis:inbound-endpoint>
</inbound>
<component class="org.mule.transport.soap.axis.Calculator" />
</service>
When including the user name and password in the endpoint, escape any characters
that are illegal for URIs, such as the @ character. For example, if the user name is
[email protected], you should enter it as user%40myco.com.
Outbound Endpoint
Attributes of <outbound-endpoint...>
clientConfig string no
soapAction string no
SOAPAction string no
serviceNamespace string no
<axis:wrapper-component address="http://localhost:65081/services/TestUMO?method=receive"
style="WRAPPED" use="LITERAL" />
Attributes of <wrapper-component...>
<service name="echoService">
<inbound>
<axis:inbound-endpoint address="http://localhost:81/services"/>
</inbound>
<echo-component/>
</service>
When Mule starts, the service will be available on http://localhost:81/services/echoService. The Echo
component class (org.mule.components.simple.EchoComponent) implements the EchoService interface,
which has a single method called echo that accepts a single parameter string.
To invoke the Echo service using the Mule Client, use the following code:
TestEchoService.java
To invoke the Echo service from a service, you add an outbound endpoint to your service configuration.
The following example shows a service that receives an event on vm://test.component, does some work
on the event, and then invokes the Echo service.
<service name="test">
<inbound>
<vm:inbound-endpoint path="test.component" synchronous="true"/>
</inbound>
org.foo.TestComponent
//Do some work on the payload and return a string that will be
//used by the outbound endpoint to invoke the echo service
//...
return payload.toString();
}
}
If the Web service you are invoking takes more than one parameter, you can return an array of
parameters in your component.
When an event is published to vm://test.component, the onCall method is called with the current event.
After the onCall method executes, Mule invokes the outbound endpoint for TestComponent with what is
returned from onCall.
Note that the vm://test.component endpoint has a parameter synchronous=true. This tells Mule to
invoke requests from that endpoint in a single thread, making it a request/response style request. Thus
the result of invoking the Echo service (by invoking TestComponent) will be returned to the callee who
dispatched the event on vm://test.component.
When the TestEchoService is run, you will see the following output:
• There is no need for a servlet container, because Mule is the container (see below).
• You don't need to specify a deployment WSDD for your service. You simply specify an endpoint for
the service, and the rest is done for you.
• The MuleClient call will work just as well if the service you are invoking is hosted by an Axis instance
running on Tomcat or any other servlet engine.
• The Axis JAR and associated JARs that ship with the Mule distribution must be on your classpath.
Exposing Services
All service operations are exposed through interfaces implemented by your component.
Therefore, your component must implement at least one service interface, which is
generally good practice anyway.
• Creates an Axis component in Mule, which is analogous to the AxisServlet. There is only one Axis
component per Mule instance.
• Creates an HTTP connector for the endpoint address and registers it as a receiver for the Axis
component.
Most web services are a lot more complex than the first example, so the following sections will tell you
how to configure the Axis instance and your services in more detail.
If you use a custom server configuration, you must add the following handlers in the global configuration:
<requestFlow>
<handler
type="java:org.mule.transport.soap.axis.extensions.MuleSoapHeadersHandler"/>
</requestFlow>
<responseFlow>
<handler
type="java:org.mule.transport.soap.axis.extensions.MuleSoapHeadersHandler"/>
</responseFlow>
If you are configuring Mule from a container such as Spring, you can set the Axis server as a bean
property (axisServer) on the connector and the serverConfig property is ignored.
You can list the Axis services in the same way you list services when Axis is hosted in a servlet container.
To list services, simply point your browser at the host and port of the axis endpoint:
http://localhost:81/
http://localhost:81/Version?method=getVersion
http://localhost:81/Version?wsdl
For more information about customizing Axis behavior, naming parameters, message style options, and
more, see Configuring Axis.
Configuring Axis
Table of Contents
• Configuring Axis
• ° Controlling Exposed Methods
° Map as Parameter
° Setting SOAP Document Style
° Customizing the SOAP Action Format
° Setting Named Parameters
° Controlling Namespaces
° Controlling WSDL Generation
° Type Mappings
° Service Initialization Callback
<axis:inbound-endpoint address="http://localhost:38009/mule/services">
<axis:soap-service interface="org.mule.api.component.simple.EchoService"/>
<axis:soap-service interface="org.mule.tck.testmodels.services.DateService"/>
</axis:inbound-endpoint>
You can also specify one or more methods to expose in a comma-separated list, using the
allowedMethods attribute.
<service name="myService">
<inbound>
<axis:inbound-endpoint address="http://localhost:38009/mule/services"
allowedMethods="echo,getDate" />
</inbound>
<component class="com.foo.TestComponent" />
</service>
Map as Parameter
The AxisConnector treats a Map as container for named parameters, which eventually will be unpacked.
This becomes a problem if your exposed service needs to take a Map as a parameter, because the actual
Map will never reach the service intact.
To configure the connector not to unpack Maps so that they can be passed as parameters, use the
treatMapAsNamedParams attribute:
<axis:inbound-endpoint address="http://localhost:38009/mule/services"
The style attribute can be 'RPC' (default), 'DOCUMENT', 'MESSAGE', or 'WRAPPED'. The use attribute can
be either 'ENCODED' (default) or 'LITERAL'.
For more information about service styles and Mule, see Axis SOAP Styles. Also see the Axis web site for
further reference.
<axis:outbound-endpoint
address="http://localhost:38011/mule/echoService?method=echo"
soapAction="http://localhost:38011/${method}"
synchronous="true" />
The above example sets the SOAP Action on the request to http://localhost:38011/echo. If you are
using the Mule client, you can set the SOAP Action as a property when making the call.
The SOAP Action can be a static value, or you can use template variables such as the method variable
used above. The set of variables that can be used are listed below.
Any other properties on the event or the endpoint can be referenced by name in the soapAction
expression.
In the Mule XML configuration, you can set the SOAP method parameters for a service on the endpoint
using the soap-method element.
<axis:outbound-endpoint address="http://localhost:38011/mule/echoService?method=echo"
synchronous="true">
<axis:soap-method method="echo">
<axis:soap-parameter parameter="string1" type="string" mode="IN"/>
<axis:soap-parameter parameter="string2" type="string" mode="IN"/>
<axis:soap-return type="java"/>
</axis:soap-method>
</axis:endpoint>
Within the soap-method element, you can define soap-parameter elements, which control that
parameter's mode, name, and type. The parameter attribute is the name of the parameter. The type
attribute is an XSD string such as int, long, map, etc. The attribute mode can be in, out, or inout. The
return type is also an XSD type string. The soap-return element controls the type of the parameter the
method returns.
Controlling Namespaces
Namespaces for elements can be controlled at the method and parameter level. To declare a namespace
on the method with a prefix of 'foo' and a URI of 'http://mycompany.com/foo', you would use the
following code:
<axis:outbound-endpoint address="http://localhost:38011/mule/echoService?method=echo"
synchronous="true">
<axis:soap-method method="qname{foo:http://mycompany.com/foo}">
<axis:soap-parameter parameter="in0" type="string" mode="IN"/>
<axis:soap-parameter parameter="out" type="ns1:Test" mode="OUT"/>
<axis:soap-return type="org.mule.tck.external.applications.Test"/>
</axis:soap-method>
</axis:endpoint>
qname{[MULE:prefix]:[MULE:localname]:[MULE:namespace]}
You can supply just a localname, a localname and namespace, or a prefix, localname, and namespace.
The qname syntax can be used with <soap-parameter> elements as well. For example:
To set the method parameter name using the Mule client, you create a SoapMethod object and set it on
the properties when making the call. The example below shows how to do this.
You can also set the wsdlFile property to the location of a WSDL document to use for this service if you
do not want an auto-generated WSDL document.
Optionally, you can control the values used in Axis WSDL generation by setting WSDL-specific Axis
options. The options you can set are:
wsdlInputSchema
wsdlSoapActionMode
extraClasses
To change the wsdlServiceElement name attribute to MyService in the generated WSDL for a service,
use the following:
<axis:inbound-endpoint address="http://localhost:38009/mule/services">
<properties>
<spring:entry key="axisOptions">
<spring:map>
<spring:entry key="wsdlServiceElement" value="MyService"/>
</spring:map>
</spring:entry>
</properties>
</axis:inbound-endpoint>
Type Mappings
Note that as of Axis 1.2-RC3, it is no longer necessary to configure type mappings, as bean serialization
is handled automatically by Axis. If you are using an older version of Axis, you might need to configure
type mappings.
Mule handles this by allowing you to specify a list of beanTypes that Axis needs to understand to manage
your service. For example, assume you have a PersonService service that will get a Person object when
passed the person's name. The Person object contains an Address object. The configuration will look like
this:
<axis:inbound-endpoint address="http://localhost:38009/mule/services">
<property key="beanTypes">
<spring:list>
<spring:value>org.foo.Address</spring:value>
</spring:list>
</property>
</axis:inbound-endpoint>
It is important to note that only custom types should be listed. If any standard types are
present, like java.util.ArrayList, Axis may produce serialization errors.
For convenience, the beanTypes property can be set on an Axis connector configuration so that all
services that use the connector will have the types registered in the TypeRegistry for the service.
<axis:connector name="axisConnector">
<spring:property name="beanTypes">
<spring:list>
<spring:value>org.foo.Address</spring:value>
</spring:list>
</spring:property>
</axis:connector>
By default, an Axis connector is created if one doesn't exist already when the Axis endpoint is processed.
For more information about configuring Connectors and Providers, see Configuring Endpoints.
AxisInitialisable.java
This gets called when the service is initialized and allows you to customize the service configuration from
your Mule component.
Following are tips for using Mule to communicate with .NET web services.
If you are running Mule on a Web App, you can configure the web server to use security by setting
security configuration in web.xml and in the server's configuration file.
Alternatively, to secure a web service running on Mule (where Mule is the server), you can set the
HttpBasicAuthenticationFilter on the web service component. Any call made to the web service would
have to pass through the filter that delegates the authentication to Acegi.
Another alternative would be to use HTTPS where certificates are used for authentication.
You can send authentication tokens through SOAP headers as long as there is an authentication provider
established that is able to understand the headers and perform the authentication.
Using WS-Security
If you are using CXF, you can configure a client and service to use WS-SecurityFor details, see Enabling
WS-Security.
There are three methods for passing authentication information to a web service configured on Mule:
addressFromMessage (default is Specifies that the URL of the Not required if address is set
false) web service will be obtained
from the message itself
The web service wrapper is generic and can be used with any type of web service stack supported by
Mule, including Axis and CXF. The examples below show synchronous use cases, but the web service
wrapper can also support an asynchronous use case like the loan broker example.
Consider the following example. The web service wrapper is configured as a Mule component, accepting
messages from a VM endpoint. A call must be made to a web service on the URL cxf:http://
localhost:65081/services/TestUMO?method=onReceive and the result must be sent to the outbound
endpoint vm://testout.
The inbound and outbound endpoints are configured in the usual way. The address is set as an attribute
on the component, specifying the web service URL that you want to call.
The "address" property is ideal to use when the web service URL for the web service is known at
configuration time. However, if this URL is either not known or else needs to be changed at run-time,
the "address" property can be omitted and the "adddressFromMessage" property can be set to true. The
following example shows this configuration:
The URL must be set on the message with the property name "ws.service.url".
CXF endpoints are fairly easy to configure, whereas Axis needs some further configuration to set SOAP
methods. You can set a SOAP method using the <soap-method> element as shown below:
Your service component does not need to contain any Mule-specific code. Instead, you configure
a service, which wraps the service component with the Mule-specific configuration. The service
configuration points to the service component, as well as routers, filters, and transformers to use when
carrying messages to and from the service component. It also specifies the endpoint on which this service
will receive messages and the outbound endpoint where messages will go next. Services are the primary
Mule artifact used to implement integration solutions.
Service Components
A service component can be a POJO, servlet, web service, and much more. Typically, you create a custom
service component, but you can also use one of the several standard components included with Mule. For
more information, see Configuring Components.
Service Configuration
Most configuration happens at the service level. Services can be configured using globally defined
endpoints, transformers, and filters, or these can be defined inline. For more information, see Configuring
the Service.
Service Behavior
When a service receives a message on an inbound endpoint, the service model (default is SEDA)
determines the service's threading and queuing behavior, while the messaging pattern defines the
inbound and outbound message exchange patterns that will be used.
Advanced Configuration
You can further configure the service with security (configured on endpoints), transactions, and error
handling.
Configuring Components
[ Simple Components ] [ Java Components ] [ Other Components ] [ Interceptors ]
Service components contain the business logic for working with the messages passed through Mule. A
service component can be any type of object, including a Spring bean, POJO, script, web service, or REST
call.
Because they are highly specific to your implementation, you will typically create your own custom
components, or simply use an existing POJO. Mule also ships with some standard components you can
use or extend as needed. This page describes how to configure the different types of components.
For detailed information on the elements you configure for components, see Component Configuration
Reference.
Simple Components
There are several simple components included with Mule that are useful for testing or bypassing
component execution.
Java components can be configured quickly and easily by simply specifying the service component
implementation class name on the <component> or <pooled-component> element. The <pooled-
component> element allows you to establish a pooling profile for the service (see Tuning Performance). In
both cases, the PrototypeObjectFactory will be used by default and a new object instance will be created
for each request or (for pooled components) for each new object in the pool.
<component class="org.my.ServiceComponentImpl"/>
...
<pooled-component class="org.my.ServiceComponentImpl"/>
For further configuration options and information on the default settings that are applied, see Configuring
Java Components.
Other Components
These are several other components available that allow you to use different technologies such as web
services for your service components. These components are often included as part of transports or
modules.
Configuration Description
Interceptors
Mule interceptors are useful for attaching behaviors to multiple service components. The interceptor
pattern is often referred to as practical AOP (Aspect Oriented Programming), as it allows the developer
to intercept processing on an object and potentially alter the processing and outcome. (See also Spring
AOP). Interceptors are very useful for attaching behavior such as profiling and permission and security
checks to your service components.
Interceptor Types
• EnvelopeInterceptor : Envelope filter that will execute before and after the component is invoked.
Good for logging and profiling.
• Interceptor : Intercepts the message and then forwards it for processing to the next element. An
interceptor can stop further processing by not forwarding control to the next interceptor, as with a
permissions checker interceptor.
The following shows an example interceptor stack and the event flow.
If you want to intercept a message flow to a component on the inbound message flow, you should
implement the Interceptor interface. It has a single method:
The invocation parameter contains the current message and the Service object of the target
component. Developers can extract the current MuleMessage from the message and manipulate it as
needed. The intercept method must return a MuleMessage that will be passed on to the component (or
to the next interceptor in the chain).
The EnvelopeInterceptor works in the same way, except that it exposes two methods that get invoked
before and after the event processing:
Configuring Interceptors
<service name="MyService">
<component class="org.my.ComponentImpl">
<custom-interceptor class="org.my.CustomInterceptor"/>
<logging-interceptor/>
<interceptor-stack ref="testInterceptorStack"/>
<timer-interceptor/>
</component>
</service>
You can also define interceptor stacks, which are one or more interceptors that can be referenced using a
logical name. To use an interceptor stack, you must first configure it in the global section of the Mule XML
configiration file (above the <model> element):
You can configure multiple <interceptor> elements on your components, and you can mix using built-in
interceptors, custom interceptors, and references to interceptor stacks.
Java is the default component type in Mule. Mule provides two JavaComponent implementations:
DefaultJavaComponent , which you configure with the component element, and PooledJavaComponent ,
which adds pooling functionality and which you configure with the pooled-component element. These two
implementations provide the following functionality and configuration options:
When you specify the class directly on the component or pooled-component element, the
PrototypeObjectFactory is used by default, and a new instance is created for each invocation, or a new
pooled component is created in the case of the PooledJavaComponent.
Example:
<component class="org.my.CustomComponent"/>
..
<pooled-component class="org.my.CustomComponent"/>
Example:
<component>
<prototype-object class="org.my.CustomComponent"/>
</component>
..
<pooled-component>
<singleton-object class="org.my.CustomComponent"/>
</pooled-component>
..
<component>
<spring-object bean="myCustomComponentBean"/>
</component>
All other component configuration elements are configured as children of the component or pooled-
component element.
Note: In Mule 2.0, Java component pooling is used only if the <pooled-component> element is used. In
previous versions of Mule, pooling was the default.
Object Factories
Object factories manage both object creation in the case of a Mule instantiated instance or object look-up
from another container such as Spring via a single API.
The following object factories are included with Mule and can be configured using Mule's core schema.
Object factories also allow you to set properties, which are injected when a new object instance is
created.
Example:
<pooled-component>
<singleton-object class="org.my.SingletonObject">
<property key="myKey" value="theValue"/>
<property key="myKey2" value="theValue2"/>
</singleton-object>
</pooled-component>
For a real-world example of using <spring-object/>, see Using Spring Beans as Service Components.
You can easily implement additional object factories to integrate with other containers or simply to create
object instances in a different way. For more information about creating custom object factories, see
Extending Mule.
To configure entry point resolvers, you can either configure an entry point resolver set or configure a
single entry point resolver independently. When using an entry point resolver set, the order in which the
resolvers are configured is the order of of precedence they are given in run-time.
Example:
<component class="org.my.PrototypeObjectWithMyLifecycle">
<entry-point-resolver-set>
<array-entry-point-resolver/>
<callable-entry-point-resolver/>
</entry-point-resolver-set>
</component>
<component class="org.my.PrototypeObjectWithMyLifecycle">
<reflection-entry-point-resolver/>
</component>
You can also configure entry point resolvers (single or sets) on models to apply them to all services
defined in that model. You use the same configuration syntax as above but on the <model> element
instead of <component>.
Example:
<component class="org.my.PrototypeObjectWithMyLifecycle">
<custom-lifecycle-adapter-factory class="org.my.MyLifecycleMuleAdapterFactory"/>
</component>
Binding can be used on Java components and script components. For more information see Component
Bindings.
You configure the pool using the nested pooling-profile element as shown below:
<pooled-component class="org.my.PrototypeObject">
<pooling-profile exhaustedAction="WHEN_EXHAUSTED_FAIL" initialisationPolicy="INITIALISE_ALL"
maxActive="1" maxIdle="2" maxWait="3" />
</pooled-component>
For more information about pooling and reference documentation for pooling configuration options, see
Tuning Performance.
You configure services using a <service> element within a <model> element. Each <service> element
represents and configures a Mule service, providing a unique name that identifies it and optionally
an initial state that determines whether the service and its endpoints are started when Mule starts
(supported values are started, stopped, or paused).
<mule>
<model>
<service name="GreeterUMO">
...
</service>
If you configure more than one of these elements, note that you must configure them in the order shown
above. For detailed information on the <service> elements and attributes, see Service Configuration
Reference.
<service name="GreeterUMO">
<description>Adds some text to the string before passing it on</description>
<inbound>
<stdio:inbound-endpoint system="IN">
<transformer ref="StdinToNameString"/>
</stdio:inbound-endpoint>
</inbound>
<component class="org.mule.example.hello.Greeter" />
<outbound>
<filtering-router>
<vm:outbound-endpoint path="chitchatter" />
<payload-type-filter expectedType="org.mule.example.hello.NameString" />
</filtering-router>
</outbound>
<default-service-exception-strategy>
<vm:outbound-endpoint path="systemErrorHandler" />
</default-service-exception-strategy>
</service>
Inbound Endpoints
Inbound endpoints are used to receive incoming messages. An endpoint is simply a set of instructions
indicating which transport and path/address to receive messages from, as well as any transformers,
filters, or security that should be applied when receiving the messages. You can configure multiple
inbound endpoints, each receiving message from different transports. For more information, see
Configuring Endpoints and Available Transports.
Inbound Routers
Inbound routers control and manipulate messages received by a service before passing them to the
service component. Typically, an inbound router is used to filter incoming messages, aggregate a set of
incoming messages, or re-sequence messages when they are received. Inbound routers are also used to
register multiple inbound endpoints for a service. You can chain inbound routers together, so that each
router must be matched before the message can be passed to the component. You can also configure a
catch-all strategy that is invoked if none of the routers accept the current message.
Inbound routers are different from outbound routers in that the endpoint is already known (as the
message has already been received), so the purpose of the router is to control how messages are given
to the component.
If no inbound routers are configured, by default an InboundPassThroughRouter is used to simply pass the
incoming message to the component.
By default, a message must match and be processed by all inbound routers in a service before it is
passed to the service component. If you want to configure the service so that the message is processed
only by the first router whose conditions it matches, you set the matchAll attribute on the <inbound>
element to false.
This behavior is new in Mule 2.0. Previously, the message was processed only by the first
matching router by default.
For more information about the inbound routers that can be used, see Mule Inbound Routers .
Inbound Example
<inbound>
<stdio:inbound-endpoint system="IN" />
<catch-all-strategy>
<jms:outbound-endpoint queue="failure.queue"/>
</catch-all-strategy>
<selective-consumer-router>
<mulexml:jxpath-filter pattern="(msg/header/resultcode)='success'"/>
</selective-consumer-router>
</inbound>
This example uses a selective consumer router that will accept a message if a 'resultcode' element has a
value of 'success'. If the message matches this filter's criteria, the message is passed to the component.
If the message does not match, the catch-all strategy is invoked, which sends the message via its
configured endpoint, in this case a JMS queue called 'failure.queue'.
The following component implementations are currently available and distributed with Mule:
Further information about these component types and their configuration, see Configuring Components.
You can also implement new component types in your Mule modules and use them within your
configuration. In Mule 2.0, it is now easier to implement and use new non-Java component types and
configure them with their own custom component element.
Outbound
The <outbound> element configures outbound routers and their endpoints. Because outbound routers
are used to determine which endpoints to use for dispatching messages after the component has finished
processing them, outbound endpoints are configured on the outbound routers, not directly on the
<outbound> element. Outbound routers allow the developer to define multiple routing constraints for any
given message. You can specify a catch-all strategy to invoke if none of the routers accept the current
message. For more information, see Configuring Endpoints and Available Transports.
By default, a message is processed only by the first outbound router whose conditions it matches. If
you want the message to be processed by all the outbound routers, you can set the matchAll attribute
to true. For example, assume you always want to send a confirmation of a deposit back to the original
depositor. Also assume that if the deposit was above $100,000, you want to send a notification message
to the 'high net worth client manager' for possible follow-up. In this case, you would set the matchAll
attribute on the <outbound> definition as follows:
<outbound matchAll="true">
<filtering-router>
<endpoint address="jms://deposit.queue"/>
</filtering-router>
<filtering-router>
<jms:outbound-endpoint queue="large.deposit.queue"/>
<mulexml:jxpath-filter expression="deposit/amount >= 100000"/>
</filtering-router>
</outbound>
In this example, the message will always match the first router because there is no filter on it.
Additionally, the message will match the second router if the deposit amount is >= $100000, in which
case both routers will have been invoked.
For more information about the outbound routers you can use, see Mule Outbound Routers .
Outbound Example
<outbound>
<catch-all-strategy>
<jms:outbound-endpoint queue="default.queue"/>
</catch-all-strategy>
<filtering-router>
<smtp:outbound-endpoint to="[email protected]" subject="Exception!"
from="[email protected]!">
<transformer ref="ExceptionToEmail"/>
Async Reply
This element is used to configure the endpoints and routers that will be used to receive the response in
asynchronous request-response scenarios where you must consolidate responses from a remote endpoint
before the current service responds via its inbound endpoint. The classic example of this approach is
where a request is made and then multiple tasks are executed in parallel. Each task must finish executing
and the results processed before a response can be sent back to the requester. For an illustration of
asynchronous request-response, click here. For more information about the available Async Reply routers,
see Asynchronous Reply Routers . For information on configuring endpoints, see Configuring Endpoints.
Async Reply routers can be used to join forked tasks in a request-response call. In fact, you would
only use an async reply router with services that use synchronous calls (as there is no response
when dispatching a message asynchronously). Mule provides aggregator routers that can be used in
conjunction with a message splitter or recipient list router to aggregate messages before returning a
response. For more information on these routers, see Using Message Routers.
<async-reply>
<jms:inbound-endpoint queue="bank.quotes"/>
<custom-async-reply-router
class="org.mule.samples.loanbroker.routers.BankQuotesResponseAggregator"/>
</async-reply>
The endpoint specifies the address where responses should be sent to be processed. The router is
responsible for aggregating bank quotes into a single quote for the customer. Consider the inbound
configuration and the async-reply router in the LoanBroker configuration:
<service name="LoanBroker">
<inbound>
<vm:inbound-endpoint path="Loan.Requests"/>
</inbound>
<component class="org.mule.samples.loanbroker.SyncLoanBroker">
<outbound>
<static-recipient-list-router>
<reply-to address="jms://Loan.Quotes"/>
<message-property-filter expression="recipients!=null"/>
</static-recipient-list-router>
</outbound-router>
<async-reply>
<jms:inbound-endpoint queue="Loan.Quotes"/>
<custom-async-reply-router
class="org.mule.samples.loanbroker.routers.BankQuotesResponseAggregator"/>
</async-reply>
</mule-descriptor>
This configuration specifies that the Loan Broker will receive requests from vm://Loan.Requests and will
dispatch multiple requests to different banks via the outbound router. The bank endpoints are defined
in a List called 'recipients', which is a property on the outbound message. The important setting on
the outbound router is the <reply-to> endpoint, which tells Mule to route all responses to the jms://
Loan.Quotes endpoint, which is the endpoint on which the async-reply router is listening. When all
responses are received, the BankQuotesResponseAggregator selects the cheapest quotes and returns it.
Mule then handles returning this to the requester. The <reply-to> endpoint is applied to the next service
invoked. For example, if service1 dispatches to service2, and service1 has an outbound router with a
reply-to endpoint, service2 will send the results of its invocation to the reply-to endpoint.
If you want to transform a response message without doing any other work on the response, you set the
transformers attribute on the response router without any other routing configuration.
ReplyTo
All outbound routers can have a reply-to endpoint endpoint that defines where the message should be
routed after the recipient of the message has finished processing it. The <reply-to> endpoint is applied
to the next component invoked. For example, if component1 dispatches to component2, and component1
has an outbound router with a reply-to endpoint, component2 will send the results of its invocation to
the reply-to endpoint. The <reply-to> endpoint can be any valid Mule endpoint URI and is passed along
with the message to the next component if the underlying transport supports reply-to messages. For
information on which transports support reply-to, see Available Transports.
<outbound>
<custom-router class="org.foo.ConcreteMessageSplitter">
<vm:endpoint path="component1"/>
<vm:endpoint path="vm://component2"/>
<vm:endpoint path="vm://component3"/>
<reply-to address="vm://component4"/>
</custom-router>
</outbound>
Time-outs
The Async Reply router timeout determines how long Mule should wait for replies before returning the
result. The default value is determined by the value of the default synchronous event timeout that has
been configured for the Mule instance. (For more information, see Configuration Options.) You can also
specify an independent timeout value for asynchronous replies for a given service using the optional
timeout attribute on the async-reply element.
The optional failOnTimeout attribute determines whether to throw an exception if the router times out
before all expected messages have been received. If set to false (the default), the current messages are
returned for processing.
Exception Strategy
Exception strategies are used to handle exception conditions when an error occurs during the processing
of a message. You can configure exception strategies on services. If no exception strategy is configured,
the DefaultServiceExceptionStrategy is used.
Service Bridge
Service component configuration is optional in Mule 2.x. The default and implicit component used is
PassThroughComponent . This component automatically bridges inbound messages to the outbound
phase and simply passes messages to the outbound routers. This approach is useful for bridging
endpoints if you want to pass a message from one transport to another.
Example: Reading a file and send it's contents onto a Jms Topic.
<service name="FileToJmsBridge">
<inbound>
<outbound>
<outbound-pass-through-router">
<jms:outbound-endpoint topic="receivedFiles"/>
</outbound-pass-through-router>
</outbound>
</service>
Service Model
By default, Mule uses the staged event-driven architecture (SEDA) model. SEDA is an architecture
model where applications consist of a network of event-driven stages connected by explicit queues.
This architecture allows services to be well-conditioned to load, preventing resources from being
overcommitted when demand exceeds service capacity. As a result, SEDA provides an efficient event-
based queuing model that maximizes performance and throughput.
See Models for more information about alternative models and information about how you can implement
your own.
The messaging pattern is configured on endpoints, allowing multiple patterns to be used with the same
service. For more information, see Messaging Patterns.
This document is in progress and forms part of a proposal of how messaging exchanges in
Mule should work. Not unnecessarily how they work now. See Mule Messaging Styles for
information on how Mule message exchanges work as of Mule 2.0.
Table of Contents
• Mule MEPs
• ° Notation
° In-Only
° - Example Configuration
- Example Code
° In-Out
° - Example Configuration
- Example Code
° In-Out (async)
° - Example Configuration
- Example Code
° In-Optional-Out
° - Example Configuration
- Example Code
° In-Only, Out-Only
° - Example Configuration
- Example Code
° In-Only, Optional-Out
° - Example Configuration
- Example Code
° In-Out, Out-Only
° - Example Configuration
- Example Code
° In-Optional-Out, Out-Optional-In
° - Example Configuration
- Example Code
° In-Out, Out-In
° - Example Configuration
- Example Code
° In-Optional-Out, Out-Only
° - Example Configuration
- Example Code
• Advanced Patterns
• ° In-Optional-Out, Out-Only (Async Reply Router)
° - Example Configuration
- Example Code
° In-Out, Out-Only (Async Reply Router)
° - Example Configuration
- Example Code
° Orchestration using Component Bindings
° - Example Configuration
- Example Code
• What Next?
• ° Possible MuleClient Changes
° Simplifying the client
Focus on Services
Web Services MEPs talk about client and server. Clients make requests to a server and (may) get a result,
whilst the server will receive data from a client (and sometimes may push data to a client). On the other
hand, Mule like other SOA-centric platforms focus on services. This means the world is viewed in terms of
data coming into and sent out of a service. The service could be viewed as a client or a server depending
on whether data flowing inbound or outbound. Thus, it makes a lot of sense to model service interactions
on the inbound and outbound separately.
The way to think about this is that we are defining MEPs between two parties, it doesn't matter if it's a
client or server, a service or legacy application that initiates or is the recipient of a request. And a request
is just an event, something that was triggered by a local or external process. By defining MEPs on the
inbound and outbound we can go on to define a set of combined MEPs (in and out) for Mule.
The diagram above shows a party (Application or Mule) that initiates a request. This gets receive by a
service inbound endpoint. Next the component is invoked and the result is routed via the outbound router
to another party (Application or Mule).
WSDL MEPs
Before we go any further lets introduce the MEPs defined in the WSDL 1.1 and WSDL 2.0 specifications.
Pattern Description
Pattern Description
Out-Optional-In The provider initiates the call and the client can
choose to respond.
Mule MEPs
The following sections will introduce each exchange pattern in Mule based on the convention defined
above. Each pattern will either have an inbound MEP, outbound MEP or both. It is possible to have
multiple inbound and outbound MEPS for a single service, this will be discussed later on.
For the sake of clarity each pattern is described in terms of what interactions will occur for each scenario.
For those familiar with Mule, I will provide examples of the equivalent configuration in Mule. The plan for
this document is to come up with a simpler configuration for these MEPs in Mule.
Notation
Each pattern below is presented with a diagram that depicts the message flow for the pattern using the
diagram notation above. Each pattern also has a description and further information below it. Then there
is an XML configuration for each. Note that all components are written using Groovy just so that the
components are transparent for the user. Finally, there is a code example for each which shows how a
test-case is written to test each pattern.
In-Only
Example Configuration
Example Code
The following example shows how to test the above configuration using a FunctionalTestCase.
In-Out
Example Configuration
Example Code
The following example shows how to test the above configuration using a FunctionalTestCase.
In-Out (async)
Example Code
The following example shows how to test the above configuration using a FunctionalTestCase.
In-Optional-Out
Example Configuration
Example Code
The following example shows how to test the above configuration using a FunctionalTestCase.
In-Only, Out-Only
Example Configuration
Example Code
The following example shows how to test the above configuration using a FunctionalTestCase.
In-Only, Optional-Out
Example Configuration
Example Code
The following example shows how to test the above configuration using a FunctionalTestCase.
In-Out, Out-Only
Example Configuration
Example Code
The following example shows how to test the above configuration using a FunctionalTestCase.
In-Optional-Out, Out-Optional-In
Example Configuration
Example Code
The following example shows how to test the above configuration using a FunctionalTestCase.
Example Configuration
Example Code
The following example shows how to test the above configuration using a FunctionalTestCase.
Example Configuration
Example Code
The following example shows how to test the above configuration using a FunctionalTestCase.
Example Configuration
The following example shows how to test the above configuration using a FunctionalTestCase.
Example Configuration
Example Code
The following example shows how to test the above configuration using a FunctionalTestCase.
TODO
Example Configuration
Example Code
The following example shows how to test the above configuration using a FunctionalTestCase.
What Next?
Mule can model every MEP combination that makes sense. What is difficult in Mule right now it to know
how to do this. The logical next step would be to change the way endpoints are configured. Instead,
of having the synchronous and remoteSync attributes on the endpoint, users could set an exchange
attribute that would define one of the options above. There are some obvious benefits:
For example, depending on the transport being used developers could define endpoints such as:
The MuleExchange object here provides an interface for all messages generated from the invocation.
Overview
Mule can send messages asynchronously (each stage of the message is on a different thread) or
synchronously (after the message is received by the component, it uses a single thread throughout the
rest of its lifecycle and supports request-response). You can set the synchronous property on the model,
on the endpoint, and implicitly within the transport.
By default, Mule uses SEDA, which uses asynchronous staged queues. One thread is used for the inbound
message, another thread is used for processing the message in the service component, and another
thread is used for the outbound message. You can configure the message so that the inbound message
is on one thread and the remaining stages are on a second thread, or so that all stages are on a single
thread.
Mule also supports the request-response messaging style. In this case, there is no outbound router, so
the message is sent back to the same endpoint as the inbound endpoint, providing a reply back to the
sender.
You can use a mix of synchronous and asynchronous messaging styles throughout Mule. You can also
use a mix of styles for a single service component. For example, a service component can have multiple
outbound routers that route to different endpoints depending on filter criteria, and you might want the
message to be sent synchronously in some cases and asynchronously in others.
The rest of this page describes the various messaging styles in more detail and how to configure them. It
includes reference to the message exchange patterns (MEPs) that each message style supports. For more
information on MEPs and Mule, see MEPs.
Asynchronous
Example Configuration
Request Response
Example Configuration
Example Configuration
Remote Synchronous
Example Configuration
Message routers are used to control how events are sent and received by components in the system.
Mule defines inbound routers that apply to events as they are received and outbound routers that are
invoked when an event is being dispatched.
Mule provides flexible message routing support for your components. Routing features are based on the
enterprise routing requirements described in EIP.
For information on how your Java or Script components can orchestrate messages, see Component
Bindings.
Quick Reference
Custom
All inbound routers are configured on a service within the <inbound> element.
If no router is defined on the inbound all events received via the endpoints will be processed by the
service component.
<inbound>
<jms:inbound-endpoint queue="foo.bar"/>
<vm:inbound-endpoint path="foo.bar.local"/>
</inbound>
Selective Consumer
A selective consumer is an inbound router that can apply one or more filters to the incoming message. If
the filters match, the message is forwarded to the component. Otherwise, the message is forwarded to
the catch-all strategy on the router. If no catch-all is configured, the message is ignored and a warning is
logged.
<inbound>
<selective-consumer-router>
<mulexml:jxpath-filter expression="msg/header/resultcode = 'success'"/>
</selective-consumer-router>
<forwarding-catch-all-strategy>
<jms:endpoint topic="error.topic"/>
</forwarding-catch-all-strategy>
</inbound>
For information on using filters with this router, see Using Filters. Note that by default the filter is applied
to the message after the inbound transformers are applied. If you need to execute filters on the message
without applying any transformation, you can set the transformFirst property on this router to control
whether transformations are applied.
<inbound>
<forwarding-catch-all-strategy>
<jms:endpoint topic="error.topic"/>
</forwarding-catch-all-strategy>
<selective-consumer-router transformFirst="false">
<mulexml:jxpath-filter expression="msg/header/resultcode = 'success'"/>
</selective-consumer-router>
</inbound>
Idempotent Receiver
An idempotent receiver ensures that only unique messages are received by a service by checking the
unique ID of the incoming message. The ID can be generated from the message using an expression
defined in the idExpression attribute. By default, the expression used is ${message:id}, which
means the underlying endpoint must support unique message IDs for this to work. Otherwise, a
UniqueIdNotSupportedException is thrown.
<inbound>
<idempotent-receiver-router idExpression="#[message:id]-#[header:foo]">
<simple-text-file-store directory="./idempotent"/>
</idempotent-receiver-router>
</inbound>
The nested element shown above configures the location where the received message IDs are stored.
In this example, they are stored to disk so that the router can remember state between restarts. If the
directory attribute is not specified, the default value used is ${mule.working.dir}/objectstore where
mule.working.dir is the working directory configured for the Mule instance. For more information, see
Configuration Options.
This router ensures that only unique messages are received by a service by calculating the hash of the
message itself using a message digest algorithm. This approach provides a value with an infinitesimally
small chance of a collision and can be used to filter message duplicates. Note that the hash is calculated
over the entire byte array representing the message, so any leading or trailing spaces or extraneous
bytes (like padding) can produce different hash values for the same semantic message content.
Therefore, you should ensure that messages do not contain extraneous bytes. This router is useful when
the message does not support unique identifiers.
<inbound>
<secure-hash-idempotent-receiver-router messageDigestAlgorithm="SHA26">
<simple-text-file-store directory="./idempotent"/>
</secure-hash-idempotent-receiver-router>
</inbound>
Idempotent Secure Hash Receiver also uses object stores, which are configured the same way as the
Idempotent Receiver. The optional messageDigestAlgorithm attribute determines the hashing algorithm
that will be used. If this attribute is not specified, the default algorithm SHA-256 is used.
Collection Aggregator
Some outbound routers assign a correlation ID to messages when they are dispatched. The Collection
Aggregator groups incoming messages with matching correlation IDs into a MuleMessageCollection.
MuleMessageCollection extends MuleMessage and provides additional methods for working with a
collection of messages. You can specify the timeout attribute to determine how long the router waits in
milliseconds for messages to complete the group. The size of the message group is determined by the
correlationGroupSize attribute.
The aggregator is based on the Selective Consumer, so you can also apply filters to the messages.
<inbound>
<collection-aggregator-router timeout="6000">
<payload-type-filter expectedType="org.foo.some.Object"/>
</collection-aggregator-router>
</inbound>
This aggregator combines messages that have the same correlation ID into a single message. Correlation
IDs are set on messages when they are dispatched by certain outbound routers such as the Recipient
List and List Message Splitter routers. These messages can be aggregated back together again using this
router.
This aggregator is based on the Selective Consumer, so filters can also be applied to messages.
The optional message-info-mapping element allows you to identify the correlation ID in the message
using an expression. If this element is not specified, MuleMessage.getCorrelationId() is used.
This router is used to configure a custom message aggregator. Mule provides an abstract implementation
that has a template method that performs the message aggregation. A common use of the aggregator
router is to combine the results of multiple requests such as "ask this set of vendors for the best price of
X".
The aggregator is based on the Selective Consumer, so you can also apply filters to messages.
<inbound>
<custom-collection-aggregator-router class="org.mule.CustomAgregator">
<payload-type-filter expectedType="org.foo.some.Object"/>
</custom-collection-aggregator-router>
</inbound>
Correlation Resequencer
The Correlation Resequencer Router will hold back a group of messages and resequence them using the
messages correlation sequence property. A java.util.Comparator is used to sort the events. This router
is based on the Selective Consumer, which means that filters can be applied to the incoming events.
<inbound>
<correlation-resequencer-router>
<mulexml:jxpath-filter expression="msg/header/resultcode = 'success'"/>
</correlation-resequencer-router>
</inbound>
Forwarding Router
This router allows messages to be forwarded to an outbound router without first being processed by a
component. It essentially acts as a bridge between an inbound and an outbound endpoint. This is useful
in situations where the developer does not need to execute any logic on the inbound event but does
need to forward it on to a component residing on another destination (such as a remote Mule node or
application) over the network.
<service name="FileReader">
<inbound>
<file:inbound-endpoint path="/temp/myfiles/in"/>
<forwarding-consumer-router/>
</inbound>
<echo-component/>
<outbound>
<tcp:outbound-endpoint host="192.168.0.6" port="12345">
When a file becomes available on the local file system, an event is triggered that creates the
message, which is then automatically forwarded via TCP to 192.168.0.6. Notice that there is an
outboundTransformer configured. This will be used to transform the event's payload before it is
dispatched over TCP. There is an echo component configured, but when the forwarding consumer is used,
the component invocation is skipped, and the message is forwarded directly the the outbound router(s).
Configuring the service as a bridge is recommended for most forwarding scenarios. However, if you need
to selectively forward only some events while others are processed by the component, you will need to
use this router.
The Forwarding Consumer router extends the Selective Consumer, so you can configure filters on this
router.
Wiretap Router
You can configure custom inbound routers by specifying the custom router class on the <custom-
inbound-router> element and by using Spring properties. Optionally, you can also configure an
outbound endpoint in case this is needed for implementing a custom wiretap router for example.
<inbound>
<custom-inbound-router class="org.my.CustomInboundRouter">
<mulexml:jxpath-filter expression="msg/header/resultcode = 'success'"/>
<spring:properties>
<spring:property key="key1" value="value1"/>
<spring:property key="key2" value="value2"/>
</spring:properties>
<vm:outbound-endpoint path="out"/>
</custom-inbound-router>
</inbound>
Pass-through Router
This router always matches and simply sends or dispatches message via the one endpoint it has
configured.
2.0:
<outbound>
<outbound-pass-through-router>
2.1:
<outbound>
<pass-through-router>
<smtp:outbound-endpoint to="[email protected]"/>
</pass-through-router>
</outbound>
Filtering Router
This router uses filters to route only those messages that meet specific criteria to the endpoint configured
on the router. All Mule outbound routers, except the pass-through router described above, extend
FilteringOutboundRouter, so you can always apply a filter to an outbound router.
<outbound>
<forwarding-catch-all-strategy>
<jms:outbound-endpoint queue="error.queue"/>
</forwarding-catch-all-strategy>
<filtering-router>
<smtp:outbound-endpoint to="[email protected]"/>
<payload-type-filter expectedType="java.lang.Exception"/>
</filtering-router>
<filtering-router>
<jms:outbound-endpoint queue="string.queue"/>
<and-filter>
<payload-type-filter expectedType="java.lang.String"/>
<regex-filter pattern="the quick brown (.*)"/>
</and-filter>
</filtering-router>
</outbound>
The filter is applied to the message first, and then the transformers are applied. If you need to transform
the message before the filter is applied, you can set a transformer on this router that will be applied to
the message before the filter is applied.
<outbound>
<filtering-router>
<smtp:outbound-endpoint to="[email protected]"/>
<payload-type-filter expectedType="java.lang.Exception"/>
<transformer ref="aTransformer"/>
</filtering-router>
</outbound>
The recipient list router can be used to send the same message to multiple endpoints over a single
endpoint, or to implement routing-slip behavior where the next destination for the message is determined
from message properties or the payload. Mule provides an abstract recipient list implementation
org.mule.routing.outbound.AbstractRecipientList , which provides a thread-safe base for specialized
implementations.
Mule also provides a static recipient list router that takes a configured list of endpoints from the current
message or from a statically declared list on the endpoint.
<outbound>
<static-recipient-list-router>
Multicasting Router
The Multicasting router can be used to send the same message over multiple endpoints. When using
this router, be sure to configure the correct transformers on the endpoints to handle the message source
type.
<outbound>
<multicasting-router>
<jms:endpoint queue="test.queue" transformer-refs="StringToJmsMessage"/>
<http:endpoint host="10.192.111.11" transformer-refs="StringToHttpClientRequest"/>
<tcp:endpoint host="10.192.111.12" transformer-refs="StringToByteArray"/>
<payload-type-filter expectedType="java.lang.String"/>
</multicasting-router>
</outbound>
Chaining Router
The Chaining router can be used to send the message through multiple endpoints using the result of the
first invocation as the input for the next. For example, this can be useful where you want to send the
results of a synchronous request-response invocation such as a Web service call to a JMS queue. Endpoint
transformers can be used to transform the message to the format the next endpoint requires.
<outbound>
<chaining-router>
<axis:outbound-endpoint address="http://localhost:8081/services/xyz?method=getSomething"/>
<jms:outbound-endpoint queue="something.queue">
<transformer ref="SomethingToJmsMessage"/>
</jms:outbound-endpoint>
</chaining-router>
</outbound>
A message splitter can be used to break down an outgoing message into parts and dispatch those parts
over different endpoints configured on the router. The List Message Splitter accepts a list of objects that
will be routed to different endpoints. The actual endpoint used for each object in the list is determined by
a filter configured on the endpoint itself. If the endpoint's filter accepts the object, the endpoint will be
used to route the object.
By default the AbstractMessageSplitter sets a correlation ID and correlation sequence on the outbound
events so that inbound routers such as the Collection Aggregator or Correlation Resequencer are able to
resequence or combine the split messages.
The router configuration below expects the message payload to be a java.util.List and will route
objects in the list that are of type com.foo.Order, com.foo.Item, and com.foo.Customer. The router will
allow any number and combination of these objects.
<outbound>
Note that there is also a filter on the router itself that ensures that the message payload received is
of type java.util.List. If there are objects in the list that do not match any of the endpoint filters,
a warning is written to the log and processing continues. To route any non-matching object types to
another endpoint, add the endpoint at the end of the list without a filter.
This router is similar to the List Message Splitter but operates on XML documents. Supported payload
types are:
• org.dom4j.Document objects
• byte[]
• java.lang.String
The router splits the payload into nodes based on the splitExpression property. The actual endpoint
used for each object in the list is determined by a filter configured on the endpoint itself. If the endpoint's
filter accepts the object, the endpoint will be used to route the object. Each part returned is actually
returned as a new DOM4J document.
The router can optionally perform a validation against an external XML schema document. To perform the
validation, set externalSchemaLocation to the XSD file in your classpath. Setting this property overrides
whatever schema document you declare in the XML header.
<outbound>
<mulexml:message-splitter splitExpression="root/nodes" validateSchema="true"
externalSchemaLocation="/com/example/TheSchema.xsd">
<vm:outbound-endpoint path="order">
<payload-type-filter expectedType="com.foo.Order"/>
</vm:outbound-endpoint>
<vm:outbound-endpoint path="item">
<payload-type-filter expectedType="com.foo.Item"/>
</vm:outbound-endpoint>
<vm:outbound-endpoint path="customer">
<payload-type-filter expectedType="com.foo.Customer"/>
</vm:outbound-endpoint>
<payload-type-filter expectedType="org.dom4j.Document"/>
</mulexml:message-splitter>
</outbound>
This routing pattern allows you to split a single message into a number of fixed-length messages that
will all be routed to the same endpoint. It will split the message up into a number of smaller chunks
according to the messageSize attribute that you configure for the router. If you do not configure a
messageSize, or if it has a value of zero, the message will not be split up and the entire message will be
routed to the destination endpoint as is. The router splits up the message by first converting it to a byte
A message chunking router is useful if you have bandwidth problems (or size limitations) when using
a particular transport. If you want to be able to route different segments of the original message to
different endpoints, consider using the List Message Splitter or Filtering Xml Message Splitter router
instead.
To put the chunked items back together again, you can use the Message Chunking Aggregator as the
inbound router on the next service.
Sample Configuration
<service name="chunkingService">
<inbound>
<vm:inbound-endpoint path="fromClient"/>
</inbound>
<outbound>
<message-chunking-router messageSize="4">
<vm:outbound-endpoint path="toClient"/>
</message-chunking-router>
</outbound>
</service>
In the example above, any data received on the vm fromClient endpoint is chunked into messages four
bytes long before being sent along the vm toClient endpoint. If we sent "The quick brown fox jumped
over the lazy dog" to this service, anything listening on the vm toClient endpoint would receive the
following messages (the spaces have been replaced with underscores for better legibility):
Message # Contents
1 The_
2 quic
3 k_br
4 own_
5 fox_
6 jump
7 ed_o
8 ver_
9 the_
10 lazy
11 _dog
The Exception Based router can be used to send a message over an endpoint by selecting the first
endpoint that can connect to the transport. This can be useful for setting up retries. When the first
endpoint fails, the second will be invoked, and if that fails, it will try the next endpoint. Note that this
router overrides the endpoint mode to synchronous while looking for a successful send and will resort to
using the endpoint's mode for the last item in the list.
The endpoint template router allows endpoints to be altered at runtime based on properties set on the
current event or fallback values set on the endpoint properties. Templated values are expressed using
square braces around a property name, such as:
axis:http://localhost:8082/MyService?method=[SOAP_METHOD]
<outbound>
<endpoint-template-router address="foobar://server:1234/path/path/path?
param1=[header1]¶m2=[header2]"/>
</outbound>
The header1 and header2 parameters are substituted with the actual values from the current message.
The parameters can be used only in the query string, as the square brackets are not valid characters for
the authority and path URI components.
You can configure custom outbound routers by specifying the custom router class on the <custom-
outbound-router> element and by using Spring properties.
<outbound>
<custom-outbound-router class="org.my.CustomOutboundRouter" transformers-ref="Transformer1">
<tcp:endpoint host="10.192.111.10" port="10001" />
<tcp:endpoint host="10.192.111.11" port="10001" />
<mulexml:jxpath-filter expression="msg/header/resultcode = 'success'"/>
<spring:properties>
<spring:property key="key1" value="value1"/>
<spring:property key="key2" value="value2"/>
</spring:properties>
</custom-outbound-router>
</outbound>
The Single Asynchronous Reply router configures a single response router. This router returns the first
message it receives on a reply endpoint and discards the rest.
<single-async-reply-router/>
The Collection Asynchronous Reply router configures a collection response router. This router returns a
MuleMessageCollection message type that contains all messages received for the current correlation.
<collection-async-reply-router/>
The Custom Asynchronous Reply router allows you to configure a custom asynchronous reply router. To
configure the custom router, set the class attribute to the custom router class.
<custom-async-reply-router class="org.mule.CustomAsyncReplyRouter"/>
Catch-all Strategies
You can configure a catch-all strategy that will be invoked if no routing path can be found for the current
message. An inbound or outbound endpoint can be associated with a catch-all strategy so that any
orphaned messages can be caught and routed to a common location. For detailed information on the
elements you configure for catch-all strategies, see Catch All Strategy Configuration Reference.
For example:
<service name="dataService">
<inbound-endpoint address="vm://in2" connector-ref="vmQueue">
<string-to-byte-array-transformer/>
</inbound-endpoint>
<selective-consumer-router>
<payload-type-filter expectedType="java.lang.Integer"/>
</selective-consumer-router>
<custom-forwarding-catch-all-strategy
class="org.mule.test.usecases.routing.InboundTransformingForwardingCatchAllStrategy">
<outbound-endpoint address="vm://catchall" connector-ref="vmQueue">
<string-to-byte-array-transformer/>
</outbound-endpoint>
</custom-forwarding-catch-all-strategy>
</inbound>
...
<outbound>
<filtering-router transformer-refs="TestCompressionTransformer">
<outbound-endpoint address="test://appleQ2" name="TestApple-Out" />
<payload-type-filter expectedType="java.lang.String" />
</filtering-router>
<custom-catch-all-strategy class="org.mule.tck.testmodels.mule.TestCatchAllStrategy" />
</outbound>
...
</service>
Forwarding
This catch-all strategy is used to forward the event to an endpoint that is configured if no outbound
routers match.
<forwarding-catch-all-strategy>
<jms:outbound-endpoint queue="error.queue"/>
</forwarding-catch-all-strategy>
Custom Forwarding
This catch-all strategy is the same as the default forwarding catch-all strategy, but it allows you to specify
a custom implementation to use by configuring the class attribute. You can also configure additional
optional properties.
<custom-forwarding-catch-all-strategy class="org.my.CustomForwardingCatchAllStrategy">
<jms:outbound-endpoint queue="error.queue"/>
<spring:property key="myProperty" value="myValue"/>
</forwarding-catch-all-strategy>
Logging
This catch-all strategy does nothing with the message and simply logs a warning indicating that the
message was not dispatched because there was no routing path defined.
<logging-catch-all-strategy/>
Custom
This catch-all strategy allows you to use a custom class to perform whatever behavior you require. To
implement a custom catch-all strategy that forwards the message to an endpoint, you should used the
custom forwarding catch-all strategy instead.
<custom-catch-all-strategy/>
Filters
Filters provide the logic used to invoke a particular router. Filters can be combined using the logic filters
AndFilter, OrFilter, and NotFilter. Not all routers need to use filters, but all routers support them. See
Using Filters for complete information.
Component Bindings
[ Java Component Binding Configuration ] [ Script Component Bindings ]
Components can use bindings to call an external service during execution. The bindings used with a Java
component bind a Java interface, or single interface method, to an outbound endpoint. The external
service to be called should implement the same interface, and the component should encapsulate a
reference to that interface, which is initialized during the bootstrap stage by the Mule configuration
builder. The reference will be initialized using a reflective proxy class.
With component bindings, you can configure multiple interfaces or a single interface with an endpoint
bound to one or more Mule endpoints.
Note that Mule currently supports component bindings for Java components (the default components in
Mule) and script components, such as Groovy or JRuby. This page describes how to configure each.
In this example, the component InvokerComponent has a field hello, which is of type HelloInterface,
with getter and setter methods for the field. The invoke method will be called on the service and calls the
hello.sayHello() method. This call will result in another service call.
Now, you simply configure your component to bind the sayHello method to the endpoint that will invoke
another service.
<component class="org.mule.examples.bindings.InvokerComponent">
<binding interface="org.mule.examples.bindings.HelloInterface" method="sayHello">
<axis:outbound-endpoint use="LITERAL" style="WRAPPED"
address="http://myhost.com:81/services/HelloWeb?method=helloMethod" synchronous="true"/>
</binding>
</component>
<outbound>
<pass-through-router>
<jms:outbound-endpoint queue="Invoker.out"/>
</pass-through-router>
</outbound>
</service>
Note that the call to the external web service is synchronous, because you want a result returned and
need to block until the call is finished.
One powerful feature is that you can handle data conversion when making a call and receiving a result
using the normal transformer configuration on the endpoint. In the above example, assume the web
service was expecting an org.mule.examples.bindings.WebHelloRequest object and returned an
org.mule.examples.bindings.WebHelloResponse object. You don't want your component to know about
these external data types, so you can configure transformers to do the conversion when the call is made:
<component class="org.mule.examples.bindings.InvokerComponent">
<binding interface="org.mule.examples.bindings.HelloInterface" method="sayHello">
<axis:outbound-endpoint use="LITERAL" style="WRAPPED"
address="http://myhost.com:81/services/HelloWeb?method=helloMethod" synchronous="true">
<transformers>
<custom-transformer class="org.mule.examples.bindings.StringsToWebRequest"/>
</transformers>
<response-transformers>
<custom-transformer class="org.mule.examples.bindings.WebResponseToString"/>
</response-transformers>
</axis:outbound-endpoint>
</binding>
</component>
Exceptions
If the remote service call triggers an exception of fault, this exception will get serialized back to the local
service call and thrown. If your service wants to handle this exception, you must add the exception (or
java.lang.Exception) to the bound method signature and use a try catch block as usual.
<service name="ScriptService">
<inbound>
<vm:inbound-endpoint ref="inboundEndpoint"/>
</inbound>
<script:component>
<script:script engine="groovy">
return "Total: " + AdditionService.add(1,2)
</script:script>
The implementation for the component is contained within the <script:script> element:
We refer to the binding interface using the short class name AdditionService and invoke the add
method, which will call a local addition service.
To copy all messages to a specific component, you configure an outbound endpoint on the WireTap
router:
<inbound>
<vm:inbound endpoint path="FromUser"/>
<wire-tap-router>
<vm:outbound-endpoint path="tapped.channel"/>
</wire-tap-router>
</inbound>
In the following scenario, no component is specified, so all data from the inbound VM channel is copied
to the outbound endpoint using implicit bridging. However, let's assume you want to forward some of
the data to another component called WireTapReceiver based on a filter. For the sake of illustration, this
component simply prepends the message with "INTERCEPTED:" before sending it to the FromTapper VM
channel. The code for the WireTapReceiver component is as follows:
<model name="default">
<service name="StdComp">
<inbound>
<vm:inbound-endpoint path="In"/>
<wire-tap-router>
<vm:outbound-endpoint path="ToTapper"/>
</wire-tap-router>
</inbound>
<outbound>
<outbound-pass-through-router>
<vm:outbound-endpoint path="ToClient"/>
</outbound-pass-through-router>
</outbound>
</service>
<service name="wiretapper">
<inbound>
<vm:inbound-endpoint path="ToTapper"/>
</inbound>
<component class="org.myclass.WireTapReceiver"/>
<outbound>
Note: Mule uses a separate dispatcher thread for the wiretap endpoint.
Using Filters
The WireTap router is useful both with and without filtering. If filtered, it can be used to record or take
note of particular events or to copy events that require additional processing to a different component. If
filters aren't used, you can make a backup copy of all events received by a component. The behavior here
is similar to that of an interceptor, but interceptors can alter the message flow by preventing the message
from reaching the component. WireTap routers cannot alter message flow but just copy on demand.
In the previous example, the StdComp service receives events from the In endpoint, and the router
passes the event to the component and copies it to the vm://ToTapper endpoint. The WireTapper
component listens on this channel and forwards the message, after processing, to the FromTapper
endpoint.
The WireTap router is based on the SelectiveConsumer router, so it can take any filters supported by
SelectiveConsumer. In this example, only messages that match the filter expression are copied to the
vm://ToTapper endpoint.
<wire-tap-router>
<wildcard-filter pattern="the quick brown*"/>
<vm:outbound-endpoint path="tapped.channel"/>
</wire-tap-router>
Multiple WireTapping
You can have multiple WireTap routers for the same service:
<inbound>
<endpoint address="vm://In"/>
<wire-tap-router>
<wildcard-filter pattern="the quick brown*"/>
<vm:outbound-endpoint path="ToTapper"/>
</wire-tap-router>
<wire-tap-router>
<wildcard-filter pattern="the slow green*"/>
<vm:outbound-endpoint path="ToOtherTapper"/>
</wire-tap-router>
</inbound>
In this example, input is passed to the component and also copied to one of two destinations depending
on the filter.
Method Invocation
You can invoke your service with a specific method. For example, if your inbound endpoint is not vm://
In but axis\:http://localhost\:8080/services, or if your component StdComp is a customized
component with a method foo(), you can invoke the web service and its method foo() via the following
endpoint:
http\://localhost\:8080/services/StdComp?method=foo¶m=bar
When this event is wire-tapped to the receiving component, Mule might fail with an exception if the
receiving component does not have the method foo(). To avoid this problem and to ensure that the
desired method is invoked, you overwrite the method of the message by specifying ?method=methodName
?method= so that the onCall() will be called instead. For example:
Additional Features
The WireTap router supports the following additional features:
• Transactions are supported, so the forwarding of events can either start or join a transaction
provided that the endpoint supports transactions.
• Reply-To can be used to route replies from this endpoint.
XML Configuration
[ XML Schema ] [ Namespaces ] [ Spring ] [ Property Placeholders ] [ Global Configuration Settings ]
As explained in the overview, the most common way to configure Mule is via Spring XML files that use
custom Mule namespaces.
XML Schema
The configuration files are based on XML schemas, which are specified in the header:
Be sure to specify all the necessary schema files. This can be time-consuming when setting up the
configuration file, but importing schemas provides the following time-saving benefits:
Namespaces
Each Mule module or transport has its own XML schema. When you import a schema, it has its own
namespace. For example, the following lines from the above header:
xmlns:jms="http://www.mulesource.org/schema/mule/jms/2.0"
xsi:schemaLocation="http://www.mulesource.org/schema/mule/jms/2.0 http://www.mulesource.org/schema/
mule/jms/2.0/mule-jms.xsd"
will bind the mule-jms.xsd schema to the jms namespace. Therefore, any XML element starting with
<jms: will assume the element comes from the mule-jms.xsd schema.
Default Namespace
Typically, you set the Mule core schema as the default namespace for your configuration file. This means
that any XML element without a prefix will come from the Mule core schema (mule.xsd). To set the
default namespace schema, specify xmlns immediately followed by the URL of the Mule schema, without
the colon and namespace prefix you set in the previous example (e.g., xmlns instead of xmlns:jms):
<mule xmlns="http://www.mulesource.org/schema/mule/core/2.0"
xsi:schemaLocation="http://www.mulesource.org/schema/mule/core/2.0 http://www.mulesource.org/
schema/mule/core/2.0/mule.xsd">
...config...
</mule>
To use the standard Spring elements, you import the standard Spring namespaces:
xmlns:spring="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/
schema/beans/spring-beans-2.0.xsd"
...
<spring:bean id="myBean" class="com.acme.CoolBean">
<spring:property name="sessionFactory">
<spring:ref local="mySessionFactory" />
</spring:property>
<spring:property name="configuration">
<spring:value>my-config.xml</spring:value>
</spring:property>
</spring:bean>
For complete information on Spring configuration, see the Spring Framework reference documentation.
Property Placeholders
You can use Ant-style property placeholders in your Mule configuration. For example:
The values for these placeholders can be made available in a variety of ways, as described in this section.
Global Properties
You can use the <global-property> element to set a placeholder value from within your Mule
configuration, such as from within another Mule configuration file:
Properties File
To load properties from a file, you can use the standard Spring element
<context:property-placeholder>:
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd"
smtp.username=JSmith
smtp.password=ChangeMe
The placeholderPrefix value can be anything other than "${", which is what Mule uses to parse its own
properties. We recommend you set the value to "#{". Note that you do not have to change anything in
your Spring configuration or properties file to match this value; it simply differentiates Spring properties
from Mule properties. If you do not set the placeholderPrefix attribute, it creates a conflict with Mule,
and you will see a "Could not resolve placeholder" error.
System Properties
The placeholder value can come from a JDK system property. If you start Mule from the command line,
you would specify the properties as follows:
If you start Mule programmatically, you would specify the properties as follows:
System.getProperties().put("smtp.username", "JSmith");
System.getProperties().put("smtp.password", "ChangeMe");
MuleContext muleContext = new DefaultMuleContextFactory().createMuleContext(new
SpringXmlConfigurationBuilder("my-config.xml"));
muleContext.start();
Environment Variables
There is no standard way in Java to access environment variables. However, this link has some options
you might find useful.
<mule>
...
<configuration defaultTransactionTimeout="31337">
<default-component-threading-profile poolExhaustedAction="RUN"/>
...
</configuration>
For a list of the available global configuration settings, see Global Settings Configuration Reference.
When including the user name and password in the endpoint, escape any characters
that are illegal for URIs, such as the @ character. For example, if the user name is
[email protected], you should enter it as user%40myco.com.
PGP Security
This page is under construction
Requirements
You need to add these libraries to Mule classpath:
• Cryptix OpenPGP
• Cryptix JCE
http://java.sun.com/j2se/1.4/download.html
http://java.sun.com/j2se/1.5.0/download.jsp
The default distribution of the JCE allows as Sun calls it 'strong, but limited strength
cryptography'. This basically means that you cannot use RSA keys bigger than 2048 bits,
and no symmetric ciphers that use more than 128 bits. ElGamal is not allowed at all, thus
DH/DSS cannot be used for encryption.
securityContext.xml
<beans>
<bean id="pgpKeyManager" class="org.mule.extras.pgp.PGPKeyRingImpl"
init-method="initialise">
<property name="publicKeyRingFileName">
<value>pubring.gpg</value>
</property>
<property name="secretKeyRingFileName">
<value>secring.gpg</value>
</property>
<property name="secretAliasId">
<value>0x6168F39C</value>
</property>
<bean id="fakeCredentialAccessor"
class="org.mule.extras.pgp.FakeCredentialAccessor" />
</beans>
Our goal is to define a sample echo application that reads signed (and encrypted) files from a directory (/
temp/signedAndEncryptedFiles/in)
and write the decrypted content into /temp/decryptedFiles/out
<encryption-strategy name="KBE"
className="org.mule.extras.pgp.KeyBasedEncryptionStrategy">
<properties>
<container-property name="keyManager" reference="pgpKeyManager" />
</properties>
</encryption-strategy>
</security-manager>
<model name="echoTest">
<mule-descriptor name="echo" containerManaged="false"
implementation="org.mule.extras.pgp.EchoMsg">
<inbound-router>
<endpoint address="file:///temp/signedAndEncryptedFiles/in">
<security-filter
className="org.mule.extras.pgp.filters.PGPSecurityFilter">
<properties>
<property name="strategyName" value="KBE"/>
<property name="signRequired" value="true"/>
<container-property name="credentialsAccessor"
</inbound-router>
<outbound-router>
<router
className="org.mule.routing.outbound.OutboundPassThroughRouter">
</router>
</outbound-router>
</mule-descriptor>
</model>
</mule-configuration>
The property signRequired in the inbound security filter controls if we accept unsigned message or not.
the property authenticate in the outbound security filter controls if we want to encrypt messages for the
receiver
..and they said "free email account"...but I read "free persistent message queue"...
– Alessandro Riva
The JaasSimpleAuthenticationProvider is a security provider which provides a way to interact with the
Jaas Authentication Service.
Configuration:
The security provider for Jaas can be configured in a couple of different ways. First of all, it allows you
to configure jaas either by passing to the provider a jaas configuration file, which will be discussed
below, or by passing the required attributes directly to the JaasSimpleAuthenticationProvider. These two
configuration methods are described below.
Usually, JAAS authentication is performed in a pluggable fashion, so applications can remain independent
from underlying authentication technologies.
com.ss.jaasTest{
com.ss.jaas.loginmodule.DefaultLoginModule required
credentials="anon:anon;Marie:Marie;"
};
The above example was saved in a file called jaas.conf. This file contains just one entry called
com.ss.jaasTest, which is where the application we want to protect can be found. The entry specifies the
LoginModule that will be used to authenticate the the user. As a login module, you can either use Mule's
DefaultLoginModule, one of the LoginModules that come with Sun, or else create your own. In this case,
we have opted for Mule's DefaultLoginModule.
The "required" flag that follows the LoginModule specifies that the LoginModule must succeed in order for
the authentication to be considered successful. There are other flags apart from this. These are:
Required - The LoginModule is required to succeed. If it succeeds or fails, authentication still continues
to proceed down the LoginModule list.
Requisite - The LoginModule is required to succeed. If it succeeds, authentication continues down the
LoginModule list. If it fails, control immediately returns to the application.
Sufficient - The LoginModule is not required to succeed. If it does succeed, control immediately returns
to the application (authentication does not proceed down the LoginModule list). If it fails, authentication
continues down the LoginModule list.
Optional - The LoginModule is not required to succeed. If it succeeds or fails, authentication still
continues to proceed down the LoginModule list.
The entry also specifies the credentials, in which we put a string of authorised users together with their
passwords. The credentials are put here only when the DefaultLoginModule is going to be used as the
method in which the user names and passwords are obtained may vary from one LoginModule to another.
The Format of the credentials string must adhere to the following format if the DefaultLoginModule is
going to be used:
<username>:<password>;
<security-provider name="JaasProvider"
className="com.ss.jaas.provider.JaasSimpleAuthenticationProvider">
<properties>
Note that in the above, the loginContextName contains the same name of the entry in the jaas
configuration file discussed above. This will be used for creating the login context as well as to find the
complete URL of the jaas.conf file.
The second option for the configuration of the JaasSimpleAuthenticationProvider is to pass the
configuration details which would otherwise be found in the jaas configuration file directly to the provider.
<security-provider name="JaasProvider"
className="com.ss.jaas.provider.JaasSimpleAuthenticationProvider">
<properties>
<property name="loginContextName" value="com.ss.jaasTest"/>
<property name="credentials" value="anon:anon;Marie.Rizzo:dragon;" />
</properties>
</security-provider>
In the above configuration, you can note that we removed the property "loginConfig" and we don't need
to pass any jaas configuration file. All we need to do is to pass the credentials to the provider (using the
same format specified above). Since no LoginModule is specified, the DefaultLoginModule will be used.
However, the JaasSimpleAuthenticationProvider also permits you to enter, using this configuration, your
own LoginModule.
<security-provider
name="JaasProvider"className="com.ss.jaas.provider.JaasSimpleAuthenticationProvider">
<properties>
<property name="loginContextName" value="com.ss.jaasTest"/>
<property name="loginModule" value="com.sun.security.auth.module.NTLoginModule"/>
</properties>
</security-provider>
In the above configuration, we have added a further property for the loginModule where you can add the
LoginModule you wish to use to authenticate the user. Since the NTLoginModule does not require you to
input a list of accepted usernames and passwords, the property for the "credentials" was removed.
In the Mule Security page, we discuss about how you can configure an in-memory DAO provider. In this
documentation, we will talk about how you can configure an Acegi's LDAP provider, which can be:
Basically, you will need to setup two beans in Spring, an InitialDirContextFactory and an
LdapAuthenticationProvider. The InitialDirContextFactory is the access point for obtaining an
LDAP context where the LdapAuthenticationProvider provides integration with the LDAP server. As an
example:
<bean id="authenticationProvider"
class="org.acegisecurity.providers.ldap.LdapAuthenticationProvider">
<constructor-arg>
<bean class="org.acegisecurity.providers.ldap.authenticator.BindAuthenticator">
<constructor-arg>
<ref local="initialDirContextFactory" />
</constructor-arg>
<property name="userDnPatterns">
<list>
<value>uid={0},ou=people</value>
</list>
</property>
</bean>
</constructor-arg>
<constructor-arg>
<bean class="org.acegisecurity.providers.ldap.populator.DefaultLdapAuthoritiesPopulator">
<constructor-arg>
<ref local="initialDirContextFactory" />
</constructor-arg>
<constructor-arg>
<value>ou=groups</value>
</constructor-arg>
<property name="groupRoleAttribute">
<value>cn</value>
</property>
<property name="searchSubtree">
<value>true</value>
</property>
<property name="rolePrefix">
<value>ROLE_</value>
</property>
<property name="convertToUpperCase">
<value>true</value>
</property>
</bean>
</constructor-arg>
</bean>
<security-manager>
<security-provider name="acegi-ldap" className="org.mule.extras.acegi.AcegiProviderAdapter">
<properties>
<container-property name="delegate" reference="authenticationProvider" />
</properties>
</security-provider>
</security-manager>
With the above configuration, you can achieve endpoint-level security and other security features in Mule
which require one or more security providers.
Configuring MethodSecurityInterceptor
The configuration for component authorization is similar with the one that we have discussed in this page.
The one worth mentioning is the configuration of ObjectDefinitionSource, e.g.
<property name="objectDefinitionSource">
<value>org.mule.components.simple.EchoService.*=ROLE_MANAGERS</value>
</property>
The roles are looked up by the DefaultLdapAuthoritiesPopulator which you configured in previous
section. By default, a role is prefixed with ROLE_ and its value is extracted (and turned uppercase) from
the LDAP attribute defined by the groupRoleAttribute.
This section describes how you can configure method level authorization on your components so that
users with different roles can only invoke certain service methods.
Apart from the daoAuthenticationProvider and inMemoryDaoImpl beans configured above, the following
beans must be configured:
• MethodSecurityInterceptor
• AuthenticationManager
• AccessDecisionManager
• AutoProxyCreator
• RoleVoter
The MethodSecurityInterceptor
• AuthenticationManager
• AccessDecisionManager
The following is a Security Interceptor for intercepting calls made to the methods of a component called
myComponent. myComponent has an interface (myComponentIfc) that defines two methods: delete and
writeSomething. Roles are set on these methods as seen below in the property objectDefinitionSource.
<bean id="myComponentSecurity"
class='org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor'>
<property name="authenticationManager">
<ref bean="authenticationManager"/>
</property>
<property name="accessDecisionManager">
<ref bean="accessDecisionManager"/>
</property>
<property name="objectDefinitionSource">
<value>
com.foo.myComponentIfc.delete=ROLE_ADMIN
com.foo.myComponentIfc.writeSomething=ROLE_ANONYMOUS
</value>
</property>
</bean>
The AuthenticationManager
This bean specifies that a user can access the protected methods if they have any one of the roles
specified in the objectDefinitionSource.
The AutoProxyCreator
This bean defines a proxy for the protected bean. When an application asks Spring for a myComponent
bean it will get this proxy instead.
<bean id="autoProxyCreator"
class='org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator'>
<property name='interceptorNames'>
<list>
<value>myComponentSecurity</value>
</list>
</property>
<property name='beanNames'>
<list>
<value>myComponent</value>
</list>
</property>
<property name='proxyTargetClass' value="true"/>
</bean>
When using BeanNameAutoProxyCreator to create the required proxy for security, the configuration
must contain the property proxyTargetClass set to true. Otherwise, the method passed to
MethodSecurityInterceptor.invoke is the proxy's caller, not the proxy's target.
The RoleVoter
The RoleVoter class will vote if any ConfigAttribute begins with ROLE_. The RoleVoter is case sensitive on
comparisons as well as the ROLE_ prefix.
• It will vote to grant access if there is a GrantedAuthority which returns a String representation (via
the getAuthority() method) exactly equal to one or more ConfigAttributes starting with ROLE_.
• If there is no exact match of any ConfigAttribute starting with ROLE_, the RoleVoter will vote to
deny access.
• If no ConfigAttribute begins with ROLE_, the voter will abstain.
MODE_THREADLOCAL which allows the authentication to be set on the current thread (this is the defualt
strategy used by Acegi).
MODE_INHERITABLETHREADLOCAL which allows authentication to be inherited from the parent thread
MODE_GLOBAL which allows the authentication to be set on all threads
The use of Acegi's security strategies is particularly useful when using an asynchronous system since we
have to add a property on the Security Provider in order for the authentication to be set on more than
one thread.
In this case we would use the MODE_GLOBAL as seen in the example below.
Many of Mule's features are documented here using the same terms as the popular Enterprise Integration
Patterns book. The book describes the problems Mule aims to solve and documents many of the patterns
used in the Mule framework. EIP documentation in this guide and other Mule guides will be in the form of
-
EIP - (pattern name) (book pattern no.) (the pattern url on the EIP site)
Introduction
This document aims to give an insight to the architecture of Mule. Mule's ultimate goal is to provide
a unified method of interacting with data from disparate sources without encumbering the developer
with the details about how the data is sent or received or the protocols involved. The result is an ESB
(Enterprise Service Bus) server that is highly-scalable, light-weight, fast and simple to pick up and
start using. Mule was architected with the ESB model in mind and its primary focus is to simply and
speed up the process of developing distributed service networks. However, as the name suggests, the
ESB model is usually associated with large integration projects where there are an array of disparate
enterprise applications. Mule makes Enterprise level service architectures possible for smaller projects
where resources, development cost and TTM need to be kept to a minimum.
Architecture Overview
The primary goal is to enable integration between applications using standards, open protocols and well-
defined patterns. To achieve this goal, Mule defines a set of components that can be used to perform
most of the hard work necessary to get disparate applications and services talking together.
Cannot resolve external resource into attachment.
This diagram shows a simple end-to-end topology of how Mule components fit together.
Application
The Application can be of any type, such as a web application, back office system, application server or
another Mule instance.
Channel
Can be any method of communicating data between two points. Channels are used in Mule to wire UMO
components together as well as to wire different Mule nodes together across a local network or the
internet.
Cannot resolve external resource into attachment. Mule doesn't implement or mandate any particular
channels though Mule does provide many channel options known as Transport providers.
"When an application has information to communicate, it doesn't just fling the information into the
messaging system, it adds the information to a particular Message Channel. An application receiving
information doesn't just pick it up at random from the messaging system; it retrieves the information
from a particular Message Channel."
A Message Receiver is used to read or receive data from the Application. In Mule a Receiver is just one
element of a Transport provider and Mule provides many transports such as JMS, SOAP, HTTP, TCP, XMPP,
SMTP, file, etc.
Much of the 'magic' in Mule is it's ability to communicate to disparate systems without your business
logic (UMO components) ever needing to know about system location, format of the data, the delivery
mechanism or protocols involved. Likewise when the UMO component has done its work, it need not
worry about where the data is going next or in what format the data is expected.
Cannot resolve external resource into attachment. Mule manages all delivery of data to and from
endpoints transparently.
"Message Endpoint code is custom to both the application and the messaging system's client API. The
rest of the application knows little about message formats, messaging channels, or any of the other
details of communicating with other applications via messaging. It just knows that it has a request or
piece of data to send to another application, or is expecting those from another application. It is the
messaging endpoint code that takes that command or data, makes it into a message, and sends it on
a particular messaging channel. It is the endpoint that receives a message, extracts the contents, and
gives them to the application in a meaningful way."
Inbound Router
Inbound routers are used to control how and which events are received by a component subscribing on
a channel. Inbound routers can be used to filter, split aggregate and re-sequence events before they are
received by the UMO component.
Connector
The connector understands how to send and receive data over a particular channel. A Message receiver is
coupled with a connector to register interest in data coming from a source understood by the connector.
There is more information on connectors further on in this guide.
Transformers
Transformers are used to transform message or event payloads to and from different types. Mule does
not define a standard message format (though Mule may support standard business process definition
message types in future) Transformation provided out of the box is Type transformation, such as JMS
Message to Object and standard XML transformers. Data transformation is very subjective to the
application and Mule provides a simple yet powerful transformation framework.
There is more information on transformers further on in this guide.
Endpoint
An endpoint is really a configuration wrapper that binds a connector, endpoint URI, transformers, filters
and transactional information to provide a Channel Adapter. The provider also stores transactional
information for the provider instance. See the MULEUSER:Mule Endpointschapter that goes into more
detail about endpoints.
Cannot resolve external resource into attachment. A provider is equivalent to a Channel Adapter.
Outbound Router
Outbound routers are used to publish messages/events to different providers depending on different
aspects of events or other rules defined in configuration.
Mule Manager
Core to Mule is the MuleManager. It manages the configuration of all core services for the Model and the
components it manages. Below is an overview of the core components that comprise a Mule manager.
Cannot resolve external resource into attachment.
The following sections go in to more detail for each of these elements in Mule.
The Model
The model encapsulates and manages the runtime behavior of a Mule Server instance. It is responsible
for maintaining the UMO's instances and their configuration. The Model has 3 control mechanisms to
determine how Mule interacts with it's UMO components -
1. Checks to see if the component implements the Callable life cycle interface, in which case, the
onCall(UMOEventContext) method will be used to receive the event.
2. If the component has a transformer configured for it, the return type for the transformer will
be matched against methods on the component to see if there is a method that accepts the
transformer return type. If so this event will be used. Note if there is more than one match, an
exception will be thrown.
3. If there is a method on the component that accepts an org.mule.umo.UMOEventContext . If so this
event will be used. Note if there is more than one match, an exception will be thrown.
4. The last check determines if there are any methods on the component that accept a java.util.Event .
If so this event will be used. Note if there is more than one match, an exception will be thrown.
5. If none of the above find a match an exception will be thrown and the component registration will
fail.
Of course there are many scenarios where the DynamicEntryPointResolver is suitable. For
example, if you are migrating from another framework you may want to restrict (such
as org.mule.model.CallableEntryPointResolver that only accepts components that extend
org.mule.umo.lifecycle.Callable ) or change the way the entry point is resolved. To implement a custom
Entry Point Resolver the org.mule.model.EntryPointResolver must be implemented.
Lifecycle Adapter
Defined by the org.mule.umo.lifecycle.UMOLifecycleAdapter interface, the lifecycle adapter is responsible
for mapping the mule component lifecycle to the underlying component. The DefaultLifecycleAdapter
simply delegates life cycle events to the component where the component implements zero or more UMO
lifecycle interfaces.
Transport Providers
A transport provider is a Mule plug-in that enables Mule components to send and receive information over
a particular protocol, repository messaging or other technology. The following describes the architecture
of a transport provider. Cannot resolve external resource into attachment.
Connectors
The connector provides the implementation for connecting to the external system. The connector is
responsible for sending data to the external receiver and managing the listener on the connector to
receive data from the external system. For example, the Http connector creates a Http Connection and
sends the payload over the connection and will return a UMOEvent with the return status (if running
synchronously). Receivers for the Http connector are simply objects that get notified when something is
received on the Http server port.
Connectors are responsible for managing sessions for the underlying technology, i.e. the JmsConnector
provides a JMS Session for the Connectors' Message Receiver and one also for the Message Dispatcher to
publish or send events over Jms.
Endpoints Address
An endpoint address defines any form of destination or source of data and is always expressed as URI.
Examples of endpoints could be -
Endpoint addresses are always expressed as valid URIs with the protocol of the connector then resource
specific information.
Mule Transport providers have pluggable endpoint builders that allow developers to customize the way an
endpoint is read by Mule.
Endpoint Resolution
This section describes the process Mule uses to resolve an endpointUri. For this example we will use the
following URI 'jms://topic:myTopic?durable=true'. This a JMS URI to a durable topic.
Message Receivers
Message receivers or message listeners are responsible for receiving data from the external system.
It is the responsibility of the connector to manage the registering and unregistering of receivers. The
complexity of the message receiver will vary depending on the external system being used. For example,
the message receiver for the JMS provider simply implements the javax.jms.MessageListener and the JMS
connector registers the listener with its JMS connection. However, the Http message receiver implements
an Http server that listens on a specified port for incoming requests.
Message Adapters
Message adapters are required to read disparate data objects in the format they are received from
the external application in a common way. The UMOMessageAdapter interface specifies a small set of
methods needed to read the payload and properties of any Java object. Message Adapters are specific to
a connector; when a connector is written a Message Adapter is also needed to read or translate data from
a particular data type used by the connector into either a byte array or string.
In order for Mule to treat all transactions the same way there is a small API that transacted enabled
providers must define -
Container Contexts
The component resolver is the gateway to using an external container framework to manage the
instantiation and configuration of UMO components or their dependent objects. Mule doesn't provide
it's own component container as there is a wealth of very good IoC containers that are tried and tested.
Instead Mule provides some default Component Resolvers for popular containers -
• Spring Component Resolver - see the Spring Framework. For more information about Mule / Spring
integration see the MULEUSER:Spring chapter of the user guide.
• Pico Component Resolver - see the PicoContainer.
To use a component from an external container as your UMO component simply configure the desired
ComponentResolver on the model and when defining the mule-descriptor in the configuration file , set the
implementation attribute to the component key (or class in the case of picocontainer) in the container.
If the configuration does not specify a Component Resolver the MuleComponentResolver is used.
This implementation expects a class name to instantiate instead of a component key to resolve the
component with. It behaves in the same way as real implementations except it does not support looking
up components from a container.
UMO Components
Central to the architecture of Mule are single autonomous components that can interact without being
bounded by the source, transport or delivery of data. These components are called UMO Components
and can be arranged to work with one another in various ways. These components can be configured
to accept data a number of different sources and can send data back to these sources. Cannot resolve
external resource into attachment.
The 'UMO Impl' specified above actually refers to an Object. This object can be anything, a JavaBean
or component from another framework. This is your client code that actually does something with the
events received. Mule does not place any restrictions on your object except that if configured by the Mule
directly, it must have a default constructor (if configured via Spring or Pico, Mule imposes no conventions
on the objects it manages).
Obviously, with this sort of flexibility, Mule needs to know a bit more about your object. It is the job of the
outer two layers shown to control how events are utilized by your Object.
Mule defines a default lifecycle for the components it manages. The components can participate in none,
any or all of these lifecycle events by implementing the required lifecycle interfaces. The lifecycle is as
follows - Cannot resolve external resource into attachment.
Components managed by Mule do not need to follow the Mule defined lifecycle. Using the
DefaultLifecycleAdapter a component can implement any of the lifecycle interfaces -
These lifecycle interfaces also apply to Connectors, Agenets and Interceptors. For example the
LifecycleInterceptor implements the Startable, Stoppable and Disposable interfaces to manage it's
lifecycle.
Transformers
Transformers are used to convert source data to an object type required by the UMO Component.
Transformers can be configured on Endpoints that receive data to ensure that the expected object
type is always received by an UMO Component. Transformers configured on an Outbound endpoint
ensure that the endpoint receives the the correct object type before dispatching the event. Multiple
transformers can be chained together to allow for finer grained transformer implementations that
are easier to reuse. To configure an Endpoint to use more than one transformer, just specify a space
separated list of transformers in the config file or programmatically chain the transformers together using
the setTransformer() method on the transformer.
For example an inbound transformer may look like -
Entrypoint Resolvers
Also (not shown on this digram) is the EntryPointResolver. This is used by the Model when the
UMOComponent is registered to find the method to call on your object when an event is received for it.
If a method is not found an exception will be thrown. The details of the EntryPoint resolver can be seen
here.
Events
Mule is an event-based architecture, that is, actions within a Mule network are triggered by either events
occurring in Mule or in external systems. Events always contain some sort of data, the payload, which
will be used and/or manipulated by one or more components and a set of properties that are associated
to the processing of the event. These properties are arbitrary and can be set at any time from when the
Event Processing
Mule can send and receive events using 3 processing models -
1. Asynchronously - Many events can be processed by the same component at a time in different
threads. When the Mule server is running asynchronously instances of a component run in different
threads all accepting incoming events, though the event will only be processed by one instance of
the component.
2. Synchronously - When a UMO Component receives an event in this mode the the whole request is
executed in a single thread
3. Request-Response - This allows for a UMO Component to make a specific request for an event and
wait for a specified time to get a response back.
You can control the synchronicity of event processing by setting the synchronous property on the
endpoint (or programmatically on the event). Synchronicity of the call can be propagated across the
network where the transports being used support a reply channel. For example, a synchronous JMS
request will establish a temporary reply queue when a request is made and will wait for a response on
that queue. The same applies to socket based transports.
The actual event flow is governed by the synchronous property, whether the endpoint is inbound or
outbound and if there is a transaction in progress. The following rules apply.
Asynchronous event processing occurs when the inbound endpoint synchronous flag is set to false.
In this scenario the message is dispatched to a queue and is consumed by a worker thread in a pool that
actually does the execution work of your UMOComponent. The outbound endpoint is also asynchronous
the resulting message will be dispatched by a dispatcher thread.
In this scenario the message is dispatched to a queue and is consumed by a worker thread in a pool
that actually does the execution work of you UMOComponent. The outbound endpoint is synchronous
so the dispatch happens in the same thread as component execution. This scenario is used by outbound
transactions so that all dispatches from the component occur in the same thread. This behavior is
handled automatically by Mule.
Synchronous Processing
An event is received and processed by your UMOComponent in the same thread and any result is
returned from your UMO component will be passed back to the receiver where if there is a response
channel, i.e Socket outputstream a result will be sent.
Transactions can only (currently) be managed over synchronous endpoints. Thus if an endpoint has been
configured for transactions it will automatically be synchronous. When dispatching and a transaction is in
progress the dispatch will also happen in the current thread.
Message Routers
Message routers are used to control how events are sent and received by components in the system.
Mule defines Inbound routers that apply to events as they are received and outbound routers that are
invoked when an event is being dispatched.
Cannot resolve external resource into attachment. Mule provides extensible routers to control how
messages are dispatched.
"a Message Router ... consumes a Message from one Message Channel and republishes it to a different
Message Channel channel depending on a set of conditions."
Inbound Routers
Inbound routers can be used to control and manipulate events received by a component. Typically, an
inbound router can be used to filter incoming event, aggregate a set of incoming events or re-sequence
events when they are received. You can chain inbound routers together, in this scenario each router is
matched before the event is dispatched to a Mule component. Inbound routers are different to outbound
routers in that the provider is already known so the purpose of the router is to control how messages are
sent via the provider. You can specify a catch-all strategy which will be invoked if any of the routers do
not accept the current event. An Inbound Router can be configured on a mule-descriptor element in the
mule-config.xml -
<inbound-router>
<catch-all-strategy
className="org.mule.tck.testmodels.mule.TestCatchAllStrategy"/>
<router className="org.mule.routing.inbound.SelectiveConsumer">
<filter expectedType="java.lang.String"
className="org.mule.routing.filters.PayloadTypeFilter"/>
</router>
<router className="org.mule.routing.inbound.Aggregator">
</router>
</inbound-router>
If there are no special processing requirements for messages received by a component there is no need
to configure an inbound router.
Outbound Routers
Outbound routers are used to control which providers are used to send events once an UMO component
has finished processing. Message Routers are configured on UMOCompnent and allow the developer to
define multiple routing constraints for any given Event. You can specify a catch-all strategy which will be
<outbound-router>
<catch-all-strategy className="org.mulerouting.ForwardingCatchAllStrategy"
provider="catchAll"/>
<router providers="TestApple-Out"
className="org.mule.routing.outbound.FilteringOutboundRouter">
<filter expectedType="java.lang.String"
className="org.mule.routing.filters.PayloadTypeFilter"/>
</router>
<router providers="waterMelonProvider"
className="org.mule.routing.outbound.FilteringOutboundRouter">
<filter className="org.mule.routing.filters.logic.AndFilter">
<left-filter pattern="the quick brown (.*)"
className="org.mule.routing.filters.RegExFilter"/>
<right-filter pattern="(.*) brown (.*)"
className="org.mule.routing.filters.RegExFilter"/>
</filter>
</router>
</outbound-router>
The catch all strategy receives the event if none of the router accept the event. Custom strategies must
implement org.mule.umo.routing.UMORoutingCatchAllStrategy which defines a method -
Note that this a void method, so that no return event can be passed back to the calling code. This is
important when running synchronously as the synchronous chain of events is broken. It is considered an
error condition when a catch-all strategy is invoked.
Routers
In the example, there are 2 routers defined, with the outbound-router element as the parent. This means
that each router will be checked in order to see if the current event can be routed.
It is not recommended to use transacted providers in router configurations. As routing of the event is
determined at run-time, there are situations where an event within a transaction is routed to a non-
transacted provider, thus orphaning the current transaction causing 'surprise' transaction timeouts. For
transacted providers it is recommended that you configure one inbound and one outbound transacted
provider for the event path.
In situations where only one outbound provider is configured for an UMO component it is not necessary to
define a Message router.
For more information about using the routers that ship with Mule, see the MULEUSER:Message Routers
chapter of the MULEUSER:Home.
Interceptors
Mule interceptors are useful for attaching common behavior to multiple UMOs. The Interceptor or
Command pattern is often referred to as practical AOP (Aspect Oriented Programming) as it allows
the developer to intercept processing on an object and potentially alter the processing and outcome.
Interceptors a very useful for attaching profiling, permission and security checks, etc, to a component in
Mule.
1. org.mule.interceptors.EnvelopeInterceptor - Envelope filter that will execute before and after the
event is processed. Good for Logging and profiling.
The following shows a typical interceptor stack and the event flow. Cannot resolve external resource into
attachment.
Exception Management
Exception strategies can be defined on UMOComponents, but sometimes it's sufficient to have all
components managed by the the model tp use the same exception strategy. By defining the exception
strategy on the model, it is not necessary to define individual exception strategies (by default if no
exception strategy is defined on a UMO Component the org.mule.impl.DefaultExceptionStrategy will be
used).
MULE_SERVICE_METHOD
Mule's entry point resolver class (based upon org.mule.umo.model.UMOEntryPointResolver) works
its way through its priority scheme to be able to figure out what entry point to use. This allows Mule
to dynamically use a different entry point depending on the payload of the inbound message. Other
entry point resolver classes can also be used if the DynamicEntryPointResolver is not sufficient for
your needs. The only drawback to the default mechanism is the fact that if two methods have the
same type of parameters, Mule obviously cannot decide which of the methods to use and raises a
TooManySatisfiableMethods exception. In such cases, you can easily implement the Callable interface in
your component and direct the message to the correct method.
However, this is not always a feasible solution; perhaps you do not have access to the source code of
your service component or perhaps you do not want to make your component "Mule-aware". The work
around to this would be to have a wrapper component that can direct the message for you but this just
adds another level of abstraction that you may not want either. Besides, this is all routing logic so why
should we put this into a service component?
Let us illustrate this with a simple example - If we have two components called "A" and "B" that
communicate synchronously using the VM channel called "vm://Communication". Let us assume that "A"
is the producer of string messages and "B" consumes these messages. However, "B" has more than one
method that accepts strings.
What we need is a routing mechanism that allows us to select which method to use. We need to be able
to specify a number of methods within our configuration that can be used directly and therefore bypass
the entry point resolver logic. What we really need is the ability to specify a different endpoint for each
of the methods; i.e, to be able to route along a particular channel but control which part of the consumer
will actually be invoked. Mule has such a property for the endpoints - the MULE_SERVICE_METHOD
property that needs to be configured on both the inbound and outbound endpoints. Component "A" would
have the following outbound router configured:
<outbound-router>
<router className="org.mule.routing.outbound.OutboundPassThroughRouter">
<endpoint address="vm://Communication?method=Method1"/>
</router>
</outbound-router>
Here, the endpoint is defined as it usually is but has a "method" property which we have set to
"Method1". We therefore want the result of this service component to be sent along the VM channel
called "Communication" and passed along to the method called "Method1" Component "B" would have the
following inbound router configured:
Note that the configuration of the inbound router and the inbound endpoint is the same as it usually
is. The difference is the addition of the properties on the Mule descriptor. We can therefore route a
message along a channel for a specific method as long as the methods are defined as properties on the
mule-descriptor. This allows us to bypass the entry point resolver logic and control which method to
invoke in case of multiple methods having the same parameters.
Pitfalls
Here, the Mule configuration is tightly coupled with the implementation of your component. If
the component changes and the methods are renamed, you will need to adjust your configuration
accordingly.
Restrictions
This will only work on synchronous paradigms. This will currently not work if your processing is
asynchronous due to an issue with threading.
Filtering
Of course, we still need to figure out what criteria to look out for before routing using this mechanism. If
"B" has any number of methods, we still need to figure out which method is the correct one for each
message. If we take a simple content based example, the criteria would be contained within the payload
itself. In such a situation, the Mule configuration would look like this: