Related
I am able to read the response from the server but I am getting this message on the client-side "cannot correlate response - no pending reply for cached:localhost:3002:46550:f6234e17-c486-4506-82c8-a757a08ba73d." after a minute, though the server is not sending any message back, From the server-side, I can see this message "Connection lost: " 127.0.0.1" printed out in the log.
#Bean
public AbstractClientConnectionFactory clientConnectionFactory() {
TcpNioClientConnectionFactory tcpNioClientConnectionFactory = new TcpNioClientConnectionFactory(host, port);
tcpNioClientConnectionFactory.setUsingDirectBuffers(true);
tcpNioClientConnectionFactory.setApplicationEventPublisher(applicationEventPublisher);
return new CachingClientConnectionFactory(tcpNioClientConnectionFactory, connectionPoolSize);
}
#Bean
public MessageChannel outboundChannel() {
return new DirectChannel();
}
#Bean
#ServiceActivator(inputChannel = "outboundChannel")
public MessageHandler outboundGateway(AbstractClientConnectionFactory clientConnectionFactory) {
TcpOutboundGateway tcpOutboundGateway = new TcpOutboundGateway();
tcpOutboundGateway.setConnectionFactory(clientConnectionFactory);
tcpOutboundGateway.setRemoteTimeout(Long.MAX_VALUE);
tcpOutboundGateway.setRequestTimeout(5_000);
return tcpOutboundGateway;
}
2022-03-22 13:14:46,878 [http-nio-9000-exec-4][][][][][][][] DEBUG org.springframework.integration.channel.DirectChannel - preSend on channel 'bean 'outboundChannel'; defined in: 'class path resource [com/wibmo/aerionpg/config/TcpClientConfig.class]'; from source: 'com.wibmo.aerionpg.config.TcpClientConfig.outboundChannel()'', message: GenericMessage [payload=byte[602], headers={replyChannel=org.springframework.messaging.core.GenericMessagingTemplate$TemporaryReplyChannel#2936326d, errorChannel=org.springframework.messaging.core.GenericMessagingTemplate$TemporaryReplyChannel#2936326d, id=062c0c73-addf-e90c-4b80-aebc70ec009b, timestamp=1647935086878}]
2022-03-22 13:14:46,878 [http-nio-9000-exec-4][][][][][][][] DEBUG org.springframework.integration.ip.tcp.TcpOutboundGateway - bean 'outboundGateway'; defined in: 'class path resource [com/wibmo/aerionpg/config/TcpClientConfig.class]'; from source: 'com.wibmo.aerionpg.config.TcpClientConfig.outboundGateway(org.springframework.integration.ip.tcp.connection.AbstractClientConnectionFactory)' received message: GenericMessage [payload=byte[602], headers={replyChannel=org.springframework.messaging.core.GenericMessagingTemplate$TemporaryReplyChannel#2936326d, errorChannel=org.springframework.messaging.core.GenericMessagingTemplate$TemporaryReplyChannel#2936326d, id=062c0c73-addf-e90c-4b80-aebc70ec009b, timestamp=1647935086878}]
2022-03-22 13:14:46,879 [http-nio-9000-exec-4][][][][][][][] DEBUG org.springframework.integration.util.SimplePool - Obtained TcpNioConnection:127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29 from pool.
2022-03-22 13:14:46,879 [http-nio-9000-exec-4][][][][][][][] DEBUG org.springframework.integration.ip.tcp.TcpOutboundGateway - Added pending reply Cached:127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29
2022-03-22 13:14:46,879 [http-nio-9000-exec-4][][][][][][][] DEBUG org.springframework.integration.ip.tcp.connection.TcpNioConnection - 127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29 writing 604
2022-03-22 13:14:46,879 [http-nio-9000-exec-4][][][][][][][] DEBUG org.springframework.integration.ip.tcp.connection.TcpNioConnection - 127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29 Message sent GenericMessage [payload=byte[602], headers={replyChannel=org.springframework.messaging.core.GenericMessagingTemplate$TemporaryReplyChannel#2936326d, errorChannel=org.springframework.messaging.core.GenericMessagingTemplate$TemporaryReplyChannel#2936326d, id=062c0c73-addf-e90c-4b80-aebc70ec009b, timestamp=1647935086878}]
2022-03-22 13:14:47,382 [pool-2-thread-1][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioClientConnectionFactory - null: Connection is open: 127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29
2022-03-22 13:14:47,382 [pool-2-thread-1][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioClientConnectionFactory - Host 127.0.0.1 port 6001 SelectionCount: 1
2022-03-22 13:14:47,382 [pool-2-thread-2][][][][][][][] DEBUG org.springframework.integration.ip.tcp.connection.TcpNioConnection - 127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29 Reading...
2022-03-22 13:14:47,382 [pool-2-thread-2][][][][][][][] DEBUG org.springframework.integration.ip.tcp.connection.TcpNioConnection - 127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29 Running an assembler
2022-03-22 13:14:47,383 [pool-2-thread-2][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioConnection - Before read: 0/61440
2022-03-22 13:14:47,383 [pool-2-thread-2][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioConnection - After read: 614/61440
2022-03-22 13:14:47,383 [pool-2-thread-2][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioConnection - After flip: 0/614
2022-03-22 13:14:47,383 [pool-2-thread-3][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioConnection - 127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29 Nio message assembler running...
2022-03-22 13:14:47,383 [pool-2-thread-3][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioConnection - 127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29 checking data avail: 0 pending: true
2022-03-22 13:14:47,383 [pool-2-thread-3][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioConnection - 127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29 checking data avail (convert): 0 pending: true
2022-03-22 13:14:47,383 [pool-2-thread-2][][][][][][][] DEBUG org.springframework.integration.ip.tcp.connection.TcpNioConnection - Read 614 into raw buffer
2022-03-22 13:14:47,383 [pool-2-thread-2][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioConnection - 127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29 Sending 614 to pipe
2022-03-22 13:14:47,383 [pool-2-thread-3][][][][][][][] DEBUG org.springframework.integration.ip.tcp.serializer.ByteArrayCrLfSerializer - Available to read: 614
2022-03-22 13:14:47,383 [pool-2-thread-1][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioClientConnectionFactory - null: Connection is open: 127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29
2022-03-22 13:14:47,383 [pool-2-thread-1][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioClientConnectionFactory - Host 127.0.0.1 port 6001 SelectionCount: 0
2022-03-22 13:14:47,383 [pool-2-thread-3][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioConnection - 127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29 checking data avail: 0 pending: false
2022-03-22 13:14:47,383 [pool-2-thread-3][][][][][][][] TRACE org.springframework.integration.ip.tcp.TcpOutboundGateway - onMessage: Cached:127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29(GenericMessage [payload=byte[612], headers={ip_tcp_remotePort=6001, ip_connectionId=Cached:127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29, ip_actualConnectionId=127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29, ip_localInetAddress=/127.0.0.1, ip_address=127.0.0.1, id=f9619787-4d0c-e894-ae05-f2eca0c4a1b4, ip_hostname=127.0.0.1, timestamp=1647935087383}])
2022-03-22 13:14:47,383 [pool-2-thread-3][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioConnection - 127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29 checking data avail: 0 pending: false
2022-03-22 13:14:47,383 [pool-2-thread-3][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioConnection - 127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29 Nio message assembler exiting... avail: 0
2022-03-22 13:14:47,383 [http-nio-9000-exec-4][][][][][][][] DEBUG org.springframework.integration.ip.tcp.TcpOutboundGateway - Response GenericMessage [payload=byte[612], headers={ip_tcp_remotePort=6001, ip_connectionId=Cached:127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29, ip_actualConnectionId=127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29, ip_localInetAddress=/127.0.0.1, ip_address=127.0.0.1, id=f9619787-4d0c-e894-ae05-f2eca0c4a1b4, ip_hostname=127.0.0.1, timestamp=1647935087383}]
2022-03-22 13:14:47,383 [http-nio-9000-exec-4][][][][][][][] DEBUG org.springframework.integration.ip.tcp.TcpOutboundGateway - Removed pending reply Cached:127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29
2022-03-22 13:14:47,383 [http-nio-9000-exec-4][][][][][][][] DEBUG org.springframework.integration.util.SimplePool - Releasing TcpNioConnection:127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29 back to the pool
2022-03-22 13:14:47,383 [http-nio-9000-exec-4][][][][][][][] DEBUG org.springframework.integration.channel.DirectChannel - postSend (sent=true) on channel 'bean 'outboundChannel'; defined in: 'class path resource [com/wibmo/aerionpg/config/TcpClientConfig.class]'; from source: 'com.wibmo.aerionpg.config.TcpClientConfig.outboundChannel()'', message: GenericMessage [payload=byte[602], headers={replyChannel=org.springframework.messaging.core.GenericMessagingTemplate$TemporaryReplyChannel#2936326d, errorChannel=org.springframework.messaging.core.GenericMessagingTemplate$TemporaryReplyChannel#2936326d, id=062c0c73-addf-e90c-4b80-aebc70ec009b, timestamp=1647935086878}]
2022-03-22 13:15:47,383 [pool-2-thread-1][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioClientConnectionFactory - null: Connection is open: 127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29
2022-03-22 13:15:47,383 [pool-2-thread-1][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioClientConnectionFactory - Host 127.0.0.1 port 6001 SelectionCount: 1
2022-03-22 13:15:47,384 [pool-2-thread-3][][][][][][][] DEBUG org.springframework.integration.ip.tcp.connection.TcpNioConnection - 127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29 Reading...
2022-03-22 13:15:47,384 [pool-2-thread-3][][][][][][][] DEBUG org.springframework.integration.ip.tcp.connection.TcpNioConnection - 127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29 Running an assembler
2022-03-22 13:15:47,384 [pool-2-thread-3][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioConnection - Before read: 0/61440
2022-03-22 13:15:47,384 [pool-2-thread-3][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioConnection - After read: 14/61440
2022-03-22 13:15:47,384 [pool-2-thread-3][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioConnection - After flip: 0/14
2022-03-22 13:15:47,384 [pool-2-thread-3][][][][][][][] DEBUG org.springframework.integration.ip.tcp.connection.TcpNioConnection - Read 14 into raw buffer
2022-03-22 13:15:47,384 [pool-2-thread-3][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioConnection - 127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29 Sending 14 to pipe
2022-03-22 13:15:47,384 [pool-2-thread-1][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioClientConnectionFactory - null: Connection is open: 127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29
2022-03-22 13:15:47,384 [pool-2-thread-1][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioClientConnectionFactory - Host 127.0.0.1 port 6001 SelectionCount: 0
2022-03-22 13:15:47,384 [pool-2-thread-1][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioClientConnectionFactory - null: Connection is open: 127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29
2022-03-22 13:15:47,384 [pool-2-thread-1][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioClientConnectionFactory - Host 127.0.0.1 port 6001 SelectionCount: 1
2022-03-22 13:15:47,384 [pool-2-thread-2][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioConnection - 127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29 Nio message assembler running...
2022-03-22 13:15:47,384 [pool-2-thread-2][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioConnection - 127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29 checking data avail: 14 pending: false
2022-03-22 13:15:47,384 [pool-2-thread-2][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioConnection - 127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29 checking data avail (convert): 14 pending: false
2022-03-22 13:15:47,384 [pool-2-thread-2][][][][][][][] DEBUG org.springframework.integration.ip.tcp.serializer.ByteArrayCrLfSerializer - Available to read: 14
2022-03-22 13:15:47,385 [pool-2-thread-2][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioConnection - 127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29 checking data avail: 0 pending: false
2022-03-22 13:15:47,385 [pool-2-thread-2][][][][][][][] TRACE org.springframework.integration.ip.tcp.TcpOutboundGateway - onMessage: Cached:127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29(GenericMessage [payload=byte[12], headers={ip_tcp_remotePort=6001, ip_connectionId=Cached:127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29, ip_actualConnectionId=127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29, ip_localInetAddress=/127.0.0.1, ip_address=127.0.0.1, id=b9f23b01-6816-65f1-c1e9-f4cf1c21bccc, ip_hostname=127.0.0.1, timestamp=1647935147385}])
2022-03-22 13:15:47,385 [pool-2-thread-2][][][][][][][] ERROR org.springframework.integration.ip.tcp.TcpOutboundGateway - Cannot correlate response - no pending reply for Cached:127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29
2022-03-22 13:15:47,386 [pool-2-thread-2][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioConnection - 127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29 checking data avail: 0 pending: false
2022-03-22 13:15:47,386 [pool-2-thread-2][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioConnection - 127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29 Nio message assembler exiting... avail: 0
2022-03-22 13:15:47,386 [pool-2-thread-3][][][][][][][] DEBUG org.springframework.integration.ip.tcp.connection.TcpNioConnection - 127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29 Reading...
2022-03-22 13:15:47,386 [pool-2-thread-3][][][][][][][] DEBUG org.springframework.integration.ip.tcp.connection.TcpNioConnection - 127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29 Running an assembler
2022-03-22 13:15:47,386 [pool-2-thread-2][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioConnection - 127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29 Nio message assembler running...
2022-03-22 13:15:47,386 [pool-2-thread-2][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioConnection - 127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29 checking data avail: 0 pending: true
2022-03-22 13:15:47,386 [pool-2-thread-2][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioConnection - 127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29 checking data avail (convert): 0 pending: true
2022-03-22 13:15:47,386 [pool-2-thread-3][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioConnection - Before read: 0/61440
2022-03-22 13:15:47,386 [pool-2-thread-3][][][][][][][] DEBUG org.springframework.integration.ip.tcp.connection.CachingClientConnectionFactory$CachedConnection - Connection Cached:127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29 has already been released
2022-03-22 13:15:47,387 [pool-2-thread-3][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioConnection - Published: TcpConnectionCloseEvent [source=TcpNioConnection:127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29], [factory=unknown, connectionId=127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29] **CLOSED**
2022-03-22 13:15:47,387 [pool-2-thread-3][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioConnection - After read: 0/61440
2022-03-22 13:15:47,387 [pool-2-thread-3][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioConnection - After flip: 0/0
2022-03-22 13:15:47,387 [pool-2-thread-3][][][][][][][] DEBUG org.springframework.integration.ip.tcp.connection.TcpNioConnection - Read 0 into raw buffer
2022-03-22 13:15:47,387 [pool-2-thread-3][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioConnection - 127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29 Sending 0 to pipe
2022-03-22 13:15:47,387 [pool-2-thread-2][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioConnection - 127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29 checking data avail: 0 pending: false
2022-03-22 13:15:47,387 [pool-2-thread-2][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioConnection - 127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29 checking data avail: 0 pending: false
2022-03-22 13:15:47,387 [pool-2-thread-2][][][][][][][] TRACE org.springframework.integration.ip.tcp.connection.TcpNioConnection - 127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29 Nio message assembler exiting... avail: 0
2022-03-22 13:15:47,387 [pool-2-thread-3][][][][][][][] TRACE org.springframework.integration.ip.tcp.TcpOutboundGateway - onMessage: Cached:127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29(ErrorMessage [payload=java.io.EOFException: Connection is closed, headers={id=78de443c-cf7a-5e4d-89bc-0b8c4027b5a5, ip_connectionId=Cached:127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29, timestamp=1647935147387, ip_actualConnectionId=127.0.0.1:6001:54856:37e334df-5c89-4b51-af4f-727d0f484a29}])
It looks to me like the server is closing the socket 1 minute later, but before doing that, it is sending a message - 14 bytes; presumably 12 bytes + \r\n, given your configuration.
Starting with version 5.4, you can add an unsolicitedMessageChannel to the outbound gateway; these extra messages will be sent there, instead of generating that log message.
/**
* Set the channel name for unsolicited incoming messages, or late replies.
* #param unsolicitedMessageChannelName the channel name.
* #since 5.4
*/
public void setUnsolicitedMessageChannelName(String unsolicitedMessageChannelName) {
this.unsolicitedMessageChannelName = unsolicitedMessageChannelName;
}
/**
* Set the channel for unsolicited incoming messages, or late replies.
* #param unsolicitedMessageChannel the channel.
* #since 5.4
*/
public void setUnsolicitedMessageChannel(MessageChannel unsolicitedMessageChannel) {
this.unsolicitedMessageChannel = unsolicitedMessageChannel;
}
You can add message handler (e.g. #ServiceActivator) to consume from that channel to see what the content is, or you can set it to "nullChannel" to just discard it.
EDIT
Here is an example, using the Java DSL:
#SpringBootApplication
public class So71552834Application {
public static void main(String[] args) {
SpringApplication.run(So71552834Application.class, args);
}
#Bean
IntegrationFlow clientFlow() {
return IntegrationFlows.from(Gate.class)
.handle(Tcp.outboundGateway(Tcp.netClient("localhost", 1234))
.unsolictedMessageChannelName("unsolicited"))
.get();
}
#ServiceActivator(inputChannel = "unsolicited")
public void handleUnsolicited(String in) {
System.out.println("Unsolicited response: " + in);
}
// emulate the server side.
#Bean
IntegrationFlow serverFlow() {
return IntegrationFlows.from(Tcp.inboundGateway(Tcp.netServer(1234)))
.transform(Transformers.objectToString())
.<String>handle((p, h) -> p.toUpperCase())
.get();
}
#Bean
IntegrationFlow serverOut(AbstractServerConnectionFactory scf) {
return f -> f.handle(Tcp.outboundAdapter(scf));
}
#Bean
ApplicationRunner runner(Gate gate, IntegrationFlow serverOut, AbstractServerConnectionFactory scf) {
return args -> {
System.out.println(new String(gate.exchange("test")));
System.out.println("Hit enter to send an unsolicited message");
System.in.read();
String id = scf.getOpenConnectionIds().iterator().next();
serverOut.getInputChannel().send(MessageBuilder.withPayload("what's this?")
.setHeader(IpHeaders.CONNECTION_ID, id)
.build());
};
}
}
interface Gate {
byte[] exchange(String out);
}
TEST
Hit enter to send an unsolicited message
Unsolicited response: what's this?
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 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).