2014-03-03 140 views
2

我需要在彈簧初始化後立即加載一堆數據,只需要一次。 在我的計劃中,我有與控制總線一起工作的服務激活器(發送消息來控制總線通道)。 創建初始化後發送這串數據的服務不起作用,這個96221-jdbc-inbound-channel-adapter-for-doing-only-a-single-query-at-runtime也不幫助 - 即時獲取org.springframework.integration.MessageDispatchingException: Dispatcher has no subscribers。嘗試了幾種方法,包括BeanPostProcessor,MethodInvokingFactoryBean,但仍然有方法調用時尚未啓動的感覺渠道。 任何方法來解決這個問題?初始化和彈簧集成通道

更新:ApplicationListener<ContextRefreshedEvent>作爲魔法。 Thx諮詢

upd2:
問題部分的配置如下。訣竅在於cbManager,即發送消息給controlBus,調用方法爲providerManager bean。 ("@providerManager.add(headers.providerConfig)")。 與http-inbound部分一起工作良好,但jdbcPoller任務是在初始化時做同樣的事情。 ApplicationListener解決我的問題,但如果有什麼我不知道或替代,身份證很高興知道

<int:control-bus input-channel="controlBusMainChannel"/> 

    <int:channel id="controlBusMainChannel" /> 
    <int:channel id="cbRequests" /> 
    <int:channel id="cbReplies" /> 
    <int:channel id="postRequests" /> 

    <bean id="cbManager" class ="com.dph.hlss.bus.ViaBusProviderManager"> 
     <constructor-arg name="channel" ref="controlBusMainChannel" /> 
    </bean> 

    <int-http:inbound-gateway id="cbPostController" 
     request-channel="cbRequests" 
     reply-channel="cbReplies" 
     path="/controlbus/providers" 
     request-payload-type="com.dph.hlss.bus.providermanager.model.ProviderAddDTO" 
     supported-methods="POST" 
     payload-expression="body" 
    > 
     <int-http:header name="requestId" expression="T(java.util.UUID).randomUUID().toString()"/> 
    </int-http:inbound-gateway> 

    <int:service-activator input-channel="cbRequests" ref="cbInbound"/> 

    <int:gateway id="cbInbound" default-request-channel="cbInbRequests" error-channel="cbErrorHandleMessages" /> 

    <int:transformer input-channel="cbErrorHandleMessages" output-channel="cbReplies" ref="errorTransformer" method="transform"/> 

    <int:payload-type-router input-channel="cbInbRequests" > 
     <int:mapping type="com.dph.hlss.bus.providermanager.model.ProviderAddDTO" channel="postRequests"/> 
    </int:payload-type-router> 

    <int:service-activator id="addProvider" input-channel="postRequests" output-channel="cbReplies" ref="cbManager" method="add" /> 

    <bean id="providerManager" class="com.dph.hlss.bus.ProviderCommandManagment" > 
     <property name="providerManager" ref="searchProviderManager"/> 
     <property name="factory" ref="abstractProvidersFactory" /> 

    </bean> 

    <bean id="jdbcPoller" class="com.dph.hlss.bus.JDBCPoller" > 
     <property name="accepter" ref="cbManager" /> 
    </bean> 

    <bean class="com.dph.interfaces.spring.SpringBeanLauncher"> 
     <property name="launchableBean" ref="jdbcPoller" /> 
     <property name="contextId" value="/search-facade" /> 
     <property name="rootContextId" value="org.springframework.web.context.WebApplicationContext:" /> 
    </bean> 

回答

6

您太快發送數據。

執行ApplicationListener並在收到ContextRefreshedEvent時發送數據。

+0

謝謝,它的工作。沒有意識到BeanPostProcessor在bean初始化之後工作,而不是在整個上下文之後 – ametiste

1

調度員沒有訂戶

說,你有一些SubscribableChannel(如剛),其中沒有任何端點從中接收消息,或端點沒有啓動(auto-startup="false") 。

請顯示你的配置,瞭解發生了什麼。

+0

Gary Russel的建議爲我工作,似乎沒有它的一些訂戶丟失,但萬一我錯過了一些具體細節,我添加了配置,將欣賞任何信息 – ametiste

+0

不,一切都是正確。對不起,感到困惑。請記住我的評論:當你失去一些訂閱時,這是一個典型的問題。 –