Spring Integration XMPP - 如果XmppConnectionFactoryBean的属性autoStartup配置为false,则无法向Chat Server发送消息

时间:2015-08-10 13:38:58

标签: xmpp spring-integration

如果XmppConnectionFactoryBean的属性autoStartup配置为false,我无法向Chat Server发送消息。

一切正常,当我配置autoStartup = true时发送消息。

配置autoStartup = false非常有用,以便在聊天服务器无法访问时启动ApplicationContext时避免部署失败。

我使用的Spring Integration版本是4.1.1-RELEASE

我正在使用Spring ApplicationContext配置XMPP消息出站通道适配器,如以下代码块所述:

    <bean id="my-xmpp-connection" class="org.springframework.integration.xmpp.config.XmppConnectionFactoryBean"> 
        <constructor-arg>
            <bean class="org.jivesoftware.smack.ConnectionConfiguration">
                <constructor-arg value="myHost"/>
                <constructor-arg value="myport"/>
                <constructor-arg value="myService"/>                
                <property name="securityMode" value="disabled" />
            </bean>
        </constructor-arg>
        <property name="user"        value="myUser" />
        <property name="password"    value="myPassword" />
        <property name="autoStartup" value="false" /> 
    </bean>

    <int-xmpp:outbound-channel-adapter id="my-xmpp-outbound-adapter"
        channel="my-input-channel"
        xmpp-connection="my-xmpp-connection"/>

有人注意到了同样的行为吗?

提前谢谢你。 马西莫

1 个答案:

答案 0 :(得分:1)

请从一方面看一下SmartLifecycle JavaDocs,并研究基于autoStartup=false的组件的正常行为。换句话说,您刚刚确认XmppConnectionFactoryBean按设计工作; - )。

好吧,让我们分析一下那里发生了什么!

XmppConnectionFactoryBean生成XMPPConnection,如果您不调用connect(),则该start()无效。确切地说,这是由stop()的{​​{1}} / XmppConnectionFactoryBean - Spring的applicationContext中的XMPPConnection生命周期控制器完成的。

从另一方面来看,您已经对部署失败做了正确的结论,因此在直观的层面上,您知道它是什么以及期望从中获得什么。

要解决您的问题,您必须手动执行以下操作:

&myXmppConnection.start();

其中myXmppConnectionXmppConnectionFactoryBean bean定义的id,&BeanFactory#FACTORY_BEAN_ PREFIX because of XmppConnectionFactoryBean . And the finally start(){{ 1}} XMPPConnection.connect()`。

当然,which initiates autoStartup=true自动地由applicationContext完成,而start()尝试在应用程序启动后立即连接到XMPP服务器。

希望我很清楚。