ServiceMix XMPP

The ServiceMix XMPP component provides support for receiving and sending XMPP messages via the bus.

Maven Archetype

You can use Maven to create a XMPP service unit:

mvn archetype:create \
    -DarchetypeGroupId=org.apache.servicemix.tooling \
    -DarchetypeArtifactId=servicemix-xmpp-service-unit \
    -DarchetypeVersion=2010.01 \
    -DgroupId=com.mycompany.myproduct \
    -DartifactId=mycomponent.artifact \
    -Dversion=1.0-SNAPSHOT

Once you've customized the service unit, simply install the SU:

mvn install
Remember that to be deployable in ServiceMix, the ServiceUnit has to be embedded in a Service Assembly: only the Service Assembly zip file can be deployed in ServiceMix.
To add your SU in a SA, you need to define it in the dependency sets:
<dependency>
  <groupId>your.group.id</groupId>
  <artifactId>your.artifact.id</artifactId>
  <version>your-version</version>
</dependency>

Endpoints Configuation

Receiver Endpoint (Consumer)

The receiver endpoint connects to the XMPP server and waiting for incoming XMPP messages.
When it receives a XMPP message, it converts it to JBI message (using the marshaler) and send to the NMR.

Message Exchange Pattern
The receiver endpoint will only generate InOnly exchanges.
XMPP Receiver (consumer) Endpoint (General)
<xmpp:receiver service="test:myJabberService"
               endpoint="receiverEndpoint"
               targetService="test:myJabberProcessor"
               host="my.jabberserver.lan"
               port="5222"
               user="lhein"
               password="myPassword"
               createAccount="false"  />
XMPP Receiver (consumer) Endpoint (Chat Room Listener)
<xmpp:receiver service="test:myJabberService"
               endpoint="receiverEndpoint"
               targetService="test:myJabberProcessor"
               host="my.jabberserver.lan"
               port="5222"
               user="lhein"
               password="myPassword"
               createAccount="false"  
               room="smxchat@conference.my.jabberserver.lan"/>
XMPP Receiver Endpoint Attributes
Name Type Description Default
host string sets the host name or ip adress of the XMPP server null (must be spec'd)
port int the port number of the XMPP service 5222
user String the user name of the XMPP account null (must be spec'd)
password String the password of the XMPP account null (must be spec'd)
resource String the name of the resource / client null
room String full room name (for example area51@conference.myserver.com) or null null (means no room)
proxyHost String the hostname of the proxy to use null
proxyPort String the port of the proxy to use 3128
proxyUser String the user name for the proxy to use null
proxyPass String the user password for the proxy to use null
proxyType String the proxy type to use (NONE, HTTP, SOCKS4, SOCKS5) null
login boolean a flag if the user should login to the XMPP account true
createAccount boolean a flag if an account should be created for unknown users false
filter class a class which implements org.jivesoftware.smack.filter.PacketFilter null
marshaler class a marshaler class which converts XMPP to NMSG DefaultXMPPMarshaler

Sender Endpoint (Provider)

The XMPP Sender endpoint expects messages coming from the NMR, converts it into a XMPP message (using the marshaler) and send to the XMPP server.

XMPP Sender (Provider) Endpoint (Single User Chat)
<xmpp:sender service="test:myJabberService" 
             endpoint="senderEndpoint"
             host="my.jabberserver.lan"
             port="5222"
             user="lhein"
             password="myPassword"
             createAccount="false" 
             participant="gertv@my.jabberserver.lan" /> 
XMPP Sender (Provider) Endpoint (Multi User Chat Room)
<xmpp:sender service="test:myJabberService" 
             endpoint="senderEndpoint"
             host="my.jabberserver.lan"
             port="5222"
             user="lhein"
             password="myPassword"
             createAccount="false" 
             room="smxchat@conference.my.jabberserver.lan" /> 
XMPP Sender Endpoint Attributes
Name Type Description Default
host string sets the host name or ip adress of the XMPP server null (must be spec'd)
port int the port number of the XMPP service 5222
user String the user name of the XMPP account null (must be spec'd)
password String the password of the XMPP account null (must be spec'd)
resource String the name of the resource / client null
participant String the name of the person to chat with (if you specify this, leave room null) null
room String full room name (if you specify this, leave participant null) null
proxyHost String the hostname of the proxy to use null
proxyPort String the port of the proxy to use 3128
proxyUser String the user name for the proxy to use null
proxyPass String the user password for the proxy to use null
proxyType String the proxy type to use (NONE, HTTP, SOCKS4, SOCKS5) null
login boolean a flag if the user should login to the XMPP account true
createAccount boolean a flag if an account should be created for unknown users false
marshaler class a marshaler class which converts XMPP to NMSG DefaultXMPPMarshaler

Cookbook recipes

Marshalers

You can write your own marshalers for conversion between XMPP and normalized message and vice versa.
To do this you simply need to subclass the org.apache.servicemix.xmpp.marshaler.impl.DefaultXMPPMarshaler or start from scratch
by implementing the org.apache.servicemix.xmpp.marshaler.XMPPMarshalerSupport interface.

The marshaler interface methods

For providing your own marshaler you only need to implement two methods:

toJBI(...)

This method is responsible for translating a received XMPP message into a jbi compliant normalized message ready to be sent to the bus.

fromJBI(...)

This method is responsible for translating a received normalized message into a XMPP message ready to be sent to the mail server.

After finishing your marshaler you can simply configure your endpoints to use it:

Marshaler example
<xmpp:receiver service="test:myJabberService"
               endpoint="receiverEndpoint"
               targetService="test:myJabberProcessor"
               host="my.jabberserver.lan"
               port="5222"
               user="lhein"
               password="myPassword"
               createAccount="false"  
               room="smxchat@conference.my.jabberserver.lan" >

    <property name="marshaler">
        <bean class="com.mycompany.MyXMPPMarshaler" />
    </property>

</xmpp:receiver>

Links