I am using spring integration in on of my project. And following the is the flow with in my application. When ever I am publishing a messaged to "domainEventChannel" , it goes through the transformer and then messages is sent to inputFromTransformer channel and from this as message is in chain it goes through splitter , transformer and filter. I have configured output-channel="domainEventQueueChannel" ,which is a queue channel.
I am able to track messages till the filter, but they never reach the QueueChannel.
Can I not sent a message to queue channel from a chain ?
<int:transformer ref="partitionlessTransformer" method="transform"
input-channel="domainEventChannel" output-channel="inputFromTransformer" />
<!-- Chain which has the output channel as queue channel-->
<int:chain input-channel="inputFromTransformer"
output-channel="domainEventQueueChannel">
<int:splitter ref="messageSplitter" method="split" />
<int:transformer ref="jsonToObjectTransformer" />
<int:filter ref="autopayModelProcessTransFilter"></int:filter>
</int:chain>
<!-- Queue Channel-->
<int:channel id="domainEventQueueChannel">
<int:queue capacity="10" />
</int:channel>
<!-- service activator which polls queueChannel -->
<int:service-activator id="domainEventReconProcessServiceActivator"
input-channel="domainEventQueueChannel" ref="domainEventReconProcessServiceActivator" method="intiateAutopayProcessTransRecon">
<int:poller task-executor="domainEventReconProcessServicetaskExecutor" fixed-rate="10" >
</int:poller>
</int:service-activator>
<task:executor id="domainEventReconProcessServicetaskExecutor"
pool-size="10" queue-capacity="10" />
Update 2#:
When I add the following piece of config everything works fine. Message flows from queue channel to service activator:
<int:chain input-channel="domainEventQueueChannel"
output-channel="nullChannel">
<int:service-activator id="domainEventReconProcessServiceActivator"
ref="domainEventReconProcessServiceActivator" method="intiateAutopayProcessTransRecon" />
<int:poller task-executor="domainEventReconProcessServicetaskExecutor" fixed-rate="10"></int:poller>
</int:chain>
Update 3#:
With the chain in place I see the service activator's poller polling the queueChannel. But without the chain , the poller is not starting at all I don't see poller logs at all.
With Chain in place:
2015-09-08 09:29:31.438 DEBUG 12817 --- [ask-scheduler-8] o.s.integration.channel.QueueChannel : preSend on channel 'domainEventQueueChannel', message: GenericMessage [payload=com.autopayprocesstransrecon.resource.DomainEvent#6ac4fcc0, headers={sequenceNumber=1, correlationId=7a91b5fb-b1aa-464a-2e1b-5309652a0520, id=25ae85aa-e0df-6c72-9a54-2e8dac3c5ddc, sequenceSize=1, timestamp=1441718971437}]
2015-09-08 09:29:31.438 DEBUG 12817 --- [ask-scheduler-8] o.s.integration.channel.QueueChannel : postSend (sent=true) on channel 'domainEventQueueChannel', message: GenericMessage [payload=com.autopayprocesstransrecon.resource.DomainEvent#6ac4fcc0, headers={sequenceNumber=1, correlationId=7a91b5fb-b1aa-464a-2e1b-5309652a0520, id=25ae85aa-e0df-6c72-9a54-2e8dac3c5ddc, sequenceSize=1, timestamp=1441718971437}]
2015-09-08 09:29:31.438 DEBUG 12817 --- [ask-scheduler-8] o.s.integration.channel.DirectChannel : postSend (sent=true) on channel 'inputFromTransformer', message: GenericMessage [payload=[{"eventInfo":{"eventId":"4535345353","eventName":"AutopayModelsExtracted","parentEventId":"4535345353"},"numOfAutopayModels":20,"message":"Published autopaymodels needed to be processed"}], headers={id=7a91b5fb-b1aa-464a-2e1b-5309652a0520, timestamp=1441718971410}]
2015-09-08 09:29:31.438 DEBUG 12817 --- [ask-scheduler-8] o.s.integration.channel.DirectChannel : postSend (sent=true) on channel 'domainEventChannel', message: GenericMessage [payload={domainevents={0=[{"eventInfo":{"eventId":"4535345353","eventName":"AutopayModelsExtracted","parentEventId":"4535345353"},"numOfAutopayModels":20,"message":"Published autopaymodels needed to be processed"}]}}, headers={id=438c63c8-1ed1-6516-110e-c3478aca35c8, timestamp=1441718971409}]
2015-09-08 09:29:31.438 DEBUG 12817 --- [etaskExecutor-1] o.s.integration.channel.QueueChannel : postReceive on channel 'domainEventQueueChannel', message: GenericMessage [payload=com.autopayprocesstransrecon.resource.DomainEvent#6ac4fcc0, headers={sequenceNumber=1, correlationId=7a91b5fb-b1aa-464a-2e1b-5309652a0520, id=25ae85aa-e0df-6c72-9a54-2e8dac3c5ddc, sequenceSize=1, timestamp=1441718971437}]
2015-09-08 09:29:31.438 DEBUG 12817 --- [etaskExecutor-1] o.s.i.endpoint.PollingConsumer : Poll resulted in Message: GenericMessage [payload=com.autopayprocesstransrecon.resource.DomainEvent#6ac4fcc0, headers={sequenceNumber=1, correlationId=7a91b5fb-b1aa-464a-2e1b-5309652a0520, id=25ae85aa-e0df-6c72-9a54-2e8dac3c5ddc, sequenceSize=1, timestamp=1441718971437}]
2015-09-08 09:29:31.438 DEBUG 12817 --- [etaskExecutor-1] o.s.i.handler.MessageHandlerChain : org.springframework.integration.handler.MessageHandlerChain#1 received message: GenericMessage [payload=com.autopayprocesstransrecon.resource.DomainEvent#6ac4fcc0, headers={sequenceNumber=1, correlationId=7a91b5fb-b1aa-464a-2e1b-5309652a0520, id=25ae85aa-e0df-6c72-9a54-2e8dac3c5ddc, sequenceSize=1, timestamp=1441718971437}]
2015-09-08 09:29:31.438 DEBUG 12817 --- [etaskExecutor-1] o.s.i.handler.ServiceActivatingHandler : ServiceActivator for [org.springframework.integration.handler.MethodInvokingMessageProcessor#72193fb5] (org.springframework.integration.handler.MessageHandlerChain#1$child.domainEventReconProcessServiceActivator) received message: GenericMessage [payload=com.autopayprocesstransrecon.resource.DomainEvent#6ac4fcc0, headers={sequenceNumber=1, correlationId=7a91b5fb-b1aa-464a-2e1b-5309652a0520, id=25ae85aa-e0df-6c72-9a54-2e8dac3c5ddc, sequenceSize=1, timestamp=1441718971437}]`
Without Chain:
2015-09-08 09:48:02.572 DEBUG 13043 --- [ask-scheduler-1] o.s.i.splitter.MethodInvokingSplitter : org.springframework.integration.splitter.MethodInvokingSplitter#53abfc07 received message: GenericMessage [payload=[{"eventInfo":{"eventId":"4535345353","eventName":"AutopayModelsExtracted","parentEventId":"4535345353"},"numOfAutopayModels":20,"message":"Published autopaymodels needed to be processed"}], headers={id=f477f025-e92f-f896-9ac4-2ce1b91fb895, timestamp=1441720082572}]
2015-09-08 09:48:02.574 DEBUG 13043 --- [ask-scheduler-1] o.s.i.t.MessageTransformingHandler : org.springframework.integration.transformer.MessageTransformingHandler#2c8c16c0 received message: GenericMessage [payload={"eventInfo":{"eventId":"4535345353","eventName":"AutopayModelsExtracted","parentEventId":"4535345353"},"numOfAutopayModels":20,"message":"Published autopaymodels needed to be processed"}, headers={sequenceNumber=1, correlationId=f477f025-e92f-f896-9ac4-2ce1b91fb895, id=1364077a-6d5c-87f9-7d7c-3d144e45d661, sequenceSize=1, timestamp=1441720082574}]
2015-09-08 09:48:02.599 DEBUG 13043 --- [ask-scheduler-1] o.s.integration.filter.MessageFilter : org.springframework.integration.filter.MessageFilter#80bfa9d received message: GenericMessage [payload=com.autopayprocesstransrecon.resource.DomainEvent#fd57501, headers={sequenceNumber=1, correlationId=f477f025-e92f-f896-9ac4-2ce1b91fb895, id=c2a324c8-9eb0-66e0-73a1-5595ed87b3ae, sequenceSize=1, timestamp=1441720082599}]
hey I am in filter and my result would betrue
2015-09-08 09:48:02.599 DEBUG 13043 --- [ask-scheduler-1] o.s.integration.channel.QueueChannel : preSend on channel 'domainEventQueueChannel', message: GenericMessage [payload=com.autopayprocesstransrecon.resource.DomainEvent#fd57501, headers={sequenceNumber=1, correlationId=f477f025-e92f-f896-9ac4-2ce1b91fb895, id=c2a324c8-9eb0-66e0-73a1-5595ed87b3ae, sequenceSize=1, timestamp=1441720082599}]
2015-09-08 09:48:02.599 DEBUG 13043 --- [ask-scheduler-1] o.s.integration.channel.QueueChannel : postSend (sent=true) on channel 'domainEventQueueChannel', message: GenericMessage [payload=com.autopayprocesstransrecon.resource.DomainEvent#fd57501, headers={sequenceNumber=1, correlationId=f477f025-e92f-f896-9ac4-2ce1b91fb895, id=c2a324c8-9eb0-66e0-73a1-5595ed87b3ae, sequenceSize=1, timestamp=1441720082599}]
2015-09-08 09:48:02.599 DEBUG 13043 --- [ask-scheduler-1] o.s.integration.channel.DirectChannel : postSend (sent=true) on channel 'inputFromTransformer', message: GenericMessage [payload=[{"eventInfo":{"eventId":"4535345353","eventName":"AutopayModelsExtracted","parentEventId":"4535345353"},"numOfAutopayModels":20,"message":"Published autopaymodels needed to be processed"}], headers={id=f477f025-e92f-f896-9ac4-2ce1b91fb895, timestamp=1441720082572}]
2015-09-08 09:48:02.599 DEBUG 13043 --- [ask-scheduler-1] o.s.integration.channel.DirectChannel : postSend (sent=true) on channel 'domainEventChannel', message: GenericMessage [payload={domainevents={0=[{"eventInfo":{"eventId":"4535345353","eventName":"AutopayModelsExtracted","parentEventId":"4535345353"},"numOfAutopayModels":20,"message":"Published autopaymodels needed to be processed"}]}}, headers={id=bf6f4f20-52bb-27e4-df97-4112ad4be3b5, timestamp=1441720082571}]
2015-09-08 09:48:03.616 DEBUG 13043 --- [ask-scheduler-3] o.s.i.e.SourcePollingChannelAdapter : Received no Message during the poll, returning 'false'
2015-09-08 09:48:04.634 DEBUG 13043 --- [ask-scheduler-4] o.s.i.e.SourcePollingChannelAdapter : Received no Message during the poll, returning 'false'
That simply means the message is not passing the filter.
(The filter is dropping the message).
Related
In my project, I have the following List of AccountWithFiles objects.
#AllArgsConstructor
#Getter
class AccountWithFiles {
private String account;
private List<S3FileInfo> s3FileInfoList;
}
I want to process each AccountWithFiles separately in a new thread. Then split s3FileInfoList using split() and process them one by one with 20 min delay, however in parallel each account with s3FileInfoList.
So I have the following DSL definition:
#Bean
public IntegrationFlow s3DownloadFlowEnhanced() {
return IntegrationFlows.fromSupplier(s3FileInfoRepository::findAllGroupByAccount,
c -> c.poller(Pollers.cron(time, TimeZone.getTimeZone(zone))).id("s3TEMPO"))
.channel("manualS3EnhancedFlow")
.split()
.channel("myChannel")
.get();
}
s3FileInfoRepository::findAllGroupByAccount returns the list of AccountWithFiles objects after that I'm splitting them and send them to MessageChannels Executors channel (with defined number of threads)
#Bean
public MessageChannel myChannel() {
return MessageChannels.publishSubscribe(Executors.newFixedThreadPool(10)).get();
}
After that
#Bean
public IntegrationFlow processEachAccountSeparately() {
return IntegrationFlows.from("myChannel")
.<AccountWithFiles, Object>transform(m -> m.getS3FileInfoList().stream().sorted(
Comparator.comparing(i -> i.getOperationType() == FILE_OPERATION_TYPE.ADD))
.collect(Collectors.toList()))
.log()
//.resequence()
.split()
.channel("bookItemsChannel")
.get();
}
#Bean
public PollableChannel bookItemsChannel(){
return new QueueChannel();
}
#Bean
public IntegrationFlow test() {
return IntegrationFlows.from("bookItemsChannel")
.delay("delayer.messageGroupId", d -> d
.defaultDelay(25000L)
.delayExpression("headers['delay']"))
.log()
.get();
}
#Bean(name = PollerMetadata.DEFAULT_POLLER)
public PollerMetadata defaultPoller() {
PollerMetadata pollerMetadata = new PollerMetadata();
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(5);
taskExecutor.initialize();
pollerMetadata.setTaskExecutor(taskExecutor);
pollerMetadata.setTrigger(new PeriodicTrigger(15000L));
pollerMetadata.setMaxMessagesPerPoll(3);
return pollerMetadata;
}
When messages are received by the Pollable channel they are processed one by one with delay. I want my messages to process one by one however in parallel based on splitter from s3DownloadFlowEnhancedflow.
I know that pollable channels distinguish a sender and receiver for the message in a different thread. Maybe there is any workaround here?
In processEachAccountSeparately flow I see that each account has its own thread.
2021-06-24 15:33:34.585 INFO 56174 --- [pool-4-thread-1] o.s.integration.handler.LoggingHandler : GenericMessage [payload=[S3FileInfo(fileName=sdfsdf, timeStamp=null, serviceName=null, accountLogin=login2, operationType=ADD)], headers={sequenceNumber=1, correlationId=36b132ac-7c5b-af66-96c0-2334a757c960, id=3bafdaa7-ed4c-087f-5f2c-cc114eae42cd, sequenceSize=2, timestamp=1624538014577}]
2021-06-24 15:33:34.585 INFO 56174 --- [pool-4-thread-2] o.s.integration.handler.LoggingHandler : GenericMessage [payload=[S3FileInfo(fileName=sdfjsjfj, timeStamp=null, serviceName=null, accountLogin=login1, operationType=DELETE), S3FileInfo(fileName=s3/outgoing/file2, timeStamp=null, serviceName=IPASS, accountLogin=login1, operationType=DELETE), S3FileInfo(fileName=outgoing/s3/ipass.xlsx, timeStamp=null, serviceName=IPASS, accountLogin=login1, operationType=ADD), S3FileInfo(fileName=dsfsdf, timeStamp=null, serviceName=null, accountLogin=login1, operationType=ADD)], headers={sequenceNumber=2, correlationId=36b132ac-7c5b-af66-96c0-2334a757c960, id=d8506721-2cfd-b6da-d353-4fb8bd5744fb, sequenceSize=2, timestamp=1624538014577}]
However, PollableChannel executes it one by one
2021-06-24 15:33:46.328 INFO 56174 --- [lTaskExecutor-3] o.s.integration.handler.LoggingHandler : GenericMessage [payload=S3FileInfo(fileName=sdfjsjfj, timeStamp=null, serviceName=null, accountLogin=login1, operationType=DELETE), headers={sequenceNumber=1, sequenceDetails=[[36b132ac-7c5b-af66-96c0-2334a757c960, 2, 2]], correlationId=d8506721-2cfd-b6da-d353-4fb8bd5744fb, id=7f8bd9a6-25ce-0bb2-c3f3-581d823d8fce, sequenceSize=4, timestamp=1624538014585}]
2021-06-24 15:33:46.329 INFO 56174 --- [lTaskExecutor-3] o.s.integration.handler.LoggingHandler : GenericMessage [payload=S3FileInfo(fileName=sdfsdf, timeStamp=null, serviceName=null, accountLogin=login2, operationType=ADD), headers={sequenceNumber=1, sequenceDetails=[[36b132ac-7c5b-af66-96c0-2334a757c960, 1, 2]], correlationId=3bafdaa7-ed4c-087f-5f2c-cc114eae42cd, id=f697b52b-1053-51aa-232f-88bb602dc1c9, sequenceSize=1, timestamp=1624538014585}]
2021-06-24 15:33:46.329 INFO 56174 --- [lTaskExecutor-3] o.s.integration.handler.LoggingHandler : GenericMessage [payload=S3FileInfo(fileName=s3/outgoing/file2, timeStamp=null, serviceName=IPASS, accountLogin=login1, operationType=DELETE), headers={sequenceNumber=2, sequenceDetails=[[36b132ac-7c5b-af66-96c0-2334a757c960, 2, 2]], correlationId=d8506721-2cfd-b6da-d353-4fb8bd5744fb, id=a6754c98-fce0-f132-664a-65d61f553ae2, sequenceSize=4, timestamp=1624538014585}]
2021-06-24 15:34:01.333 INFO 56174 --- [lTaskExecutor-4] o.s.integration.handler.LoggingHandler : GenericMessage [payload=S3FileInfo(fileName=outgoing/s3/ipass.xlsx, timeStamp=null, serviceName=IPASS, accountLogin=login1, operationType=ADD), headers={sequenceNumber=3, sequenceDetails=[[36b132ac-7c5b-af66-96c0-2334a757c960, 2, 2]], correlationId=d8506721-2cfd-b6da-d353-4fb8bd5744fb, id=71fa915a-fcaa-3d00-023b-5cf51be3b183, sequenceSize=4, timestamp=1624538014585}]
2021-06-24 15:34:01.333 INFO 56174 --- [lTaskExecutor-4] o.s.integration.handler.LoggingHandler : GenericMessage [payload=S3FileInfo(fileName=dsfsdf, timeStamp=null, serviceName=null, accountLogin=login1, operationType=ADD), headers={sequenceNumber=4, sequenceDetails=[[36b132ac-7c5b-af66-96c0-2334a757c960, 2, 2]], correlationId=d8506721-2cfd-b6da-d353-4fb8bd5744fb, id=7c513e23-5484-4f61-b7d3-362648c7b89c, sequenceSize=4, timestamp=1624538014585}]
What I want is to have something like this:
[pool-4-thread-1] simultaneously
[pool-4-thread-2] simultaneously
[pool-4-thread-2] 20 min delay
[pool-4-thread-2] 20 min delay
[pool-4-thread-2] 20 min delay
Your first step is correct about splitting a list of AccountWithFiles. Then you say that you'd like to split s3FileInfoList and process them sequentially, one by one, but why you place them into a QeueuChannel? The regular, default DirectChannel would be enough in this case.
However then you go to delay() which does not block the current thread, but schedule a task in a future in a separate thread. So, you probably need to rethink your solution since with the current approach, even if you get rid off that bookItemsChannel as a queue, you still are not going to process delayed messages sequentially. There is just no guarantee on TaskScheduler which one is going to be performed first when they all have the same schedule time.
We have created an IntegrationFlow for an inbound TCP server. Whenever we test this the integration is fine until the client disconnects, then we get a continuous flow of empty messages.
Spring Integration 5.2.5.RELEASE
Flow:
#Bean
public IntegrationFlow inboundFlow(MyService myService) {
return IntegrationFlows.from(
Tcp.inboundAdapter(
Tcp.netServer(12345)
.deserializer(TcpCodecs.lengthHeader4())))
.transform(Transformers.objectToString())
.log(INFO) // Logging only for testing
.handle(myService, "process") // Do some processing of the message
.get();
}
Test method:
public void sendPackets() throws Exception {
List<Path> files = getAllFilesSorted("/some/location");
try (Socket socket = new Socket("localhost", 12345)) {
log.info("local port: {}", socket.getLocalPort());
try (OutputStream outputStream = socket.getOutputStream()) {
for (int i = 0; i < 10; i++) {
Path path = files.get(i);
log.info("{} ({} of {})", path.toString(), i, files.size());
byte[] bytes = Files.readAllBytes(path);
outputStream.write(bytes);
outputStream.flush();
Thread.sleep(200);
}
}
}
}
Partial Log after test completes:
2020-05-05 11:00:52.963 INFO 31793 --- [pool-1-thread-2] o.s.integration.handler.LoggingHandler : GenericMessage [payload=, headers={ip_tcp_remotePort=59407, ip_connectionId=localhost:59407:44745:df23388b-b8b0-4250-b926-4199030b2ff6, ip_localInetAddress=/127.0.0.1, ip_address=127.0.0.1, id=813ccf6b-9eb7-2ff3-0f8d-f2810966d8d7, ip_hostname=localhost, timestamp=1588672852963}]
2020-05-05 11:00:52.963 INFO 31793 --- [pool-1-thread-2] o.s.integration.handler.LoggingHandler : GenericMessage [payload=, headers={ip_tcp_remotePort=59407, ip_connectionId=localhost:59407:44745:df23388b-b8b0-4250-b926-4199030b2ff6, ip_localInetAddress=/127.0.0.1, ip_address=127.0.0.1, id=1fd5c4c7-b2e0-6a89-7de6-894c8e42e242, ip_hostname=localhost, timestamp=1588672852963}]
2020-05-05 11:00:52.963 INFO 31793 --- [pool-1-thread-2] o.s.integration.handler.LoggingHandler : GenericMessage [payload=, headers={ip_tcp_remotePort=59407, ip_connectionId=localhost:59407:44745:df23388b-b8b0-4250-b926-4199030b2ff6, ip_localInetAddress=/127.0.0.1, ip_address=127.0.0.1, id=78b852e8-0094-f8b9-8d05-37bc4912d096, ip_hostname=localhost, timestamp=1588672852963}]
2020-05-05 11:00:52.963 INFO 31793 --- [pool-1-thread-2] o.s.integration.handler.LoggingHandler : GenericMessage [payload=, headers={ip_tcp_remotePort=59407, ip_connectionId=localhost:59407:44745:df23388b-b8b0-4250-b926-4199030b2ff6, ip_localInetAddress=/127.0.0.1, ip_address=127.0.0.1, id=4e4a7ee0-c66e-9501-9ef7-4d25143531b3, ip_hostname=localhost, timestamp=1588672852963}]
2020-05-05 11:00:52.963 INFO 31793 --- [pool-1-thread-2] o.s.integration.handler.LoggingHandler : GenericMessage [payload=, headers={ip_tcp_remotePort=59407, ip_connectionId=localhost:59407:44745:df23388b-b8b0-4250-b926-4199030b2ff6, ip_localInetAddress=/127.0.0.1, ip_address=127.0.0.1, id=c90abe17-7036-94cc-af59-3b0cac5e75e4, ip_hostname=localhost, timestamp=1588672852963}]
2020-05-05 11:00:52.963 INFO 31793 --- [pool-1-thread-2] o.s.integration.handler.LoggingHandler : GenericMessage [payload=, headers={ip_tcp_remotePort=59407, ip_connectionId=localhost:59407:44745:df23388b-b8b0-4250-b926-4199030b2ff6, ip_localInetAddress=/127.0.0.1, ip_address=127.0.0.1, id=425d2e2a-75c5-0184-06da-6d27eb546931, ip_hostname=localhost, timestamp=1588672852963}]
2020-05-05 11:00:52.965 INFO 31793 --- [pool-1-thread-2] o.s.integration.handler.LoggingHandler : GenericMessage [payload=, headers={ip_tcp_remotePort=59407, ip_connectionId=localhost:59407:44745:df23388b-b8b0-4250-b926-4199030b2ff6, ip_localInetAddress=/127.0.0.1, ip_address=127.0.0.1, id=4c55d1d0-7421-1832-23ca-03744419c847, ip_hostname=localhost, timestamp=1588672852965}]
2020-05-05 11:00:52.965 INFO 31793 --- [pool-1-thread-2] o.s.integration.handler.LoggingHandler : GenericMessage [payload=, headers={ip_tcp_remotePort=59407, ip_connectionId=localhost:59407:44745:df23388b-b8b0-4250-b926-4199030b2ff6, ip_localInetAddress=/127.0.0.1, ip_address=127.0.0.1, id=05b6fea6-8f76-5c74-e4cc-33bd8099d8e8, ip_hostname=localhost, timestamp=1588672852965}]
2020-05-05 11:00:52.965 INFO 31793 --- [pool-1-thread-2] o.s.integration.handler.LoggingHandler : GenericMessage [payload=, headers={ip_tcp_remotePort=59407, ip_connectionId=localhost:59407:44745:df23388b-b8b0-4250-b926-4199030b2ff6, ip_localInetAddress=/127.0.0.1, ip_address=127.0.0.1, id=9b8fe16c-07f4-b64b-faec-794eb743559c, ip_hostname=localhost, timestamp=1588672852965}]
2020-05-05 11:00:52.965 INFO 31793 --- [pool-1-thread-2] o.s.integration.handler.LoggingHandler : GenericMessage [payload=, headers={ip_tcp_remotePort=59407, ip_connectionId=localhost:59407:44745:df23388b-b8b0-4250-b926-4199030b2ff6, ip_localInetAddress=/127.0.0.1, ip_address=127.0.0.1, id=222725e8-19c6-62b6-8ba7-103892191c96, ip_hostname=localhost, timestamp=1588672852965}]
2020-05-05 11:00:52.965 INFO 31793 --- [pool-1-thread-2] o.s.integration.handler.LoggingHandler : GenericMessage [payload=, headers={ip_tcp_remotePort=59407, ip_connectionId=localhost:59407:44745:df23388b-b8b0-4250-b926-4199030b2ff6, ip_localInetAddress=/127.0.0.1, ip_address=127.0.0.1, id=951403b6-18a9-ffe9-29b7-67b8c01ea311, ip_hostname=localhost, timestamp=1588672852965}]
2020-05-05 11:00:52.965 INFO 31793 --- [pool-1-thread-2] o.s.integration.handler.LoggingHandler : GenericMessage [payload=, headers={ip_tcp_remotePort=59407, ip_connectionId=localhost:59407:44745:df23388b-b8b0-4250-b926-4199030b2ff6, ip_localInetAddress=/127.0.0.1, ip_address=127.0.0.1, id=2ac3002b-ccd1-9506-f3aa-60f4b63e26b8, ip_hostname=localhost, timestamp=1588672852965}]
2020-05-05 11:00:52.965 INFO 31793 --- [pool-1-thread-2] o.s.integration.handler.LoggingHandler : GenericMessage [payload=, headers={ip_tcp_remotePort=59407, ip_connectionId=localhost:59407:44745:df23388b-b8b0-4250-b926-4199030b2ff6, ip_localInetAddress=/127.0.0.1, ip_address=127.0.0.1, id=dbbf12cf-0a27-407b-0a96-5b27ab0539db, ip_hostname=localhost, timestamp=1588672852965}]
2020-05-05 11:00:52.965 INFO 31793 --- [pool-1-thread-2] o.s.integration.handler.LoggingHandler : GenericMessage [payload=, headers={ip_tcp_remotePort=59407, ip_connectionId=localhost:59407:44745:df23388b-b8b0-4250-b926-4199030b2ff6, ip_localInetAddress=/127.0.0.1, ip_address=127.0.0.1, id=3282d09e-9508-b053-3763-cc23d3c817a8, ip_hostname=localhost, timestamp=1588672852965}]
2020-05-05 11:00:52.966 INFO 31793 --- [pool-1-thread-2] o.s.integration.handler.LoggingHandler : GenericMessage [payload=, headers={ip_tcp_remotePort=59407, ip_connectionId=localhost:59407:44745:df23388b-b8b0-4250-b926-4199030b2ff6, ip_localInetAddress=/127.0.0.1, ip_address=127.0.0.1, id=549b2326-341f-19c0-db98-6b31da1901d8, ip_hostname=localhost, timestamp=1588672852966}]
There is nothing in the log about the client disconnecting. We would see socket close activity in the log.
The log implies we are receiving packets containing 0x00000000.
Use wireshark or similar to look at the activity on the wire.
EDIT
Your custom deserializer is causing the problem.
if (read < 0) {
return 0;
}
You need to throw a SoftEndOfStreamException when you detect a socket close.
This is explained in the documentation.
When the deserializer detects a closed input stream between messages, it must throw a SoftEndOfStreamException; this is a signal to the framework to indicate that the close was "normal". If the stream is closed while decoding a message, some other exception should be thrown instead.
Using spring-integration 5.0.7 to throttle the bridging of msgs between two JMS queues.
The docs at: https://docs.spring.io/spring-integration/docs/5.0.7.RELEASE/reference/html/messaging-channels-section.html#bridge-namespace
suggest:
<int:bridge input-channel="pollable" output-channel="subscribable">
<int:poller max-messages-per-poll="10" fixed-rate="5000"/>
</int:bridge>
But schema validator complains "no nested poller allowed for subscribable input channel" on bridge elt.
But, if I put the poller on the input-channel-adapter as in:
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns:int="http://www.springframework.org/schema/integration"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:int-jms="http://www.springframework.org/schema/integration/jms"
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
http://www.springframework.org/schema/integration/jms
http://www.springframework.org/schema/integration/jms/spring-integration-jms.xsd
">
<int:channel id="inChannel" />
<int:channel id="outChannel" />
<int-jms:inbound-channel-adapter id="jmsIn" connection-factory="jmsConnectionFactory" destination-name="_dev.inQueue" channel="inChannel">
<int:poller fixed-delay="5000" max-messages-per-poll="2"/>
</int-jms:inbound-channel-adapter>
<int-jms:outbound-channel-adapter id="jmsOut" connection-factory="jmsConnectionFactory" destination-name="_dev.outQueue" channel="outChannel"/>
<int:bridge input-channel="inChannel" output-channel="outChannel">
</int:bridge>
</beans:beans>
Nothing is ever moved from input to output.
How can I bridge from one JMS queue to another with a rate-limit?
Update:
Turning on logging confirms nothing getting picked up from input channel but otherwise not helpful:
018-08-10 15:36:33.345 DEBUG 112066 --- [ask-scheduler-1] o.s.i.e.SourcePollingChannelAdapter : Received no Message during the poll, returning 'false'
2018-08-10 15:36:38.113 DEBUG 112066 --- [ask-scheduler-2] o.s.integration.jms.DynamicJmsTemplate : Executing callback on JMS Session: ActiveMQSession {id=ID:whitechapel-35247-1533940593148-3:2:1,started=true} java.lang.Object#5c278302
2018-08-10 15:36:38.116 DEBUG 112066 --- [ask-scheduler-2] o.s.i.e.SourcePollingChannelAdapter : Received no Message during the poll, returning 'false'
2018-08-10 15:36:43.115 DEBUG 112066 --- [ask-scheduler-1] o.s.integration.jms.DynamicJmsTemplate : Executing callback on JMS Session: ActiveMQSession {id=ID:whitechapel-35247-1533940593148-3:3:1,started=true} java.lang.Object#1c09a81e
2018-08-10 15:36:43.118 DEBUG 112066 --- [ask-scheduler-1] o.s.i.e.SourcePollingChannelAdapter : Received no Message during the poll, returning 'false'
Here is a Spring Boot app, using Java DSL configuration which is the exact equivalent of what you have in XML (minus the bridge); it works fine.
#SpringBootApplication
public class So51792909Application {
private static final Logger logger = LoggerFactory.getLogger(So51792909Application.class);
public static void main(String[] args) {
SpringApplication.run(So51792909Application.class, args);
}
#Bean
public ApplicationRunner runner(JmsTemplate template) {
return args -> {
for (int i = 0; i < 10; i++) {
template.convertAndSend("foo", "test");
}
};
}
#Bean
public IntegrationFlow flow(ConnectionFactory connectionFactory) {
return IntegrationFlows.from(Jms.inboundAdapter(connectionFactory)
.destination("foo"), e -> e
.poller(Pollers
.fixedDelay(5000)
.maxMessagesPerPoll(2)))
.handle(Jms.outboundAdapter(connectionFactory)
.destination("bar"))
.get();
}
#JmsListener(destination = "bar")
public void listen(String in) {
logger.info(in);
}
}
and
2018-08-10 19:38:52.534 INFO 13408 --- [enerContainer-1] com.example.So51792909Application : test
2018-08-10 19:38:52.543 INFO 13408 --- [enerContainer-1] com.example.So51792909Application : test
2018-08-10 19:38:57.566 INFO 13408 --- [enerContainer-1] com.example.So51792909Application : test
2018-08-10 19:38:57.582 INFO 13408 --- [enerContainer-1] com.example.So51792909Application : test
2018-08-10 19:39:02.608 INFO 13408 --- [enerContainer-1] com.example.So51792909Application : test
2018-08-10 19:39:02.622 INFO 13408 --- [enerContainer-1] com.example.So51792909Application : test
2018-08-10 19:39:07.640 INFO 13408 --- [enerContainer-1] com.example.So51792909Application : test
2018-08-10 19:39:07.653 INFO 13408 --- [enerContainer-1] com.example.So51792909Application : test
2018-08-10 19:39:12.672 INFO 13408 --- [enerContainer-1] com.example.So51792909Application : test
2018-08-10 19:39:12.687 INFO 13408 --- [enerContainer-1] com.example.So51792909Application : test
As you can see, the consumer gets 2 messages every 5 seconds.
Your debug log implies there are no messages in the queue.
EDIT
I figured it out; the XML parser sets the JmsTemplate receiveTimeout to nowait (-1). Since you are not using a caching connection factory, we'll never get a message because the ActiveMQ client returns immediately if there's not already a message present in the client (see this answer). Since there's no caching going on, we get a new consumer on every poll (and do a no-wait receive each time).
The DSL leaves the JmsTemplate's default (Infinite wait - which is actually wrong since it blocks the poller thread indefinitely if there are no messages).
To fix the XML version, adding receive-timeout="1000" fixes it.
However, it's better to use a CachingConnectionFactory to avoid creating a new connection/session/consumer on each poll.
Unfortunately, configurating a CachingConnectionFactory turns off Spring Boot's auto-configuration. This is fixed in Boot 2.1.
I have opened an issue to resolve the inconsistency between the DSL and XML here.
If you stick with the DSL, I would recommend setting the receive timeout to something reasonable, rather than indefinite:
#Bean
public IntegrationFlow flow(ConnectionFactory connectionFactory) {
return IntegrationFlows.from(Jms.inboundAdapter(connectionFactory)
.configureJmsTemplate(t -> t.receiveTimeout(1000))
.destination("foo"), e -> e
.poller(Pollers
.fixedDelay(5000)
.maxMessagesPerPoll(2)))
.handle(Jms.outboundAdapter(connectionFactory)
.destination("bar"))
.get();
}
But, the best solution is to use a CachingConnectionFactory.
Can I have a job with just the slaves and no master and listen to a rabbitmq queue? I want to listen to a queue and process the messages in chunk oriented manner using spring batch and spring integration in a spring boot app.
I want to use the chunkProcessorChunkHandler configuration explained in the RemoteChunking example for Spring batch by Michael Minella (https://www.youtube.com/watch?v=30Tdp1mfR0g), but without a master configuration.
Below is my configuration for the job.
#Configuration
#EnableIntegration
public class QueueIntegrationConfiguration {
#Autowired
private CassandraItemWriter cassandraItemWriter;
#Autowired
private VendorProcessor vendorProcessor;
#Autowired
ConnectionFactory connectionFactory;
#Bean
public AmqpInboundChannelAdapter inboundChannelAdapter(
SimpleMessageListenerContainer listenerContainer) {
AmqpInboundChannelAdapter adapter = new AmqpInboundChannelAdapter(listenerContainer);
adapter.setOutputChannel(inboundQueueChannel());
adapter.setAutoStartup(true);
return adapter;
}
#Bean
public SimpleMessageListenerContainer listenerContainer(ConnectionFactory connectionFactory, MessageConverter jsonMessageConverter) {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(
connectionFactory);
container.setQueueNames("ProductStore_Partial");
container.setAutoStartup(true);
container.setMessageConverter(jsonMessageConverter);
return container;
}
#Bean
#ServiceActivator(inputChannel = "ProductStore_Partial")
public ChunkProcessorChunkHandler chunkProcessorChunkHandler()
throws Exception {
SimpleChunkProcessor chunkProcessor = new SimpleChunkProcessor(vendorProcessor,
cassandraItemWriter);
chunkProcessor.afterPropertiesSet();
ChunkProcessorChunkHandler<Vendor> chunkHandler = new ChunkProcessorChunkHandler<>();
chunkHandler.setChunkProcessor(chunkProcessor);
chunkHandler.afterPropertiesSet();
return chunkHandler;
}
#Bean
public QueueChannel inboundQueueChannel() {
return new QueueChannel().;
}
}
Below is my Application.java class for spring boot.
#SpringBootApplication
#EnableBatchProcessing
public class BulkImportProductApplication {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(BulkImportProductApplication.class);
app.setWebEnvironment(false);
app.run(args).close();
}
}
From what I understand from spring integration, I have an AmqpInboundChannelAdapter for listening to messages from the queue. A ServiceActivator, an inboundQueueChannel, autowired ItemProcessor and ItemWriter. I am not sure what am I missing here.
The batch job starts, consumes one message from the queue and get a cancelOk and my job terminates without processing the message.
I am also sharing my debug logging if that would help.
2017-12-04 09:58:49.679 INFO 7450 --- [ main] c.a.s.p.b.BulkImportProductApplication : Started BulkImportProductApplication in 9.412 seconds (JVM running for 10.39)
2017-12-04 09:58:49.679 INFO 7450 --- [ main] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext#31c88ec8: startup date [Mon Dec 04 09:58:40 PST 2017]; root of context hierarchy
2017-12-04 09:58:49.679 DEBUG 7450 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Returning cached instance of singleton bean 'org.springframework.integration.config.IdGeneratorConfigurer#0'
2017-12-04 09:58:49.680 DEBUG 7450 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Returning cached instance of singleton bean 'inboundChannelAdapter'
2017-12-04 09:58:49.680 DEBUG 7450 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Returning cached instance of singleton bean 'listenerContainer'
2017-12-04 09:58:49.680 DEBUG 7450 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Returning cached instance of singleton bean 'integrationHeaderChannelRegistry'
2017-12-04 09:58:49.680 DEBUG 7450 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Returning cached instance of singleton bean 'org.springframework.amqp.rabbit.config.internalRabbitListenerEndpointRegistry'
2017-12-04 09:58:49.680 DEBUG 7450 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Returning cached instance of singleton bean '_org.springframework.integration.errorLogger'
2017-12-04 09:58:49.680 DEBUG 7450 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Returning cached instance of singleton bean 'queueIntegrationConfiguration.chunkProcessorChunkHandler.serviceActivator.handler'
2017-12-04 09:58:49.680 DEBUG 7450 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Returning cached instance of singleton bean 'queueIntegrationConfiguration.chunkProcessorChunkHandler.serviceActivator'
2017-12-04 09:58:49.680 DEBUG 7450 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Returning cached instance of singleton bean 'lifecycleProcessor'
2017-12-04 09:58:49.680 INFO 7450 --- [ main] o.s.c.support.DefaultLifecycleProcessor : Stopping beans in phase 2147483647
2017-12-04 09:58:49.680 DEBUG 7450 --- [ main] o.s.c.support.DefaultLifecycleProcessor : Asking bean 'inboundChannelAdapter' of type [class org.springframework.integration.amqp.inbound.AmqpInboundChannelAdapter] to stop
2017-12-04 09:58:49.680 DEBUG 7450 --- [ main] o.s.a.r.l.SimpleMessageListenerContainer : Shutting down Rabbit listener container
2017-12-04 09:58:49.814 DEBUG 7450 --- [pool-1-thread-5] o.s.a.r.listener.BlockingQueueConsumer : Storing delivery for Consumer#7c52fc81: tags=[{}], channel=Cached Rabbit Channel: AMQChannel(amqp://admin#xxxx:5672/,2), conn: Proxy#26f1249d Shared Rabbit Connection: SimpleConnection#680bddf5 [delegate=amqp://admin#xxxx:5672/, localPort= 65035], acknowledgeMode=AUTO local queue size=0
2017-12-04 09:58:49.814 DEBUG 7450 --- [enerContainer-1] o.s.a.r.listener.BlockingQueueConsumer : Received message: (Body:'[B#358a5358(byte[618])' MessageProperties [headers={__TypeId__=com.art.service.product.bulkimportproduct.data.model.Vendor}, timestamp=null, messageId=null, userId=null, receivedUserId=null, appId=null, clusterId=null, type=null, correlationId=null, correlationIdString=null, replyTo=null, contentType=json, contentEncoding=UTF-8, contentLength=0, deliveryMode=null, receivedDeliveryMode=NON_PERSISTENT, expiration=null, priority=0, redelivered=false, receivedExchange=ProductStore, receivedRoutingKey=, receivedDelay=null, deliveryTag=2, messageCount=0, consumerTag=amq.ctag-nWGbRxjFiaeTEoZylv6Hrg, consumerQueue=null])
2017-12-04 09:58:49.815 DEBUG 7450 --- [enerContainer-1] s.i.m.AbstractHeaderMapper$HeaderMatcher : headerName=[amqp_receivedDeliveryMode] WILL be mapped, matched pattern=*
2017-12-04 09:58:49.815 DEBUG 7450 --- [enerContainer-1] s.i.m.AbstractHeaderMapper$HeaderMatcher : headerName=[amqp_contentEncoding] WILL be mapped, matched pattern=*
2017-12-04 09:58:49.815 DEBUG 7450 --- [enerContainer-1] s.i.m.AbstractHeaderMapper$HeaderMatcher : headerName=[amqp_receivedExchange] WILL be mapped, matched pattern=*
2017-12-04 09:58:49.815 DEBUG 7450 --- [enerContainer-1] s.i.m.AbstractHeaderMapper$HeaderMatcher : headerName=[amqp_deliveryTag] WILL be mapped, matched pattern=*
2017-12-04 09:58:49.815 DEBUG 7450 --- [enerContainer-1] s.i.m.AbstractHeaderMapper$HeaderMatcher : headerName=[json__TypeId__] WILL be mapped, matched pattern=*
2017-12-04 09:58:49.815 DEBUG 7450 --- [enerContainer-1] s.i.m.AbstractHeaderMapper$HeaderMatcher : headerName=[amqp_redelivered] WILL be mapped, matched pattern=*
2017-12-04 09:58:49.815 DEBUG 7450 --- [enerContainer-1] s.i.m.AbstractHeaderMapper$HeaderMatcher : headerName=[contentType] WILL be mapped, matched pattern=*
2017-12-04 09:58:49.815 DEBUG 7450 --- [enerContainer-1] s.i.m.AbstractHeaderMapper$HeaderMatcher : headerName=[__TypeId__] WILL be mapped, matched pattern=*
2017-12-04 09:58:49.815 DEBUG 7450 --- [enerContainer-1] o.s.integration.channel.QueueChannel : preSend on channel 'inboundQueueChannel', message: GenericMessage [payload=byte[618], headers={amqp_receivedDeliveryMode=NON_PERSISTENT, amqp_contentEncoding=UTF-8, amqp_receivedExchange=ProductStore, amqp_deliveryTag=2, json__TypeId__=com.art.service.product.bulkimportproduct.data.model.Vendor, amqp_redelivered=false, id=a4868670-240f-ddf2-8a8c-ac4b8d234cdd, amqp_consumerTag=amq.ctag-nWGbRxjFiaeTEoZylv6Hrg, contentType=json, __TypeId__=com.art.service.product.bulkimportproduct.data.model.Vendor, timestamp=1512410329815}]
2017-12-04 09:58:49.815 DEBUG 7450 --- [enerContainer-1] o.s.integration.channel.QueueChannel : postSend (sent=true) on channel 'inboundQueueChannel', message: GenericMessage [payload=byte[618], headers={amqp_receivedDeliveryMode=NON_PERSISTENT, amqp_contentEncoding=UTF-8, amqp_receivedExchange=ProductStore, amqp_deliveryTag=2, json__TypeId__=com.art.service.product.bulkimportproduct.data.model.Vendor, amqp_redelivered=false, id=a4868670-240f-ddf2-8a8c-ac4b8d234cdd, amqp_consumerTag=amq.ctag-nWGbRxjFiaeTEoZylv6Hrg, contentType=json, __TypeId__=com.art.service.product.bulkimportproduct.data.model.Vendor, timestamp=1512410329815}]
2017-12-04 09:58:49.853 INFO 7450 --- [ main] o.s.a.r.l.SimpleMessageListenerContainer : Waiting for workers to finish.
2017-12-04 09:58:49.853 DEBUG 7450 --- [pool-1-thread-6] o.s.a.r.listener.BlockingQueueConsumer : Received cancelOk for tag amq.ctag-nWGbRxjFiaeTEoZylv6Hrg (null); Consumer#7c52fc81: tags=[{}], channel=Cached Rabbit Channel: AMQChannel(amqp://admin#xxxx:5672/,2), conn: Proxy#26f1249d Shared Rabbit Connection: SimpleConnection#680bddf5 [delegate=amqp://admin#xxxx:5672/, localPort= 65035], acknowledgeMode=AUTO local queue size=0
2017-12-04 09:58:49.853 DEBUG 7450 --- [enerContainer-1] o.s.a.r.l.SimpleMessageListenerContainer : Cancelling Consumer#7c52fc81: tags=[{}], channel=Cached Rabbit Channel: AMQChannel(amqp://admin#xxxx:5672/,2), conn: Proxy#26f1249d Shared Rabbit Connection: SimpleConnection#680bddf5 [delegate=amqp://admin#xxxx:5672/, localPort= 65035], acknowledgeMode=AUTO local queue size=0
2017-12-04 09:58:49.853 DEBUG 7450 --- [enerContainer-1] o.s.a.r.listener.BlockingQueueConsumer : Closing Rabbit Channel: Cached Rabbit Channel: AMQChannel(amqp://admin#xxxx:5672/,2), conn: Proxy#26f1249d Shared Rabbit Connection: SimpleConnection#680bddf5 [delegate=amqp://admin#xxxx:5672/, localPort= 65035]
2017-12-04 09:58:49.853 DEBUG 7450 --- [enerContainer-1] o.s.a.r.c.CachingConnectionFactory : Closing cached Channel: AMQChannel(amqp://admin#xxxx:5672/,2)
2017-12-04 09:58:50.027 INFO 7450 --- [ main] o.s.a.r.l.SimpleMessageListenerContainer : Successfully waited for workers to finish.
2017-12-04 09:58:50.027 DEBUG 7450 --- [ main] o.s.c.support.DefaultLifecycleProcessor : Bean 'inboundChannelAdapter' completed its stop procedure
What am I missing here? Why is my message getting processed? Please correct me if I'm missing out something here? Also feel free to ask any other configuration that you feel would help analyze the situation here.
EDIT: After removing the code that closes the application context manually( app.run(args).close() ), I was able to receive the messages, but looks like they are lost after a successful retrieve. sharing the debug log for this behavior.
2017-12-04 14:39:11.297 DEBUG 1498 --- [pool-1-thread-5] o.s.a.r.listener.BlockingQueueConsumer : Storing delivery for Consumer#7219ac49: tags=[{amq.ctag-Z8siptJMdxGU6sXdOHkVCA=ProductStore_Partial}], channel=Cached Rabbit Channel: AMQChannel(amqp://admin#xxxx:5672/,2), conn: Proxy#6df20ade Shared Rabbit Connection: SimpleConnection#7ba63fe5 [delegate=amqp://admin#xxxx:5672/, localPort= 51172], acknowledgeMode=AUTO local queue size=0
2017-12-04 14:39:11.297 DEBUG 1498 --- [enerContainer-1] o.s.a.r.listener.BlockingQueueConsumer : Received message: (Body:'[B#347c8f87(byte[624])' MessageProperties [headers={__TypeId__=com.art.service.product.bulkimportproduct.data.model.Vendor}, timestamp=null, messageId=null, userId=null, receivedUserId=null, appId=null, clusterId=null, type=null, correlationId=null, correlationIdString=null, replyTo=null, contentType=json, contentEncoding=UTF-8, contentLength=0, deliveryMode=null, receivedDeliveryMode=NON_PERSISTENT, expiration=null, priority=0, redelivered=false, receivedExchange=ProductStore, receivedRoutingKey=, receivedDelay=null, deliveryTag=2, messageCount=0, consumerTag=amq.ctag-Z8siptJMdxGU6sXdOHkVCA, consumerQueue=ProductStore_Partial])
2017-12-04 14:39:11.297 DEBUG 1498 --- [enerContainer-1] s.i.m.AbstractHeaderMapper$HeaderMatcher : headerName=[amqp_receivedDeliveryMode] WILL be mapped, matched pattern=*
2017-12-04 14:39:11.297 DEBUG 1498 --- [enerContainer-1] s.i.m.AbstractHeaderMapper$HeaderMatcher : headerName=[amqp_contentEncoding] WILL be mapped, matched pattern=*
2017-12-04 14:39:11.297 DEBUG 1498 --- [enerContainer-1] s.i.m.AbstractHeaderMapper$HeaderMatcher : headerName=[amqp_receivedExchange] WILL be mapped, matched pattern=*
2017-12-04 14:39:11.297 DEBUG 1498 --- [enerContainer-1] s.i.m.AbstractHeaderMapper$HeaderMatcher : headerName=[amqp_deliveryTag] WILL be mapped, matched pattern=*
2017-12-04 14:39:11.297 DEBUG 1498 --- [enerContainer-1] s.i.m.AbstractHeaderMapper$HeaderMatcher : headerName=[json__TypeId__] WILL be mapped, matched pattern=*
2017-12-04 14:39:11.297 DEBUG 1498 --- [enerContainer-1] s.i.m.AbstractHeaderMapper$HeaderMatcher : headerName=[amqp_redelivered] WILL be mapped, matched pattern=*
2017-12-04 14:39:11.297 DEBUG 1498 --- [enerContainer-1] s.i.m.AbstractHeaderMapper$HeaderMatcher : headerName=[contentType] WILL be mapped, matched pattern=*
2017-12-04 14:39:11.297 DEBUG 1498 --- [enerContainer-1] s.i.m.AbstractHeaderMapper$HeaderMatcher : headerName=[__TypeId__] WILL be mapped, matched pattern=*
2017-12-04 14:39:11.297 DEBUG 1498 --- [enerContainer-1] o.s.integration.channel.QueueChannel : preSend on channel 'inboundQueueChannel', message: GenericMessage [payload=byte[624], headers={amqp_receivedDeliveryMode=NON_PERSISTENT, amqp_contentEncoding=UTF-8, amqp_receivedExchange=ProductStore, amqp_deliveryTag=2, json__TypeId__=com.art.service.product.bulkimportproduct.data.model.Vendor, amqp_consumerQueue=ProductStore_Partial, amqp_redelivered=false, id=540399a5-62a6-7178-2524-e274bad4ed13, amqp_consumerTag=amq.ctag-Z8siptJMdxGU6sXdOHkVCA, contentType=json, __TypeId__=com.art.service.product.bulkimportproduct.data.model.Vendor, timestamp=1512427151297}]
2017-12-04 14:39:11.297 DEBUG 1498 --- [enerContainer-1] o.s.integration.channel.QueueChannel : postSend (sent=true) on channel 'inboundQueueChannel', message: GenericMessage [payload=byte[624], headers={amqp_receivedDeliveryMode=NON_PERSISTENT, amqp_contentEncoding=UTF-8, amqp_receivedExchange=ProductStore, amqp_deliveryTag=2, json__TypeId__=com.art.service.product.bulkimportproduct.data.model.Vendor, amqp_consumerQueue=ProductStore_Partial, amqp_redelivered=false, id=540399a5-62a6-7178-2524-e274bad4ed13, amqp_consumerTag=amq.ctag-Z8siptJMdxGU6sXdOHkVCA, contentType=json, __TypeId__=com.art.service.product.bulkimportproduct.data.model.Vendor, timestamp=1512427151297}]
2017-12-04 14:39:11.297 DEBUG 1498 --- [enerContainer-1] o.s.a.r.listener.BlockingQueueConsumer : Retrieving delivery for Consumer#7219ac49: tags=[{amq.ctag-Z8siptJMdxGU6sXdOHkVCA=ProductStore_Partial}], channel=Cached Rabbit Channel: AMQChannel(amqp://admin#xxxx:5672/,2), conn: Proxy#6df20ade Shared Rabbit Connection: SimpleConnection#7ba63fe5 [delegate=amqp://admin#xxxx:5672/, localPort= 51172], acknowledgeMode=AUTO local queue size=0
This goes on repeating and new messages are consumed, but the messages are not getting processed and written to the data-store using the itemWriter provided. Now come to think of it, since I have not provided the tasklet/step bean reference anywhere in this code, is that something I am missing out here?
app.run(args).close();
You are explicitly closing the application context, which shuts everything down.
Closing org.springframework.context.annotation.AnnotationConfigApplicationContext.
I'm trying to get all the files from a ftp directory. My configuration:
<bean id="ftpSessionFactory"
class="org.springframework.integration.ftp.session.DefaultFtpSessionFactory">
<property name="host" value="ftp.aaaaaa.bb"/>
<property name="port" value="21"/>
<property name="clientMode" value="2"/>
<property name="username" value="XXXXXXX"/>
<property name="password" value="YYYYYYY"/>
</bean>
<int:channel id="inbound"/>
<int:inbound-channel-adapter channel="inbound" expression="'GB2AV'">
<int:poller fixed-rate="10000"/>
</int:inbound-channel-adapter>
<int-ftp:outbound-gateway id="gatewayLS"
session-factory="ftpSessionFactory"
request-channel="inbound"
command="ls"
command-options="-1"
filename-pattern="*"
remote-file-separator="\"
expression="payload"
reply-channel="outbound">
</int-ftp:outbound-gateway>
<int:channel id="outbound"/>
<int-stream:stdout-channel-adapter channel="outbound" append-newline="true"/>
It works great against my own test server (Ubuntu / vsftp). Against the production server (unknown OS and ftp server) I'm not able to get the file names. Debug output:
2016-11-01 16:58:17.017 DEBUG 3957 --- [ask-scheduler-1] o.s.integration.channel.DirectChannel : postSend (sent=true) on channel 'outbound', message: GenericMessage [payload=[], headers={file_remoteDirectory=GB2AV\, id=a1a43b85-f086-fd0a-cbbb-a29548578820, timestamp=1478015897017}]
2016-11-01 16:58:17.017 DEBUG 3957 --- [ask-scheduler-1] o.s.integration.channel.DirectChannel : postSend (sent=true) on channel 'inbound', message: GenericMessage [payload=GB2AV, headers={id=e4e4e425-f25d-e4de-7cd8-8912ecd5151b, timestamp=1478015895998}]
2016-11-01 16:58:17.130 DEBUG 3957 --- [-ClientPoller-0] org.apache.tomcat.util.net.NioEndpoint : timeout completed: keys processed=0; now=1478015897130; nextExpiration=1478015897125; keyCount=0; hasEvents=false; eval=false
2016-11-01 16:58:17.130 DEBUG 3957 --- [-ClientPoller-1] org.apache.tomcat.util.net.NioEndpoint : timeout completed: keys processed=0; now=1478015897130; nextExpiration=1478015897125; keyCount=0; hasEvents=false; eval=false
2016-11-01 16:58:18.135 DEBUG 3957 --- [-ClientPoller-1] org.apache.tomcat.util.net.NioEndpoint : timeout completed: keys processed=0; now=1478015898134; nextExpiration=1478015898130; keyCount=0; hasEvents=false; eval=false
2016-11-01 16:58:18.135 DEBUG 3957 --- [-ClientPoller-0] org.apache.tomcat.util.net.NioEndpoint : timeout completed: keys processed=0; now=1478015898134; nextExpiration=1478015898130; keyCount=0; hasEvents=false; eval=false
2016-11-01 16:58:19.136 DEBUG 3957 --- [-ClientPoller-0] org.apache.tomcat.util.net.NioEndpoint : timeout completed: keys processed=0; now=1478015899136; nextExpiration=1478015899134; keyCount=0; hasEvents=false; eval=false
2016-11-01 16:58:19.136 DEBUG 3957 --- [-ClientPoller-1] org.apache.tomcat.util.net.NioEndpoint : timeout completed: keys processed=0; now=1478015899136; nextExpiration=1478015899134; keyCount=0; hasEvents=false; eval=false
2016-11-01 16:58:20.137 DEBUG 3957 --- [-ClientPoller-1] org.apache.tomcat.util.net.NioEndpoint : timeout completed: keys processed=0; now=1478015900137; nextExpiration=1478015900136; keyCount=0; hasEvents=false; eval=false
2016-11-01 16:58:20.137 DEBUG 3957 --- [-ClientPoller-0] org.apache.tomcat.util.net.NioEndpoint : timeout completed: keys processed=0; now=1478015900137; nextExpiration=1478015900136; keyCount=0; hasEvents=false; eval=false
2016-11-01 16:58:21.142 DEBUG 3957 --- [-ClientPoller-0] org.apache.tomcat.util.net.NioEndpoint : timeout completed: keys processed=0; now=1478015901142; nextExpiration=1478015901137; keyCount=0; hasEvents=false; eval=false
2016-11-01 16:58:21.142 DEBUG 3957 --- [-ClientPoller-1] org.apache.tomcat.util.net.NioEndpoint : timeout completed: keys processed=0; now=1478015901142; nextExpiration=1478015901137; keyCount=0; hasEvents=false; eval=false
2016-11-01 16:58:22.147 DEBUG 3957 --- [-ClientPoller-0] org.apache.tomcat.util.net.NioEndpoint : timeout completed: keys processed=0; now=1478015902146; nextExpiration=1478015902142; keyCount=0; hasEvents=false; eval=false
2016-11-01 16:58:22.147 DEBUG 3957 --- [-ClientPoller-1] org.apache.tomcat.util.net.NioEndpoint : timeout completed: keys processed=0; now=1478015902146; nextExpiration=1478015902142; keyCount=0; hasEvents=false; eval=false
2016-11-01 16:58:23.151 DEBUG 3957 --- [-ClientPoller-1] org.apache.tomcat.util.net.NioEndpoint : timeout completed: keys processed=0; now=1478015903151; nextExpiration=1478015903146; keyCount=0; hasEvents=false; eval=false
2016-11-01 16:58:23.151 DEBUG 3957 --- [-ClientPoller-0] org.apache.tomcat.util.net.NioEndpoint : timeout completed: keys processed=0; now=1478015903151; nextExpiration=1478015903146; keyCount=0; hasEvents=false; eval=false
2016-11-01 16:58:24.154 DEBUG 3957 --- [-ClientPoller-0] org.apache.tomcat.util.net.NioEndpoint : timeout completed: keys processed=0; now=1478015904154; nextExpiration=1478015904151; keyCount=0; hasEvents=false; eval=false
2016-11-01 16:58:24.154 DEBUG 3957 --- [-ClientPoller-1] org.apache.tomcat.util.net.NioEndpoint : timeout completed: keys processed=0; now=1478015904154; nextExpiration=1478015904151; keyCount=0; hasEvents=false; eval=false
2016-11-01 16:58:25.159 DEBUG 3957 --- [-ClientPoller-0] org.apache.tomcat.util.net.NioEndpoint : timeout completed: keys processed=0; now=1478015905159; nextExpiration=1478015905154; keyCount=0; hasEvents=false; eval=false
2016-11-01 16:58:25.159 DEBUG 3957 --- [-ClientPoller-1] org.apache.tomcat.util.net.NioEndpoint : timeout completed: keys processed=0; now=1478015905159; nextExpiration=1478015905154; keyCount=0; hasEvents=false; eval=false
2016-11-01 16:58:25.995 DEBUG 3957 --- [ask-scheduler-3] o.s.i.e.SourcePollingChannelAdapter : Poll resulted in Message: GenericMessage [payload=GB2AV, headers={id=ec5a8b67-1b8e-d675-ad3e-e0ee5f4f955d, timestamp=1478015905995}]
2016-11-01 16:58:25.995 DEBUG 3957 --- [ask-scheduler-3] o.s.integration.channel.DirectChannel : preSend on channel 'inbound', message: GenericMessage [payload=GB2AV, headers={id=ec5a8b67-1b8e-d675-ad3e-e0ee5f4f955d, timestamp=1478015905995}]
2016-11-01 16:58:25.995 DEBUG 3957 --- [ask-scheduler-3] o.s.i.ftp.gateway.FtpOutboundGateway : org.springframework.integration.ftp.gateway.FtpOutboundGateway#0 received message: GenericMessage [payload=GB2AV, headers={id=ec5a8b67-1b8e-d675-ad3e-e0ee5f4f955d, timestamp=1478015905995}]
2016-11-01 16:58:26.032 DEBUG 3957 --- [ask-scheduler-3] o.s.i.f.s.DefaultFtpSessionFactory : Connected to server [ftp.aaaaaaa.bb:21]
2016-11-01 16:58:26.159 DEBUG 3957 --- [-ClientPoller-0] org.apache.tomcat.util.net.NioEndpoint : timeout completed: keys processed=0; now=1478015906159; nextExpiration=1478015906159; keyCount=0; hasEvents=false; eval=false
2016-11-01 16:58:26.159 DEBUG 3957 --- [-ClientPoller-1] org.apache.tomcat.util.net.NioEndpoint : timeout completed: keys processed=0; now=1478015906159; nextExpiration=1478015906159; keyCount=0; hasEvents=false; eval=false
2016-11-01 16:58:26.828 DEBUG 3957 --- [ask-scheduler-3] o.s.integration.channel.DirectChannel : preSend on channel 'outbound', message: GenericMessage [payload=[], headers={file_remoteDirectory=GB2AV\, id=08ff9eb6-31e2-a575-a3ef-91ad4616f5f0, timestamp=1478015906828}]
2016-11-01 16:58:26.828 DEBUG 3957 --- [ask-scheduler-3] i.s.CharacterStreamWritingMessageHandler : org.springframework.integration.stream.CharacterStreamWritingMessageHandler#0 received message: GenericMessage [payload=[], headers={file_remoteDirectory=GB2AV\, id=08ff9eb6-31e2-a575-a3ef-91ad4616f5f0, timestamp=1478015906828}]
When connecting to the ftp server manually I can change the directory with cd GB2AV and show all files in this directory with ls. I also tried all kind of combinations of file separators etc. etc.
When working with org.apache.commons.net.ftp.FTPClient I have to use .listNames() which returns String[] instead of .listFiles() which returns an empty object in my case.
Is there anything I can do in the gateway configuration or does it sound like some missing feature support on the server side?