Spring XD, Reactor Streams: конфигурация без XML?

На http://docs.spring.io/spring-xd/docs/1.2.1.RELEASE/reference/html/#reactor-streams документировано, как Reactor Stream реализован в Spring XD. В соответствии с этой документацией я создал собственное приложение:

/src/main/java/mypackage/MyReactorStream.java:

...
import org.springframework.xd.reactor.Processor;
import reactor.rx.Stream;

public class MyReactorStream implements Processor<SomePOJO, SomePOJO> {

    private int intParam;
    public void setIntParam(int intParam) { ... }

    @Override
    public Stream<SomePOJO> process(Stream<SomePOJO> inputStream) { ... }

}

/src/main/resources/config/config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans ...>

    <bean id="messageProcessor" class="mypackage.MyReactorStream">
        <property name="intParam" value="${intParam}" />
    </bean>

    <!-- The rest is boilerplate that XD 1.1 RC1 will avoid you having to provide -->

    <int:channel id="input" />

    <bean name="messageHandler"
        class="org.springframework.xd.reactor.BroadcasterMessageHandler">
        <constructor-arg ref="messageProcessor" />
    </bean>

    <int:service-activator input-channel="input"
        ref="messageHandler" output-channel="output" />

    <int:channel id="output" />

</beans>

Я хочу использовать аннотации @Configuration и Spring для своего класса Java вместо конфигурации XML. Как это возможно?


person Johannes Flügel    schedule 03.09.2015    source источник


Ответы (2)


Следующие работы.

/src/main/java/mypackage/ModuleConfiguration.java:

...
import javax.validation.constraints.NotNull;
import org.springframework.messaging.MessageHandler;
import org.springframework.xd.module.options.spi.ModuleOption;
import org.springframework.xd.reactor.BroadcasterMessageHandler;

@Configuration
@EnableIntegration
@ComponentScan(value = { "mypackage" })
public class ModuleConfiguration {

    private int intParam;

    @NotNull
    public int getIntParam() {
        return intParam;
    }

    @ModuleOption("help text that appears if you type 'module info ...' in the XD shell")
    public void setIntParam(int intParam) {
        this.intParam = intParam;
    }

    @Autowired
    private MyReactorStream myReactorStream;

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

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

    @Bean
    MyReactorStream myReactorStream() {
        return new myReactorStream();
    }

    @Bean
    @ServiceActivator(inputChannel = "input")
    MessageHandler messageHandler() {
        BroadcasterMessageHandler handler = new BroadcasterMessageHandler(myReactorStream);
        handler.setOutputChannel(output());
        return handler;
    }    
}

/src/main/java/mypackage/MyReactorStream.java:

...
import org.springframework.xd.reactor.Processor;
import reactor.rx.Stream;

public class MyReactorStream implements Processor<SomePOJO, SomePOJO> {

    @Value("${intParam}")
    private int intParam;

    @Override
    public Stream<SomePOJO> process(Stream<SomePOJO> inputStream) {
        return inputStream.map(pojo -> {
            ...
            pojo.setIntParam(intParam)
            return pojo;
        });
    }
}

/src/main/resources/config/spring-module.properties:

options_class = mypackage.ModuleConfiguration
base_packages=mypackage

Нет необходимости в конфигурации XML.

person Johannes Flügel    schedule 09.09.2015

См. DSL и Tweet примеры пользовательских модулей с использованием конфигурации Java .

person Gary Russell    schedule 03.09.2015
comment
К сожалению, эти образцы не очень мне помогают. В моем случае у меня есть экземпляр org.springframework.xd.reactor.BroadcasterMessageHandler — как он будет использоваться дальше? Понятия не имею. - person Johannes Flügel; 08.09.2015
comment
Определите его как @Bean, аннотированный как @ServiceActivator; см. документацию по настройке Spring Integration на основе аннотаций Примеры. - person Gary Russell; 08.09.2015