簡體   English   中英

接收:MessageDeliveryException:分派器沒有訂閱者在2個不同的spring集成模塊中使用入站通道適配器

[英]Receiving: MessageDeliveryException: Dispatcher has no subscribers using inbound-channel-adapter in 2 different spring integration modules

我有2個使用相似的基於文件的集成模式的spring集成上下文文件。 兩者都掃描目錄以查找消息,如果它們自己部署,則兩者都可以工作。 如果我將兩個模塊都包含在另一個spring上下文中,則它們將正常加載。 但是,只有第二個在工作,而第一個在工作: MessageDeliveryException:分派器沒有訂閱者 我試圖將它們合並到一個沒有積極收獲的上下文文件中。 我們目前使用的是Spring Integration的2.1.3版和Spring Integration File的2.1版。 任何想法都將不勝感激!

inpayment-context.xml:

<!-- START of in-bound message implementation -->
<int:channel id="file-inpayment-channel" datatype="java.io.File" />
<bean id="xmlPatternFileListFilter" class="org.springframework.integration.file.filters.SimplePatternFileListFilter">
    <constructor-arg value="*.xml" />
</bean>

<task:executor id="batchInBoundExecuter" pool-size="1-1" queue-capacity="20" rejection-policy="CALLER_RUNS" />
<int-file:inbound-channel-adapter directory="file:${inpayment.inbox}" filter="xmlPatternFileListFilter"
    channel="file-inpayment-channel">
    <int:poller id="inPaymentrPoller" fixed-delay="1000" task-executor="batchInBoundExecuter" default="true" />
</int-file:inbound-channel-adapter>

<bean id="inPaymentService" class="com.somepackage.InPaymentBootstrapService" />
<int:service-activator id="batchJobLaunchService" ref="inPaymentService" input-channel="file-inpayment-channel"
    method="schedule" />

<!-- START of out-bound message implementation -->
<int:channel id="inpayment-file-out-channel" datatype="java.io.File" />
<int:gateway id="inboundPaymentGateway" service-interface="com.somepackage.InboundPaymentGateway"
    default-request-channel="inpayment-file-out-channel" />

<int-file:outbound-channel-adapter directory="file:${inpayment.inprocess}" channel="inpayment-file-out-channel"
    auto-create-directory="true" delete-source-files="true" />
<!-- END of out-bound message implementation -->


scheduler-context.xml:
<!-- START of in-bound message implementation -->
<int:channel id="scheduler-file-in-channel" datatype="java.io.File" />
<bean id="simplePatternFileListFilter" class="org.springframework.integration.file.filters.SimplePatternFileListFilter">
    <constructor-arg value="*.xml" />
</bean>

<task:executor id="batchJobRunExecuter" pool-size="1-1" queue-capacity="20" rejection-policy="CALLER_RUNS"/>
<int-file:inbound-channel-adapter directory="file:${scheduler.inbox}" filter="simplePatternFileListFilter"
    channel="scheduler-file-in-channel">
    <int:poller id="schedulerPoller" fixed-delay="5000" task-executor="batchJobRunExecuter" default="true" />
</int-file:inbound-channel-adapter>

<bean id="launchService" class="com.somepackage.BatchJobLaunchService" />
<int:service-activator id="batchJobLaunchService" ref="launchService" input-channel="scheduler-file-in-channel"
    method="schedule" />
<!-- END of in-bound message implementation -->

<!-- START of out-bound message implementation -->
<int:channel id="scheduler-file-out-channel" datatype="java.io.File" />
<int:channel id="scheduler-xml-out-channel" datatype="com.somepackage.ScheduledJob" />

<int:gateway id="batchJobSchedulerGateway" service-interface="com.innovation.customers.guideone.scheduler.integration.SchedulerGateway"
    default-request-channel="scheduler-xml-out-channel" />

<int:transformer input-channel="scheduler-xml-out-channel" output-channel="scheduler-file-out-channel" ref="schedulerFileTransformer"
    method="transformToFile" />
<int-file:outbound-channel-adapter directory="file:${scheduler.completed}" channel="scheduler-file-out-channel"
    auto-create-directory="true" delete-source-files="true" />
<!-- END of out-bound message implementation -->


Common Spring Context:

<context:component-scan base-package="com.somepackage" /> 
<import resource="classpath:g1-scheduler-context.xml"/>
<import resource="classpath:g1-inpayment-context.xml"/> 

編輯

2014-08-27 11:01:01,530 ERROR [batchJobRunExecuter-1][:] org.springframework.integration.handler.LoggingHandler : org.springframework.integration.MessageDeliveryException: Dispatcher has no subscribers. at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(Unica‌​stingDispatcher.java:108) at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(Unicast‌​ingDispatcher.java:101)

我在您的配置中看到了這個問題:

<int:service-activator id="batchJobLaunchService" ref="inPaymentService" input-channel="file-inpayment-channel"
    method="schedule" />

<int:service-activator id="batchJobLaunchService" ref="launchService" input-channel="scheduler-file-in-channel"
    method="schedule" />

它們假定為不同的服務,但同時使用相同的id - batchJobLaunchService

Spring默認允許這樣做,但是只有最后一個具有相同id bean定義才獲勝。 這就是為什么沒有為launchService <service-activator>launchService ,因此EventDrivenConsumer bean沒有被訂閱到scheduler-file-in-channel

注意並為所有bean使用唯一的ID。

在重復情況下拋出期望並不是一件容易的事,但是如果您為org.springframework類別打開INFO,您將得到一個消息,即一個bean過度消耗了另一個bean。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM