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

Posted

技术标签:

【中文标题】Spring Integration XMPP - 如果 XmppConnectionFactoryBean 的属性 autoStartup 配置为 false,则无法向聊天服务器发送消息【英文标题】:Spring Integration XMPP - Unable to send messages to Chat Server if the property autoStartup of XmppConnectionFactoryBean is configured to false 【发布时间】:2015-08-10 13:38:57 【问题描述】:

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

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

如果在无法访问聊天服务器时启动 ApplicationContext,配置 autoStartup = false 有助于避免部署失败。

我使用的 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】:

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

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

XmppConnectionFactoryBean 产生XMPPConnection,如果你不调用它的connect(),这是行不通的。这正是由 XmppConnectionFactoryBean 中的 start()/stop() 完成的 - Spring 的 applicationContext 中的 XMPPConnection 生命周期控制器。

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

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

&myXmppConnection.start();

其中myXmppConnection 是您的XmppConnectionFactoryBean bean 定义的ID,&amp;BeanFactory#FACTORY_BEAN_PREFIXbecause ofXmppConnectionFactoryBean. And the finallystart()which initiatesXMPPConnection.connect()`。

当然,当autoStartup=truestart() 由applicationContext 自动完成并且您的XMPPConnection 在应用程序启动后尝试连接到XMPP 服务器时。

希望我清楚。

【讨论】:

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

以上是关于Spring Integration XMPP - 如果 XmppConnectionFactoryBean 的属性 autoStartup 配置为 false,则无法向聊天服务器发送消息的主要内容,如果未能解决你的问题,请参考以下文章

Spring Integration Xmpp 4 - 发送创建 muc 请求

如何使用 Spring Integration 发送 gcm xmpp 消息?

xmpp-connection (spring integration) 的正确参数是啥,以使其与 google gcm 一起使用?

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

找不到 XMPP Spring 集成属性或字段“json”

spring integration:如何从 Spring Controller 调用 Spring Integration?