1

全体的なアプリケーションコンテキスト内で子コンテキストとしてロードする春統合 sftp フローがあります。これは、動的 ftp SI の例に基づいています。私の統合フローには、reactor やストリームに関するものは何もありません。sftpサーバーにファイルを転送するためにdirect channel接続するだけの簡単な流れです。sftp-outbound-gateway単体テストを実行することもでき、フローは正常に動作します (ファイルを転送できます) が、完全な親アプリケーションをロードし、この sftp フローがロードされた状態で子コンテキストを初期化する統合テストを実行すると、エラーがスローされます。リアクター/StringUtils クラスを見つけることができません。

その理由は、spring-integration-sftp がリアクター jar を一時的な dep としてロードするためのようですが、私の親アプリケーションにはクラスパスに別のバージョンのリアクターが既にロードされているため、リアクター コアをスプリング統合 dep から除外しました。リアクターコアをスプリング統合から除外しないと、バージョンの競合が発生するため、除外したいと思います。

reactorVersion = 2.0.0.M2

compile("io.projectreactor:reactor-core:$reactorVersion")
compile "io.projectreactor.spring:reactor-spring-context:$reactorVersion"

compile("org.springframework.integration:spring-integration-sftp") {
    exclude module: "reactor-core"
}

SI フローの初期化

context = new ClassPathXmlApplicationContext(new String[] { "classpath:adapters/"
                + sink.getConfigurationFile() }, false);
        setEnvironment(context, sink);
        context.setParent(parentContext);
        context.refresh();
        context.registerShutdownHook();

統合テストを実行したときのエラー

org.springframework.beans.factory.BeanDefinitionStoreException: クラスパス リソース [adapters/sftp.xml] から XML ドキュメントを解析中に予期しない例外が発生しました。ネストされた例外は、org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:414) の java.lang.NoClassDefFoundError: reactor/util/StringUtils です。org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions( XmlBeanDefinitionReader.java:336) org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304) org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:181)

最後にSIフロー

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:task="http://www.springframework.org/schema/task" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:int="http://www.springframework.org/schema/integration"
xmlns:int-sftp="http://www.springframework.org/schema/integration/sftp"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd
    http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd
    http://www.springframework.org/schema/integration/sftp http://www.springframework.org/schema/integration/sftp/spring-integration-sftp.xsd">

<import resource="common.xml" />

<bean id="sftpSessionFactory"
    class="org.springframework.integration.file.remote.session.CachingSessionFactory">
    <constructor-arg ref="defaultSftpSessionFactory" />
</bean>

<bean id="defaultSftpSessionFactory"
    class="org.springframework.integration.sftp.session.DefaultSftpSessionFactory">
    <property name="host" value="${sink.host}" />
    <property name="port" value="22" />
    <property name="privateKey" value="${sink.private.key}" />
    <property name="privateKeyPassphrase" value="${sink.private.key.phrase}" />
    <property name="user" value="${sink.user}" />
    <property name="password" value="${sink.pass}" />
</bean>

<int:channel id="input" />

<int-sftp:outbound-channel-adapter
    auto-startup="true" session-factory="sftpSessionFactory" channel="input"
    remote-directory="${sink.path}" remote-filename-generator-expression="headers['remote_file_name']">
    <int-sftp:request-handler-advice-chain>
        <bean
            class="org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice">
            <property name="onSuccessExpression" value="payload" />
            <property name="successChannel" ref="successChannel" />
            <property name="onFailureExpression" value="payload" />
            <property name="failureChannel" ref="failureChannel" />
            <property name="trapException" value="true" />
        </bean>
    </int-sftp:request-handler-advice-chain>
</int-sftp:outbound-channel-adapter>

<int:channel id="successChannel" />
<int:service-activator input-channel="successChannel"
    ref="completionHandler" method="handle" />

<int:channel id="failureChannel" />
<int:service-activator input-channel="failureChannel"
    ref="failureHandler" method="handle" />


原子炉構成を追加するための更新

@Configuration
@EnableReactor
public class ReactorConfiguration {

static {
    Environment.initializeIfEmpty().assignErrorJournal();
}

@Bean
public EventBus eventBus() {
    return EventBus.config().env(Environment.get()).dispatcher(Environment.SHARED).get();
}

@Bean
public IdGenerator randomUUIDGenerator() {
    return new IdGenerator() {
        @Override
        public UUID generateId() {
            return UUIDUtils.random();
        }
    };
}
}
4

1 に答える 1