RockWad
RockWad

Reputation: 15

Getting Spring Integration 4.0 with Spring-Boot

I watched this great video to help bootstrap my understanding of Spring Integration 4.0

https://www.youtube.com/watch?v=g3DgdSqEgzI

Going line for line in this demo, the code doesn't work. It's mainly due to conflicts between Spring Integration and the spring-boot-start-integration.

Spring Initalizr doesn't provide much help either....

Here's the very simple code:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.integration.annotation.MessageEndpoint;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.ip.tcp.TcpInboundGateway;
import org.springframework.integration.ip.tcp.connection.TcpNetServerConnectionFactory;
import org.springframework.messaging.MessageChannel;

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {
    public static void main(String[] args) throws Exception {
        ConfigurableApplicationContext ctx = SpringApplication.run(Application.class);
        System.in.read();
        ctx.close();
    }

    @Bean
    TcpNetServerConnectionFactory cf () {
        return new TcpNetServerConnectionFactory(9876);
    }

    @Bean
    TcpInboundGateway tcpGate() {
        TcpInboundGateway gateway = new TcpInboundGateway();
        gateway.setConnectionFactory(cf());
        gateway.setRequestChannel(requestChannel());
        return gateway;
    }

    @Bean
    public MessageChannel requestChannel() {
        return new DirectChannel();
    }

    @MessageEndpoint
    public static class Echo {
        @ServiceActivator(inputChannel = "requestChannel")
        public String echo(byte [] in) {
            return "echo: " + new String(in);
        }
    }

    @Autowired
    private Environment env;
}

And here's the 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>xsoft-examples</groupId>
<artifactId>xsoft-examples-integration</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Spring Integration Demo</description>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.0.2.RELEASE</version>
    <relativePath/>
    <!--  lookup parent from repository  -->
</parent>
<dependencies>

    <dependency>
        <groupId>org.springframework.integration</groupId>
        <artifactId>spring-integration-core</artifactId>
        <version>4.0.1.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.integration</groupId>
        <artifactId>spring-integration-ws</artifactId>
        <version>4.0.1.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.integration</groupId>
        <artifactId>spring-integration-xml</artifactId>
        <version>4.0.1.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.integration</groupId>
        <artifactId>spring-integration-ip</artifactId>
        <version>4.0.1.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>4.0.3.RELEASE</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

</dependencies>
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <start-class>com.xsoft.demo.Application</start-class>
    <java.version>1.7</java.version>
</properties>
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

And when I connect to port 9876 via telnet and send a "hello" string, I get...

org.springframework.messaging.MessageDeliveryException: Dispatcher has no subscribers for channel 'application.requestChannel'.

Upvotes: 1

Views: 3380

Answers (1)

Artem Bilan
Artem Bilan

Reputation: 121560

The demo you have seen uses the latest SNPASHOT of Spring Boot. But you configure your POM to use <version>1.0.2.RELEASE</version>, which isn't compatible with Spring Integration 4.0.

Add this @EnableIntegration alongside with @Configuration to make it worked

Upvotes: 2

Related Questions