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,&
是BeanFactory#FACTORY_BEAN_
PREFIXbecause of
XmppConnectionFactoryBean. And the finally
start()which initiates
XMPPConnection.connect()`。
当然,当autoStartup=true
和start()
由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,则无法向聊天服务器发送消息
spring integration:如何从 Spring Controller 调用 Spring Integration?