Hi all,
I'm using the remote chunking strategy and I don't want the master node to process items. Instead, I want it to only execute the query and the slaves take care of processing. How can I achieve this?
With my current configuration the master is not only executing the query, but it is processing items as well.
This is my configuration:
masterBatchContext.xml
masterIntegrationContext.xml (JMS config for master)Code:<?xml version="1.0" encoding="UTF-8"?> <import resource="classpath:masterIntegrationContext.xml" /> <!-- DS config --> <context:property-placeholder location="classpath:jdbc.properties" ignore-unresolvable="true" /> <bean id="subscriptionDS" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.url}" p:username="${jdbc.username}" p:password="${jdbc.password}" /> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="subscriptionDS" /> <property name="configLocation"> <value>classpath:hibernate.cfg.xml</value> </property> <property name="hibernateProperties"> <props> ... </props> </property> </bean> <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" /> <bean class="org.springframework.orm.hibernate4.HibernateExceptionTranslator" /> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- Spring Batch Job Registry --> <bean id="jobRegistry" class="org.springframework.batch.core.configuration.support.MapJobRegistry" /> <!-- Spring Batch Job Launcher --> <bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher"> <property name="jobRepository" ref="jobRepository" /> </bean> <!-- Spring Batch Job Repository --> <bean id="jobRepository" class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean" p:dataSource-ref="subscriptionDS" p:transactionManager-ref="transactionManager" /> <!-- Spring Batch Job Registry Processor --> <bean class="org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor"> <property name="jobRegistry" ref="jobRegistry" /> </bean> <!-- Spring Batch Subscriptions Reader --> <bean id="subscriptionPageReader" class="org.springframework.batch.item.database.JdbcPagingItemReader" scope="step"> <property name="dataSource" ref="subscriptionDS" /> <property name="queryProvider"> <bean class="org.springframework.batch.item.database.support.SqlServerPagingQueryProvider"> <property name="selectClause" value="..." /> <property name="fromClause" value="..." /> <property name="whereClause" value="..." /> <property name="sortKey" value="id" /> </bean> </property> <property name="pageSize" value="1000" /> <property name="rowMapper" ref="subscriptionRowMapper" /> </bean> <bean id="subscriptionRowMapper" class="com.m4u.subscription.core.batch.reader.SubscriptionRowMapper" /> <!-- Spring Batch Subscriptions Processor --> <bean id="subscriptionProcessor" class="com.m4u.subscription.core.batch.processor.SubscriptionProcessor"> <property name="client" ref="subscriptionClient"/> </bean> <!-- Spring Batch Subscriptions Writer --> <bean id="subscriptionWriter" class="com.m4u.subscription.core.batch.writer.SubscriptionWriter" /> <!-- Spring Batch Job [Subscription Renew Job] --> <job id="sBatchRenewJob" xmlns="http://www.springframework.org/schema/batch"> <step id="subscriptionsLoad"> <tasklet> <chunk reader="subscriptionPageReader" processor="subscriptionProcessor" writer="subscriptionWriter" commit-interval="50" /> </tasklet> </step> </job> <!-- Remote Chuncking Config --> <bean id="chunkHandler" class="org.springframework.batch.integration.chunk.RemoteChunkHandlerFactoryBean"> <property name="chunkWriter" ref="chunkWriter" /> <property name="step" ref="subscriptionsLoad" /> </bean> <bean id="chunkWriter" class="org.springframework.batch.integration.chunk.ChunkMessageChannelItemWriter" scope="step"> <property name="messagingOperations" ref="messagingGateway" /> <property name="replyChannel" ref="subscriptionReplies" /> <property name="maxWaitTimeouts" value="1000" /> </bean> </beans>
slaveBatchContext.xmlCode:<?xml version="1.0" encoding="UTF-8"?> <import resource="classpath:/jms-context.xml" /> <bean id="messagingGateway" class="org.springframework.integration.core.MessagingTemplate"> <property name="defaultChannel" ref="subscriptionRequests" /> <property name="receiveTimeout" value="1000" /> </bean> <int:channel id="subscriptionRequests" /> <int:channel id="incoming" /> <int-jms:outbound-channel-adapter channel="subscriptionRequests" connection-factory="connectionFactory" destination-name="subscriptionRequests" /> <int:transformer input-channel="incoming" output-channel="subscriptionReplies" ref="headerExtractor" method="extract" /> <bean id="headerExtractor" class="org.springframework.batch.integration.chunk.JmsRedeliveredExtractor" /> <int:channel id="subscriptionReplies"> <int:queue /> <int:interceptors> <bean id="pollerInterceptor" class="org.springframework.batch.integration.chunk.MessageSourcePollerInterceptor"> <property name="messageSource"> <bean class="org.springframework.integration.jms.JmsDestinationPollingSource"> <constructor-arg> <ref bean="jmsTemplate" /> </constructor-arg> </bean> </property> <property name="channel" ref="incoming" /> </bean> </int:interceptors> </int:channel> </beans>
slaveIntegrationContext.xml (JMS config for slave)Code:<?xml version="1.0" encoding="UTF-8"?> <import resource="classpath:/slaveIntegrationContext.xml" /> <bean id="chunkHandler" class="org.springframework.batch.integration.chunk.ChunkProcessorChunkHandler"> <property name="chunkProcessor"> <bean class="org.springframework.batch.core.step.item.SimpleChunkProcessor"> <property name="itemWriter" ref="writer" /> <property name="itemProcessor" ref="processor" /> </bean> </property> </bean> <bean id="writer" class="com.m4u.subscription.core.batch.writer.SubscriptionWriter" /> <bean id="processor" class="com.m4u.subscription.core.batch.processor.SubscriptionProcessor"> <property name="client" ref="subscriptionClient"/> </bean> </beans>
jms-context.xml (JMS config that is common to both master and slaves)Code:<?xml version="1.0" encoding="UTF-8"?> <beans:import resource="classpath:/jms-context.xml" /> <channel id="subscriptionRequests"> <interceptors> <wire-tap channel="logChannel" /> </interceptors> </channel> <channel id="subscriptionReplies"> <queue /> <interceptors> <wire-tap channel="logChannel" /> </interceptors> </channel> <logging-channel-adapter auto-startup="true" id="logChannel" level="DEBUG" /> <beans:bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" /> <jms:listener-container connection-factory="connectionFactory" transaction-manager="transactionManager" acknowledge="transacted"> <jms:listener destination="subscriptionRequests" response-destination="subscriptionReplies" ref="chunkHandler" method="handleChunk" /> </jms:listener-container> </beans:beans>
Thanks in advance.Code:<?xml version="1.0" encoding="UTF-8"?> <context:property-placeholder location="classpath:subscriptionbatch.properties" ignore-unresolvable="true"/> <bean id="connectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop"> <property name="connectionFactory"> <bean class="org.apache.activemq.ActiveMQConnectionFactory"> <property name="brokerURL" value="failover:(${activemq.url})?randomize=false" /> </bean> </property> </bean> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory" ref="connectionFactory" /> <property name="defaultDestinationName" value="subscriptionReplies" /> <property name="receiveTimeout" value="100" /> <property name="sessionTransacted" value="true" /> </bean> <jms:listener-container connection-factory="connectionFactory" transaction-manager="transactionManager" acknowledge="transacted"> <jms:listener destination="subscriptionRequests" response-destination="subscriptionReplies" ref="chunkHandler" method="handleChunk" /> </jms:listener-container> <bean id="subscriptionClient" class="com.m4u.subscription.core.jaxrs.client.SubscriptionJAXRSClient"> <constructor-arg type="java.lang.String" value="${subscription.server.url}" /> </bean> </beans>


Reply With Quote
