如何检查一个Apache Camel SQL组件的结果集(选择)是否为空?

uhry853o  于 2022-11-07  发布在  Apache
关注(0)|答案(2)|浏览(221)

我正在运行一个Camel路由,它从数据库中读取一个标记记录。如果标记不在那里,则插入它并执行一些额外的操作。我希望能够检查查询的结果集是否为空,但我在路由(选择)中使用的条件似乎被忽略了,所以它的工作方式就像它总是在数据库中找到一些东西,即使我确定它不是(事实上,日志记录${body}显示为空)。
我使用的是spring XML DSL,路径如下:

<from uri="file:/D:/LOCAL/?include=(?i).*.zip&amp;moveFailed=ErrorFiles&amp;move=D:/LOCAL/WRK/"/>  <!--Catch a zip file as trigger for route-->
     <to uri="sql:SELECT LOAD_DATE FROM IMPORT_CUSTOMER_CTRL WHERE LOAD_DATE = CURRENT_DATE?datasource=#customerDS&amp;routeEmptyResultSet=true&amp;outputType=SelectOne"/> <!-- Read a flag record from db -->
     <log message="Query result: ${body}" loggingLevel="INFO"/>
     <choice>
        <when> 
           <simple>${body)} == null</simple>  <!--IF RESULTSET IS EMPTY THEN DO SOMETHING. THIS CONDITION FAILS AND ALWAYS GOES BY OTHERWISE BRANCH-->**strong text**
           <log message="Do something" loggingLevel="INFO"/>

           <!--Insert flag record -->   
           <to uri="sql:INSERT INTO IMPORT_CUSTOMER_CTRL (LOAD_DATE) VALUES(CURRENT_DATE)?dataSource=#customerDS" />  
        </when>
        <otherwise>
           <log message="Flag record already exists, ignoring:${body}" loggingLevel="INFO"/>
        </otherwise>
     </choice>

对于when条件,我已经尝试了***${body)} == null***和***${body)} =='甚至${bodyAs(String)} =='***,但是choice的行为总是被填充,并通过其他路径。我知道原因是我总是在日志中得到“Flag record already exists..”消息。
评估结果集是否为空的正确方法是什么?

8xiog9wr

8xiog9wr1#

根据Sql组件文档:
对于select操作,结果是List〈Map〈String,Object〉〉类型的示例,由JdbcTemplate.queryForList()方法返回。
因此,body永远不会是null--您必须检查返回的List对象的内容,以查看结果集包含的内容。
下面是一条完整的路线,它对body进行了多次检查:

from("direct:mainRoute")
.routeId("MainRoute")
    .process(e ->{
        List<String> list = new ArrayList<String>();
        list.add("foo");
        e.getMessage().setBody(list, List.class);
    })
    .log("MainRoute BEGINS: BODY: ${body}")
    .choice()
        .when(simple("${body} == null"))
            .log("body is null")
        .otherwise()
            .log("body is not null")
    .end()
    .choice()
        .when(simple("${body} is 'java.util.List'"))
            .log("body is a list")
        .otherwise()
            .log("body is not a list")
    .end()
    .choice()
        .when(simple("${body.isEmpty()}"))
            .log("list in body is empty")
        .otherwise()
            .log("list in body is not empty")
    .end()
    .log("MainRoute ENDS: BODY: ${body}")
.end()
;

当路线运行时,它将打印

MainRoute  INFO  MainRoute BEGINS: BODY: [foo]
MainRoute  INFO  body is not null
MainRoute  INFO  body is a list
MainRoute  INFO  list in body is not empty
MainRoute  INFO  MainRoute ENDS: BODY: [foo]

MainRoute  INFO  MainRoute BEGINS: BODY: []
MainRoute  INFO  body is not null
MainRoute  INFO  body is a list
MainRoute  INFO  list in body is empty
MainRoute  INFO  MainRoute ENDS: BODY: []

这取决于List是否具有项。

tzdcorbm

tzdcorbm2#

你能把你的评论作为答案贴出来吗,这样我就可以把它标记为被接受的答案了
正如上面所解释的,无论输出类型如何(我指的是列表和单个元组),一个通用的解决方案都是分析Camel以header形式发布的各种“元数据”:https://camel.apache.org/components/3.17.x/sql-component.html#_message_headers
您应该特别查看一下CamelSqlRowCount,正如它的名称所示,它将给予有关SQL查询返回的记录数的信息。

相关问题