如何在Spring Integration应用程序中实现SmartLifecycleRoleController

时间:2018-08-30 15:48:33

标签: spring spring-integration

我正在基于int-ip:tcp端点编写客户端-服务器应用程序。用Kotlin编写的代码。 应用程序包含两个tcp clienst,应按一定顺序连接到服务器, 彼此相继,当第一个cleint已经建立与服务器的连接并进行一些初始化时。

作为此同步的解决方案,我假设使用SmartLifecycleRoleController来启动从属tcp客户端的一组端点。 为此,在受信任的(第二个)客户端中,我将role="rcCluster"auto-startup="false"属性添加到tcp-outbound-channel-adapter和tcp-inbound-channel-adapter

<int-ip:tcp-connection-factory id="rcClientConnectionFactory"
                               type="client"
                               host="${tdirelay.host}"
                               port="${tdirelay.rcPort}"
                               single-use="false"
                               so-timeout="10000"
                               so-keep-alive="false"
                               serializer="rawSerializerDeserializer"
                               deserializer="rawSerializerDeserializer"
                               ssl-context-support="sslContext"/>


<int-ip:tcp-outbound-channel-adapter id="rcOutBoundAdapter"
                                     channel="rcPacketQueueChannel"
                                     phase="5000"
                                     connection-factory="rcClientConnectionFactory"
                                     role="rcCluster"
                                     auto-startup="false"
/>


<int-ip:tcp-inbound-channel-adapter id="rcInboundAdapter"
                                    channel="rcFromServer"
                                    client-mode="true"
                                    retry-interval="5000"
                                    connection-factory="rcClientConnectionFactory"
                                    role="rcCluster"
                                    auto-startup="false"


/>  

主要的(第一个)tcp客户端根据协议使用拦截器端点与服务器进行序言交换:

<bean id="dcInterceptorFactoryChain"
      class="org.springframework.integration.ip.tcp.connection.TcpConnectionInterceptorFactoryChain">
    <property name="interceptors">
        <array>
            <bean class="com.tcpclient.DirectCannel.DCConnectionInterceptorFactory">
            </bean>
        </array>
    </property>
</bean>


<int-ip:tcp-connection-factory id="dcClientConnectionFactory"
                               type="client"
                               host="${tdirelay.host}"
                               port="${tdirelay.dcPort}"
                               single-use="false"
                               so-timeout="10000"
                               so-keep-alive="false"
                               interceptor-factory-chain="dcInterceptorFactoryChain"
                               serializer="rawSerializerDeserializer"
                               deserializer="rawSerializerDeserializer"
                               ssl-context-support="sslContext"
/>

我打算在我的Interceptor类中调用startLifecyclesInRole(String role)的{​​{1}}和stopLifecyclesInRole(String role)方法。 因此,我将@Autowired私有val roleController:SmartLifecycleRoleController添加到InterceptorFactory中,如spring-integration / docs

中所述

我的InterceptorFactory是:

SmartLifecycleRoleController

IntelliJ IDEA发出警告: 无法自动接线。找不到“ SmartLifecycleRoleController”类型的豆

建筑出现错误:

  

[task-scheduler-2]错误org.springframework.integration.ip.tcp.connection.ClientModeConnectionManager-无法使用dcClientConnectionFactory建立连接,主机=本地主机,端口= 9001   kotlin.KotlinNullPointerException       在com.tcpclient.DirectCannel.DCConnectionInterceptorFactory.getInterceptor(DCConnectionInterceptorFactory.kt:25)

我想我需要在xml配置文件中定义SmartLifecycleRoleController类型的bean (文档中未提及:https://docs.spring.io/spring-integration/docs/4.3.4.RELEASE/reference/html/messaging-endpoints-chapter.html#endpoint-roles)。 此类的构造函数具有参数: 公共SmartLifecycleRoleController(列出角色,列出生命周期) 我不知道如何在xml文件中填写我的案子:

如果您知道如何执行此操作,请在xml配置文件中提供一个使用class DCConnectionInterceptorFactory() : TcpConnectionInterceptorFactory, ApplicationEventPublisherAware { @Autowired private val roleController: SmartLifecycleRoleController? = null @Volatile private var applicationEventPublisher: ApplicationEventPublisher? = null override fun setApplicationEventPublisher(applicationEventPublisher: ApplicationEventPublisher) { this.applicationEventPublisher = applicationEventPublisher } override fun getInterceptor(): TcpConnectionInterceptorSupport { return DCConnectionInterceptor(this.applicationEventPublisher!!, roleController!!) } } 类的bean的实时示例。

1 个答案:

答案 0 :(得分:0)

首先最好不要在那里使用@Autowired,因为尚不清楚是否在应用程序上下文中启用了注释配置。只是因为您仅显示Spring的XML配置。

因此,您的DCConnectionInterceptorFactory应该具有该roleController属性的设置器。或者在Kotlin中声明Java bean属性的正确方法是什么?

然后,您需要在XML配置中使用以下内容:

<bean class="com.tcpclient.DirectCannel.DCConnectionInterceptorFactory">
    <property name="roleController" ref="integrationLifecycleRoleController"/>
</bean>

该框架会自动为您创建一个SmartLifecycleRoleController并使用提到的IntegrationContextUtils.INTEGRATION_LIFECYCLE_ROLE_CONTROLLER bean名称进行注册。

请提出关于此事的JIRA,以改进文档,从而使文档更加整洁。

顺便说一句,您的方法是正确的。