select-sql-parameter-source中的重复调用

时间:2015-04-08 21:48:21

标签: spring-integration

我正在使用动态查询,使用select-sql-parameter-source搜索我需要的信息。

这是我的配置:

<int-jdbc:inbound-channel-adapter query="SELECT * FROM CUSTOMER WHERE CUSTOMER.LASTUPDATE_ACTIVE &lt; TO_DATE(:last_process_date,'YYYY-MM-DD HH24:Mi:SS') "     
    channel="headerEnricher.customerBR01"
    update="" 
    row-mapper="customerRowMapper"
    data-source="jdbcTemplate"
    max-rows-per-poll="0"
    select-sql-parameter-source="parameterSource.customerBR01">
    <!-- Cron Time -->
    <int:poller fixed-rate="50" time-unit="SECONDS">
    </int:poller>
</int-jdbc:inbound-channel-adapter>

<!-- This is to get last process date -->
<bean id="parameterSource.customerBR01" factory-bean="parameterSourceFactory.customerBR01" factory-method="createParameterSourceNoCache">
    <constructor-arg value="" />
</bean>

<bean id="parameterSourceFactory.customerBR01" class="org.springframework.integration.jdbc.ExpressionEvaluatingSqlParameterSourceFactory">
    <property name="parameterExpressions">
        <map>
            <!-- Here we get the last process date -->
            <entry key="last_process_date" value="@hsqlHistoricProcessServiceDateDAO.getLastProcessDate(3,1,'CUSTOMER')" />
        </map>
    </property>
</bean>

我看起来loggin出现了两次,所以我在这个函数中改变了我的代码:

hsqlHistoricProcessServiceDateDAO.getLastProcessDate

仅返回帐户变量。 函数代码hsqlHistoricProcessServiceDateDAO.getLastProcessDate如下:

private int contador = 0;

public String getLastProcessDate(Integer country, Integer business, String tableName) {
    contador++;

    System.out.println("Contador "+ contador);

    return Integer.toString(contador);
}

结果是:

Contador 1
Contador 2

所以,这个方法被调用两次,我只需要一个调用,因为在&#34;真实代码&#34;我已经为此记录了两次。

1 个答案:

答案 0 :(得分:0)

对于您的用例,您不需要禁用缓存;请改用它......

<bean id="parameterSource.customerBR01" 
    factory-bean="parameterSourceFactory.customerBR01"
    factory-method="createParameterSource">
        <constructor-arg value="" />
</bean>

当在多个参数中使用相同的密钥并且您希望重新评估每个参数时,需要...NoCache版本。

禁用缓存会产生这种额外的副作用,因为每次使用密钥时都会调用getValue()方法两次。一个电话来自NamedParameterUtils.substituteNamedParameters();第二个来自NamedParameterUtils.buildValueArray()