消息传递异常:sftp出站通道适配器中的org.springframework.messaging.MessageDeliveryException

时间:2015-07-28 03:27:10

标签: spring spring-integration sftp

消息传递异常:org.springframework.messaging.MessageDeliveryException:Dispatcher没有订阅者的频道&org.springframework.web.context.WebApplicationContext:/。sftpChannel'。;嵌套异常是org.springframework.integration.MessageDispatchingException:Dispatcher没有订阅者

我正在尝试将文件从本地发送到远程服务器。

我的申请上下文

 <bean id="startupBean" class="com.SchedulerImpl" init-method="run"/>
 <bean id="applicationContextProvider" class="com.ApplicationContextProvider"></bean>

 <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="${destination.host}"/>
        <property name="privateKey" value="${destination.privateKey}"/>
        <property name="privateKeyPassphrase" value="${destination.privateKeyPassphrase}"/>
        <property name="port" value="${destination.port}"/>
        <property name="user" value="${destination.user}"/>
        <property name="sessionConfig" ref="props"/>
    </bean>

     <util:properties id="props">
            <prop key="PreferredAuthentications">publickey</prop>
        </util:properties>  
    <int:channel id="sftpChannel"/>

    <int-sftp:outbound-channel-adapter id="sftpOutboundAdapter" 
                                        session-factory="sftpSessionFactory"
                                        channel="sftpChannel" 
                                        auto-startup ="false"
                                        charset="UTF-8" 
                                        remote-directory="/destinationFolder/"
                                        remote-file-separator="/">
     </int-sftp:outbound-channel-adapter>

     <int:publish-subscribe-channel id="contextRefreshEvents"/>

     <int:outbound-channel-adapter channel="contextRefreshEvents"
                            expression="sftpOutboundAdapter.start()" />

所以我在sftp类的代码中获得了applicationContext的相同实例:

ApplicationContext context = appContext.getApplicationContext();

MessageChannel sftpChannel =(MessageChannel)context.getBean(&#34; sftpChannel&#34;);

和@Autowired私有ApplicationContextProvider appContext; 在同一个sftp类中。

还有另一个类ApplicationContextProvider,它实现了ApplicationContextAware,它可以帮助我获取当前的ApplicaitonContext。

我不明白为什么我找不到订阅者。 我把auto-startup = false。 获取当前sftpChannel bean的正确方法是什么,它给了我相同的applicationContext实例。

如果我做appContext = new classpathxmlapplicationcontext(applicationcontext.xml) 我在startupBean中遇到错误,所以我不想这样做。

现在我正在实现ApplicationContextAware,并且我收到了Messaging异常。

有人可以帮帮我吗?

我正在使用spring 3

1 个答案:

答案 0 :(得分:0)

你从头脑中分享了很多,最后你的问题变得一团糟。

从另一方面让我解释一下发生了什么。

由于auto-startup ="false"上有<int-sftp:outbound-channel-adapter>send的任何sftpChannel都会导致该异常,直到您启动该适配器。

我从另一方面看到你这样做,虽然我们看不到谁发起contextRefreshEvents条消息,但我们相信你是<int-event:inbound-channel-adapter>

还有一点,你没有告诉我们file from local。好的,我猜是<int-file:inbound-channel-adapter>。这是可轮询的,并在应用程序启动后开始轮询本地导向器。因此,这可能会导致Dispatcher has no subscribers,因为sftpOutboundAdapter尚未启动。

让我知道,如果我在推理中出错了,但你期待的是不同的东西。

<强>更新

要以编程方式启动端点(或任何其他Lifecycle组件),您应inject将其发送给您的服务:

@Autowired
@Qualifier("sftpOutboundAdapter")
private Lifecycle sftpOutboundAdapter;

....

sftpOutboundAdapter.start();