Spring Integration XMPP-如果XmppConnectionFactoryBean的属性AutoStart配置为false,则无法向聊天服务器发送消息

Spring Integration XMPP-如果XmppConnectionFactoryBean的属性AutoStart配置为false,则无法向聊天服务器发送消息,xmpp,spring-integration,Xmpp,Spring Integration,如果XmppConnectionFactoryBean的属性AutoStart配置为false,我将无法向聊天服务器发送消息 一切正常,在配置AutoStart=true时发送消息 如果在聊天服务器无法检查时启动ApplicationContext,Configure autoStartup=false有助于避免部署失败 我使用的Spring集成版本是4.1.1-RELEASE 我正在使用Spring ApplicationContext配置XMPP消息出站通道适配器,如下代码块所述:

如果XmppConnectionFactoryBean的属性AutoStart配置为false,我将无法向聊天服务器发送消息

一切正常,在配置AutoStart=true时发送消息

如果在聊天服务器无法检查时启动ApplicationContext,Configure autoStartup=false有助于避免部署失败

我使用的Spring集成版本是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"/>

其他人也注意到了同样的行为

先谢谢你。
Massimo

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

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

XmppConnectionFactoryBean
生成
XMPPConnection
,如果不调用它的
connect()
,它将不可用。这正是通过Spring的applicationContext中的
XmppConnectionFactoryBean
start()
/
stop()
完成的

从另一方面来说,您已经对部署失败做出了正确的结论,所以从直观的角度来看,您知道它是什么,以及可以从中得到什么

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

&myXmppConnection.start();
其中,
myXmppConnection
XmppConnectionFactoryBean
bean定义的id,
&
BeanFactory\FACTORY\ubean\ucode>前缀
,因为
XmppConnectionFactoryBean
。最后是启动XMPPConnection.connect()的
start()

当然,当应用程序上下文自动执行
autoStartup=true
时,您的
XMPPConnection
会在应用程序启动后尝试连接到XMPP服务器


希望我说得清楚。

Hi@artem,谢谢你的回复。我使用您的建议解决了我的问题:我认为我的解决方案没有那么干净和优雅:我创建了一个ChannelInterceptor来检查连接状态,并相应地调用XmppConnectionFactoryBean的start()方法。我现在可以配置autoStartup=false,并在发送消息之前打开连接。谢谢。MassimoI在您
start()
该组件的位置没有意义。我认为在将消息发送到适配器之前,从
通道拦截器
执行此操作听起来确实正确。如果答案适合您,最好将其标记为已接受,以便让其他社区依赖它。