Spring batch JMSItemReader根据区块大小重新连接到Solace

Spring batch JMSItemReader根据区块大小重新连接到Solace,spring-batch,spring-jms,solace,Spring Batch,Spring Jms,Solace,我有一个SpringBatch应用程序,它连接到Solace队列,只要队列中有消息或到达接收方超时,就会轮询记录。我使用的是基于块的处理,但我可以看到我的批处理应用程序重新连接到Solace,因为它试图处理每个块。就我的理解而言,与Solace的连接只应立即发生,SolSession应根据定义的块大小开始/结束。我的理解是否正确,或者这是预期行为 Spring批处理应用程序日志 2021-04-01 11:54:17.033 INFO 11144 --- [ main] c

我有一个SpringBatch应用程序,它连接到Solace队列,只要队列中有消息或到达接收方超时,就会轮询记录。我使用的是基于块的处理,但我可以看到我的批处理应用程序重新连接到Solace,因为它试图处理每个块。就我的理解而言,与Solace的连接只应立即发生,SolSession应根据定义的块大小开始/结束。我的理解是否正确,或者这是预期行为

Spring批处理应用程序日志

2021-04-01 11:54:17.033  INFO 11144 --- [           main] c.s.j.protocol.impl.TcpClientChannel     : Connecting to host 'orig=tcp://localhost:55555, scheme=tcp://, host=localhost, port=55555' (host 1 of 1, smfclient 1, attempt 1 of 1, this_host_attempt: 1 of 1)
2021-04-01 11:54:17.111  INFO 11144 --- [           main] c.s.j.protocol.impl.TcpClientChannel     : Connected to host 'orig=tcp://localhost:55555, scheme=tcp://, host=localhost, port=55555' (smfclient 1)
2021-04-01 11:54:17.158  INFO 11144 --- [           main] com.solacesystems.jms.SolSession         : SolSession started.
Received data of size 100
2021-04-01 11:54:24.122  INFO 11144 --- [           main] c.s.j.protocol.impl.TcpClientChannel     : Channel Closed (smfclient 1)
2021-04-01 11:54:24.122  INFO 11144 --- [           main] c.s.j.protocol.impl.TcpClientChannel     : Connecting to host 'orig=tcp://localhost:55555, scheme=tcp://, host=localhost, port=55555' (host 1 of 1, smfclient 2, attempt 1 of 1, this_host_attempt: 1 of 1)
2021-04-01 11:54:24.187  INFO 11144 --- [           main] c.s.j.protocol.impl.TcpClientChannel     : Connected to host 'orig=tcp://localhost:55555, scheme=tcp://, host=localhost, port=55555' (smfclient 2)
2021-04-01 11:54:24.219  INFO 11144 --- [           main] com.solacesystems.jms.SolSession         : SolSession started.
Received data of size 100
2021-04-01 11:54:31.036  INFO 11144 --- [           main] c.s.j.protocol.impl.TcpClientChannel     : Channel Closed (smfclient 2)
2021-04-01 11:54:31.036  INFO 11144 --- [           main] c.s.j.protocol.impl.TcpClientChannel     : Connecting to host 'orig=tcp://tcp://localhost:55555, scheme=tcp://, host=localhost, port=55555' (host 1 of 1, smfclient 3, attempt 1 of 1, this_host_attempt: 1 of 1)
2021-04-01 11:54:31.098  INFO 11144 --- [           main] c.s.j.protocol.impl.TcpClientChannel     : Connected to host 'orig=tcp://tcp://localhost:55555, scheme=tcp://, host=localhost, port=55555' (smfclient 3)
2021-04-01 11:54:31.145  INFO 11144 --- [           main] com.solacesystems.jms.SolSession         : SolSession started.
下面是我的Spring批处理配置类:

@EnableJms
@配置
@启用批处理
公共类SpringBatchJmsConfig{
公共静态最终记录器Logger=LoggerFactory.getLogger(SpringBatchJmsConfig.class.getName());
@自动连线
私有JmsTemplate JmsTemplate;
@自动连线
公共建筑工厂;
@自动连线
公共StepBuilderFactory StepBuilderFactory;
@自动连线
公共连接工厂连接工厂;
@自动连线
公共定制项目作者;
@豆子
公共默认jmsListenerContainerFactory CFFactory(ConnectionFactory ConnectionFactory){
DefaultJmsListenerContainerFactory=新的DefaultJmsListenerContainerFactory();
工厂。设置连接工厂(连接工厂);
setMessageConverter(messageConverter());
factory.setPubSubDomain(false);
返回工厂;
}
@豆子
public MessageConverter MessageConverter(){
MappingJackson2MessageConverter=新的MappingJackson2MessageConverter();
setTargetType(MessageType.TEXT);
converter.setTypeIdPropertyName(“_-type”);
回流转换器;
}
@豆子
公共JmsItemReader hcpJmsItemReader(MessageConverter MessageConverter){
JmsItemReader hcpJmsItemReader=新JmsItemReader();
hcpJmsItemReader.setJmsTemplate(jmsTemplate);
hcpJmsItemReader.setItemType(HcpSample1.class);
返回hcpJmsItemReader;
}
@豆子
公共FlatFileItemWriter hcpFlatFileItemWriter(){
FlatFileItemWriter hcpFlatFileItemWriter=新的FlatFileItemWriter();
hcpFlatFileItemWriter.setLineAggregator(hcp->hcp.toString());
hcpFlatFileItemWriter.setLineSeparator(System.lineSeparator());
setResource(新文件系统资源(“hcp.txt”);
返回hcpFlatFileItemWriter;
}
@豆子
公共作业readJmsAndWriteToFileJob(){
返回jobBuilFactory.get(“readJmsAndWriteToFileJob”).flow(step1()).end().build();
}
私有步骤步骤1(){
返回stepBuilderFactory.get(“step1”).chunk(100)。
reader(hcpJmsItemReader(messageConverter()).writer(writer.build());
}
}
CustomItemWriter

@组件
公共类CustomItemWriter实现ItemWriter{
@凌驾

public void write(ListJmsItemreader不会为每个区块重新打开JMS连接。它将为整个作业使用相同的连接。如果项目读取器在超时后返回null,则作业将完成,此时连接关闭

是..我的用例是每小时运行一次此作业并处理所有消息


在这种情况下,每次计划运行(即新作业执行)都会看到一个新连接,这是正常的.

JmsItemreader不会为每个区块重新打开JMS连接。它将对整个作业使用相同的连接。如果项目读取器在超时后返回
null
,则作业将完成,此时连接将关闭。是否有单次作业执行?@MahmoudBenHassine是。.我的用例是运行此作业每个小时和处理我共享的所有消息仅用于一次计划运行。根据上述问题中共享的日志,JMSItemReader正在为每100条消息的块大小重新连接到solace。您说您每小时运行一次作业,意味着每小时执行一次新作业,除非ItemReader的超时超过一小时。如我说过,Spring Batch不会为每个区块创建连接。如果您确定有一个作业运行时有多个连接,请提供一个复制该问题的方法,以便能够以有效的方式帮助您。您好,请检查更新的问题。我有共享的应用程序日志以及批处理作业配置。我没有ee任何更新:除了在正文中添加了33个字符之外
Spring批处理应用程序日志
。如果您确定您有一个具有多个连接的单一作业运行,请提供一个再现该问题的最小示例,以便能够以有效的方式帮助您。
solace.jms.host=tcp://localhost:55555
solace.jms.msg-vpn=DevVPN
solace.jms.client-username=test
solace.jms.client-password=test
spring.jms.template.default-destination=SpringBatchTestQueue
spring.jms.template.receive-timeout=2s
logging.level.com.solacesystems=INFO