PayloadTypeRouter resolves the message channel based on the message content type.
Example
@ServiceActivator(inputChannel = "payloadTypeRoutingChannel")
@Bean
public PayloadTypeRouter router() {
PayloadTypeRouter router = new PayloadTypeRouter();
router.setChannelMapping(String.class.getName(), "stringChannel");
router.setChannelMapping(Integer.class.getName(), "integerChannel");
return router;
}
As per above definition, if the content type is string, then message is routed to stringChannel. If the content type is Integer, then message is routed to integerChannel.
Find the below working application.
Step 1: Create new maven project ‘payload-type-router-demo’.
Step 2: Update pom.xml with maven dependencies.
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sample.app</groupId>
<artifactId>payload-type-router-demo</artifactId>
<version>1</version>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-parent -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.0</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-integration</artifactId>
</dependency>
</dependencies>
</project>
Step 3: Define custom gateway.
CustomGateway.java
package com.sample.app.gateway;
import org.springframework.integration.annotation.Gateway;
import org.springframework.integration.annotation.MessagingGateway;
import org.springframework.messaging.Message;
@MessagingGateway(name = "myGateway", defaultRequestChannel = "payloadTypeRoutingChannel")
public interface CustomGateway {
@Gateway(requestChannel = "payloadTypeRoutingChannel")
public void print(Message<?> message);
}
Step 4: Define endpoints.
ConsumerEndpoint1.java
package com.sample.app.endpoints;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.messaging.Message;
import org.springframework.stereotype.Component;
@Component
public class ConsumerEndpoint1 {
@ServiceActivator(inputChannel = "stringChannel")
public void consumeStringMessage(Message<String> message) {
System.out.println("ConsumerEndpoint1 -> Received message from stringChannel : " + message.getPayload());
}
@ServiceActivator(inputChannel = "integerChannel")
public void consumeIntegerMessage(Message<String> message) {
System.out.println("ConsumerEndpoint1 -> Received message from integerChannel : " + message.getPayload());
}
}
Step 5: Define main application class.
App.java
package com.sample.app;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.integration.router.PayloadTypeRouter;
import org.springframework.integration.support.MessageBuilder;
import org.springframework.messaging.Message;
import com.sample.app.gateway.CustomGateway;
@SpringBootApplication
@Configuration
public class App {
@ServiceActivator(inputChannel = "payloadTypeRoutingChannel")
@Bean
public PayloadTypeRouter router() {
PayloadTypeRouter router = new PayloadTypeRouter();
router.setChannelMapping(String.class.getName(), "stringChannel");
router.setChannelMapping(Integer.class.getName(), "integerChannel");
return router;
}
@Autowired
private CustomGateway customGateway;
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
@Bean
public CommandLineRunner demo() {
return (args) -> {
for (int i = 0; i < 5; i++) {
Message<?> message = MessageBuilder.withPayload(i).build();
customGateway.print(message);
}
for (int i = 0; i < 5; i++) {
Message<?> message = MessageBuilder.withPayload("Secret message : " + i).build();
customGateway.print(message);
}
};
}
}
Total project structure looks like below.
Run App.java, you will see below messages in console.
ConsumerEndpoint1 -> Received message from integerChannel : 0 ConsumerEndpoint1 -> Received message from integerChannel : 1 ConsumerEndpoint1 -> Received message from integerChannel : 2 ConsumerEndpoint1 -> Received message from integerChannel : 3 ConsumerEndpoint1 -> Received message from integerChannel : 4 ConsumerEndpoint1 -> Received message from stringChannel : Secret message : 0 ConsumerEndpoint1 -> Received message from stringChannel : Secret message : 1 ConsumerEndpoint1 -> Received message from stringChannel : Secret message : 2 ConsumerEndpoint1 -> Received message from stringChannel : Secret message : 3 ConsumerEndpoint1 -> Received message from stringChannel : Secret message : 4
You can download complete working application from below link.
https://github.com/harikrishna553/springboot/tree/master/spring-integration/payload-type-router-demo
Previous Next Home
No comments:
Post a Comment