如果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"/>
有人注意到了同样的行为吗?
提前谢谢你。 马西莫
答案 0 :(得分:1)
请从一方面看一下SmartLifecycle
JavaDocs,并研究基于autoStartup=false
的组件的正常行为。换句话说,您刚刚确认XmppConnectionFactoryBean
按设计工作; - )。
好吧,让我们分析一下那里发生了什么!
XmppConnectionFactoryBean
生成XMPPConnection
,如果您不调用connect()
,则该start()
无效。确切地说,这是由stop()
的{{1}} / XmppConnectionFactoryBean
- Spring的applicationContext中的XMPPConnection
生命周期控制器完成的。
从另一方面来看,您已经对部署失败做了正确的结论,因此在直观的层面上,您知道它是什么以及期望从中获得什么。
要解决您的问题,您必须手动执行以下操作:
&myXmppConnection.start();
其中myXmppConnection
是XmppConnectionFactoryBean
bean定义的id,&
是BeanFactory#FACTORY_BEAN_
PREFIX because of
XmppConnectionFactoryBean . And the finally
start(){{ 1}} XMPPConnection.connect()`。
当然,which initiates
autoStartup=true
自动地由applicationContext完成,而start()
尝试在应用程序启动后立即连接到XMPP服务器。
希望我很清楚。