Spring XD ships with many source modules including HTTP/REST, TCP, and various messaging systems such as JMS and RabbitMQ. However, advanced users may encounter the need to create custom source modules. This template project provides a starting point to create custom source modules.
Source modules in Spring XD are defined as Spring Integration output adapters.
Therefore, the creation of a custom
module requires the wiring of a Spring Integration adapter and placing it in the
$XD_HOME/xd/modules/source
directory.
The first place to start is the build.gradle
file that ships with this project.
Other than setting dependencies, this build file contains a target called xdModule
.
This will create a build/modules/source/sample
directory which contains
the module artifacts. This directory should be moved/copied/sym-linked to
the $XD_HOME/xd/modules/source
directory when the module is ready for use.
The following sections of the Gradle build file should be customized for your project:
On line 1, change description
to match your module's description:
description = 'Spring XD Template Module' // TODO: Change this to match your module
On line 17, modify moduleName
to match the name of your module:
moduleName = 'template' // TODO: change this to match the name of your module
On line 49, add any project dependencies, if any.
The Java class ModuleTemplate
extends from a convenient super class MessageProducerSupport
which provides the ability to send messages as well as lifecycle hooks. Here are
the key highlights:
doStart
anddoStop
methods- dedicated thread for creating source output
sendMessage
is invoked when the module has output- the optional use of
Tuple
Rename the class to match the name of your module.
On line 46, change "source-template"
to match the desired name of your module's
execution thread.
Rename the Runnable
class on line 62 to match the desired name of your module's
Runnable
class.
Modify the run
method starting at line 65 to perform your module's output routine.
Note that sendMessage
must be invoked in order for your module's output to
be sent to the channel.
The module XML file consists of:
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/integration"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd">
<channel id="output"/>
<beans:bean class="hello.Sample">
<beans:property name="autoStartup" value="false" />
<beans:property name="outputChannel" ref="output" />
</beans:bean>
</beans:beans>
The <channel id="output"/>
element is defining the output channel
for this module. This is followed by a bean definition for the class
hello.Sample
which accepts the channel as property "outputChannel".
The "autoStartup" property is set to "false" to ensure that the module
is initialized when the channels are established.
Rename the template
directory in modules/source/template/config
and
the template.xml
file in this directory to match the name of your module.
On line 11, change "hello.ModuleTemplate"
to match the name of your
module class.