远程Step数据处理的示意图
消息队列和AMQ服务器的配置
<!--定义消息网关 defaultChannel为默认发送的消息队列名称 -->
<bean:bean id="messagingGateway" class="org.springframework.integration.core.MessagingTemplate">
<bean:property name="defaultChannel" ref="requests" />
<bean:property name="receiveTimeout" value="1000" />
</bean:bean>
<!--定义requests的adapter-->
<int-jms:outbound-channel-adapter connection-factory="connectionFactory" channel="requests"
destination-name="requests" />
<!--定义使用的channel requests 和 incoming -->
<int:channel id="requests" />
<int:channel id="incoming" />
<!--定义消息转换器 从incoming获取消息,写消息到replies-->
<int:transformer input-channel="incoming" output-channel="replies"
ref="headerExtractor" method="extract" />
<!--定义响应的channel-->
<int:channel id="replies" scope="thread">
<int:queue /> <!--定义replies是一个队列标识-->
<int:interceptors> <!--定义一个拦截器 把replies的信息发送到incoming队列上 -->
<!-- MessageSourcePollerInterceptor-->
<bean:bean id="pollerInterceptor"
class="org.springframework.batch.integration.chunk.MessageSourcePollerInterceptor">
<bean:property name="messageSource"><!--replies-->
<bean:bean class="org.springframework.integration.jms.JmsDestinationPollingSource">
<bean:constructor-arg>
<bean:bean class="org.springframework.jms.core.JmsTemplate">
<bean:property name="connectionFactory" ref="connectionFactory" />
<bean:property name="defaultDestinationName" value="replies" />
<bean:property name="receiveTimeout" value="100" />
</bean:bean>
</bean:constructor-arg>
</bean:bean>
</bean:property>
<bean:property name="channel" ref="incoming"/>
</bean:bean>
</int:interceptors>
</int:channel>
<!--jmsTemplate基本配置-->
<bean:bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<bean:property name="connectionFactory" ref="connectionFactory" />
<bean:property name="receiveTimeout" value="100" />
<bean:property name="sessionTransacted" value="true" />
</bean:bean>
<!--定义了jms服务器-->
<amq:broker useJmx="false" persistent="false" schedulerSupport="false">
<amq:transportConnectors>
<amq:transportConnector uri="tcp://localhost:61616"/>
</amq:transportConnectors>
</amq:broker>
<amq:connectionFactory id="connectionFactory" brokerURL="tcp://localhost:61616"/>
配置本地的step(使用RemoteChunkHandlerFactoryBean)
<!-- 定义chunkWriter,chunkWriter负责将本地Step中读取数据通过messagingGateway发送到远程Step中,ChunkMessageChannelItemWriter是一个StepExecutionListener类型的拦截器-->
<bean:bean id="chunkWriter" scope="step"
class="org.springframework.batch.integration.chunk.ChunkMessageChannelItemWriter" >
<bean:property name="messagingOperations" ref="messagingGateway" />
<bean:property name="replyChannel" ref="replies" />
<bean:property name="maxWaitTimeouts" value="10" />
</bean:bean>
<!-- 定义chunkHandler,stepRemoteChunk 对应默认的 chunkProcessor-->
<bean:bean id="chunkHandler" class="org.springframework.batch.integration.chunk.RemoteChunkHandlerFactoryBean">
<bean:property name="chunkWriter" ref="chunkWriter" />
<bean:property name="step" ref="stepRemoteChunk" />
</bean:bean>
配置本地的step(使用ChunkProcessorChunkHandler,仅chunkHandler部分)
<bean:bean id="chunkHandler"
class="org.springframework.batch.integration.chunk.ChunkProcessorChunkHandler">
<bean:property name="chunkProcessor">
<bean:bean class="org.springframework.batch.core.step.item.SimpleChunkProcessor">
<bean:property name="itemWriter" ref="jdbcItemWriter"/>
<bean:property name="itemProcessor">
<bean:bean class="org.springframework.batch.item.support.PassThroughItemProcessor"/>
</bean:property>
</bean:bean>
</bean:property>
</bean:bean>
配置远程step
<!-- 设置监听器,监听队列requests,处理执行chunkHandler的handleChunk,结果返回到replies-->
<jms:listener-container connection-factory="connectionFactory"
transaction-manager="transactionManager"
acknowledge="transacted" concurrency="1">
<jms:listener destination="requests" response-destination="replies"
ref="chunkHandler" method="handleChunk" />
</jms:listener-container>
远程job配置
<!-- 配置和普通job没有区别 reader:jdbcItemPageReader writer:jdbcItemWriter-->
<job id="remoteChunkJob">
<step id="stepRemoteChunk">
<tasklet>
<chunk reader="jdbcItemPageReader" writer="jdbcItemWriter" commit-interval="10" />
</tasklet>
</step>
</job>
读取数据库配置
<!-- 从db分页读数据 -->
<bean:bean id="jdbcItemPageReader" scope="step"
class="org.springframework.batch.item.database.JdbcPagingItemReader">
<bean:property name="dataSource" ref="dataSource"/>
<bean:property name="queryProvider" ref="refQueryProvider" />
<bean:property name="pageSize" value="2"/>
<bean:property name="rowMapper" ref="custCreditRowMapper"/>
</bean:bean>
<bean:bean id="refQueryProvider" scope="step"
class="org.springframework.batch.item.database.support.SqlPagingQueryProviderFactoryBean">
<bean:property name="dataSource" ref="dataSource"/>
<bean:property name="selectClause" value="select ID,ACCOUNTID,NAME,AMOUNT,DATE,ADDRESS"/>
<bean:property name="fromClause" value="from t_credit"/>
<bean:property name="whereClause" value="where ID between 1 and 15"/>
<bean:property name="sortKey" value="ID"/>
</bean:bean>
<bean:bean id="custCreditRowMapper"
class="com.juxtapose.example.ch11.partition.db.CreditBillRowMapper"/>
写数据库配置
<bean:bean id="jdbcItemWriter"
class="org.springframework.batch.item.database.JdbcBatchItemWriter">
<bean:property name="dataSource" ref="dataSource"/>
<bean:property name="sql" value="insert into t_destcredit (ID,ACCOUNTID,NAME,AMOUNT,DATE,ADDRESS) values (:id,:accountID,:name,:amount,:date,:address)"/>
<bean:property name="itemSqlParameterSourceProvider">
<bean:bean class="org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider"/>
</bean:property>
</bean:bean>