2017-08-04 133 views
1

我尝试使用多个jpa:入站通道适配器。但是我有一个问题。当我添加两个入站通道适配器时,只有最后一个工作。例如,现在有两个入站通道,我们称它们为x和y。如果我先写x然后写y到application.xml文件,那么只有y有效。如果先写y,那么x只有x有效。这里是xml配置,Spring jpa:入站通道适配器配置

<int:channel id="emailChannel" /> 
<int-jpa:inbound-channel-adapter 
    channel="emailChannel" entity-manager-factory="entityManagerFactory" 
    auto-startup="true" 
    jpa-query="select slt from Email slt where slt.mailStatus = 'NEW'" 
    expect-single-result="false" delete-after-poll="false"> 
    <int:poller fixed-rate="10000" > 
     <int:transactional propagation="REQUIRED" 
      transaction-manager="transactionManager" /> 
    </int:poller> 
</int-jpa:inbound-channel-adapter> 
<int:service-activator input-channel="emailChannel" ref="EmailSenderEndPoint" method="sendEmail" /> 


<int:channel id="msgChannel" /> 
<int-jpa:inbound-channel-adapter 
    channel="msgChannel" entity-manager-factory="entityManagerFactory" 
    auto-startup="true" 
    jpa-query="select rm from Msg rm where rm.isApproved= '1' " 
    expect-single-result="false" delete-after-poll="false"> 
    <int:poller fixed-rate="30000"> 
     <int:transactional propagation="REQUIRED" 
      transaction-manager="transactionManager" /> 
    </int:poller> 
</int-jpa:inbound-channel-adapter> 
<int:service-activator input-channel="msgChannel" ref="MsgSenderEndPoint" method="sendMsg" /> 

在上例中,只有msgChannel工作。但是,如果我改变如下,只有emailChannel的作品。

<int:channel id="msgChannel" /> 
<int-jpa:inbound-channel-adapter 
    channel="msgChannel" entity-manager-factory="entityManagerFactory" 
    auto-startup="true" 
    jpa-query="select rm from Msg rm where rm.isApproved= '1' " 
    expect-single-result="false" delete-after-poll="false"> 
    <int:poller fixed-rate="30000"> 
     <int:transactional propagation="REQUIRED" 
      transaction-manager="transactionManager" /> 
    </int:poller> 
</int-jpa:inbound-channel-adapter> 
<int:service-activator input-channel="msgChannel" ref="MsgSenderEndPoint" method="sendMsg" /> 


<int:channel id="emailChannel" /> 
<int-jpa:inbound-channel-adapter 
    channel="emailChannel" entity-manager-factory="entityManagerFactory" 
    auto-startup="true" 
    jpa-query="select slt from Email slt where slt.mailStatus = 'NEW'" 
    expect-single-result="false" delete-after-poll="false"> 
    <int:poller fixed-rate="10000" > 
     <int:transactional propagation="REQUIRED" 
      transaction-manager="transactionManager" /> 
    </int:poller> 
</int-jpa:inbound-channel-adapter> 
<int:service-activator input-channel="emailChannel" ref="EmailSenderEndPoint" method="sendEmail" /> 

我不明白问题是什么。你可以帮帮我吗?

编辑:我解决了这个问题。我将接口添加到服务激活器类,然后解决问题。

+0

什么是Spring集成版本? –

回答

0

好的。这是一个错误。参见JIRA:https://jira.spring.io/browse/INT-4325

所以,解决您的问题,你必须定义独特id对于那些<int-jpa:inbound-channel-adapter>定义:

<int-jpa:inbound-channel-adapter id="msgJpaAdapter" 
channel="msgChannel" entity-manager-factory="entityManagerFactory" 

... 

<int-jpa:inbound-channel-adapter id="emailJpaAdapter" 
channel="emailChannel" entity-manager-factory="entityManagerFactory" 

UPDATE

我们有一个配置测试用例:

<int-jpa:inbound-channel-adapter id="jpaInboundChannelAdapter1" 
     entity-manager-factory="entityManagerFactory" 
     entity-class="org.springframework.integration.jpa.test.entity.StudentDomain" 
     expect-single-result="true" 
     parameter-source="jpaParameterSource" 
     channel="out"> 
    <int:poller fixed-rate="5000"/> 
</int-jpa:inbound-channel-adapter> 

<int-jpa:inbound-channel-adapter id="jpaInboundChannelAdapter2" 
    entity-manager-factory="entityManagerFactory" 
    entity-class="org.springframework.integration.jpa.test.entity.StudentDomain" 
    max-results="13" 
    delete-after-poll="true" 
    flush-after-delete="true" 
    channel="out"> 
    <int:poller fixed-rate="5000"/> 
</int-jpa:inbound-channel-adapter> 

像:

JpaExecutor jpaExecutor1 = context.getBean("jpaInboundChannelAdapter1.jpaExecutor", JpaExecutor.class); 
    JpaExecutor jpaExecutor2 = context.getBean("jpaInboundChannelAdapter2.jpaExecutor", JpaExecutor.class); 
    assertNotNull(jpaExecutor1); 
    assertNotNull(jpaExecutor2); 

    assertNotSame(jpaExecutor1, jpaExecutor2); 

但是在空的情况下id它们确实是同一个对象。

+0

我定义了id,但它无法帮助我。我发现只有解决方案将接口添加到service-activator引用类。 – Zapateus

+0

您是否针对不同的通道适配器定义使用不同的ID? –

+0

在我的答案中查看更新。 –

相关问题