JmsItemReader and JmsItemWriter
jberet-support module includes jmsItemReader and jmsItemWriter to handle JMS messages. jmsItemReader reads and binds data to instances of custom POJO bean provided by the batch application.
jmsItemReader and jmsItemWriter invokes standard JMS API (1.1 or later) for reading and writing JMS messages. Any compliant JMS implementation (e.g., HornetQ) can be used as the MQ provider. The following dependencies are required:
<dependency>
<groupId>org.jboss.spec.javax.jms</groupId>
<artifactId>jboss-jms-api_2.0_spec</artifactId>
<scope>compile</scope>
</dependency>
<!-- HornetQ client-side dependencies, if HornetQ is used as the MQ provider -->
<dependency>
<groupId>org.hornetq</groupId>
<artifactId>hornetq-core-client</artifactId>
</dependency>
<dependency>
<groupId>org.hornetq</groupId>
<artifactId>hornetq-commons</artifactId>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
</dependency>
<!-- HornetQ server-side dependencies, if the applications runs embedded HornetQ server -->
<dependency>
<groupId>org.hornetq</groupId>
<artifactId>hornetq-server</artifactId>
</dependency>
<dependency>
<groupId>org.hornetq</groupId>
<artifactId>hornetq-jms-server</artifactId>
</dependency>
Batch Configuration Properties in Job XML
jmsItemReader and jmsItemWriter are configured through <reader> or <writer> batch properties in job xml, and CDI field injections into org.jberet.support.io.JmsItemReader and org.jberet.support.io.JmsItemWriter. All properties are of type String, unless noted otherwise. The following is an example job xml that references jmsItemReader and jmsItemWriter:
<job id="JmsReaderTest" xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="1.0">
<step id="JmsReaderTest.step1">
<chunk item-count="100">
<reader ref="jmsItemReader">
<properties>
<!--<property name="connectionFactoryLookupName" value="/cf"/>-->
<!--<property name="destinationLookupName" value="/queue/queue1"/>-->
<!-- wait for 2 seconds for any more messages -->
<property name="receiveTimeout" value="2000"/>
<property name="messageSelector" value=""/>
<property name="sessionMode" value="DUPS_OK_ACKNOWLEDGE"/>
</properties>
</reader>
<writer ref="csvItemWriter">
<properties>
<property name="resource" value="#{jobParameters['writeResource']}"/>
<property name="beanType" value="org.jberet.support.io.StockTrade"/>
<property name="writeMode" value="overwrite"/>
<property name="header" value="Date,Time,Open,High,Low,Close,Volume"/>
</properties>
</writer>
</chunk>
</step>
</job>
<job id="JmsWriterTest" xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="1.0">
<step id="JmsWriterTest.step1">
<chunk item-count="100">
<reader ref="csvItemReader">
<properties>
<property name="resource" value="IBM_unadjusted.txt"/>
<property name="headerless" value="true"/>
<property name="beanType" value="java.util.Map"/>
<property name="start" value="#{jobParameters['start']}"/>
<property name="end" value="#{jobParameters['end']}"/>
<property name="nameMapping" value="Date,Time,Open,High,Low,Close,Volume"/>
<!-- JMS MapMessage cannot take java.util.Date as keyed value, so leave Date as string-->
<property name="cellProcessors" value="null; null; ParseDouble; ParseDouble; ParseDouble; ParseDouble; ParseDouble"/>
</properties>
</reader>
<writer ref="jmsItemWriter">
<properties>
<!--<property name="connectionFactoryLookupName" value="/cf"/>-->
<!--<property name="destinationLookupName" value="/queue/queue1"/>-->
</properties>
</writer>
</chunk>
</step>
</job>
Batch Properties for jmsItemReader and jmsItemWriter
destinationLookupName
JNDI lookup name for the JMS Destination. Optional property and defaults to null. When specified in job xml, it has higher precedence over destinationInstance injection
connectionFactoryLookupName
JNDI lookup name for the JMS ConnectionFactory. Optional property and defaults to null. When specified in job xml, it has higher precedence over connectionFactoryInstance injection.
sessionMode
The string name of the sessionMode used to create JMS session from a JMS connection. Optional property, and defaults to null. When not specified, JMS API Connection.createSession() is invoked to create the JMS session. When this property is specified, its value must be either AUTO_ACKNOWLEDGE or DUPS_OK_ACKNOWLEDGE.
An example property in job xml:
<property name="sessionMode" value="DUPS_OK_ACKNOWLEDGE"/>
See JMS API Connection.createSession(int) for more details.
CDI Field Injections for jmsItemReader and jmsItemWriter
destinationInstance
javax.enterprise.inject.Instance<javax.jms.Destination>
This field holds an optional injection of javax.jms.Destination. When destinationLookupName property is specified in job xml, this field is ignored and destinationLookupName is used to look up JMS destination. The application may implement a javax.enterprise.inject.Produces method to satisfy this dependency injection.
connectionFactoryInstance
javax.enterprise.inject.Instance<javax.jms.ConnectionFactory>
This field holds an optional injection of javax.jms.ConnectionFactory. When connectionFactoryLookupName property is specified in job xml, this field is ignored and connectionFactoryLookupName is used to look up JMS ConnectionFactory. The application may implement a javax.enterprise.inject.Produces method to satisfy this dependency injection.
Batch Properties for jmsItemReader Only
In addition to the above common properties, jmsItemReader also supports the following batch properties in job xml:
skipBeanValidation
boolean
Indicates whether the current batch reader will invoke Bean Validation API to validate the incoming data POJO. Optional property and defaults to false, i.e., the reader will validate data POJO bean where appropriate.
receiveTimeout
long
The number of milliseconds a JMS MessageConsumer blocks until a message arrives. Optional property, and defaults to 0, which means it blocks indefinitely.
messageSelector
Only messages with properties matching the message selector expression are delivered. A value of null or an empty string indicates that there is no message selector for the message consumer. See JMS API Session.createConsumer(javax.jms.Destination, java.lang.String)
beanType
java.lang.Class
The fully-qualified class name of the data item to be returned from readItem() method. Optional property and defaults to null. If it is specified, its valid value is:
javax.jms.Message: an incoming JMS message is returned as is.
When this property is not specified, readItem() method returns an object whose actual type is determined by the incoming JMS message type.
Batch Properties for jmsItemWriter Only
None