您好目前使用Camel 2.12.2来处理我们构建的应用程序的导出。 我们使用camel-jpa组件执行导出,以从名为XML_EXPORT的表中获取记录。我们使用命名查询从此表中提取记录,
@NamedQuery(name = "export_data",
query = "select x from MessageExport x where x.isExported = 'N'")
@Consumed部分如下所示:
@Consumed
public void markExported() {
setExportedDatetime(new Date());
setIsExported("Y");
}
JPA组件配置如下所示:
jpa:...MessageExport?consumer.namedQuery=export_data&consumeDelete=false&consumer.lockModeType=PESSIMISTIC_WRITE&consumer.delay=10000
现在让我们说我使用isExported =' N'将记录插入XML_EXPORT表。我期望骆驼获取记录,处理它,然后更新isExported和exportedDatetime作为我的@Consumed方法状态。它的作用!
来自骆驼日志:
UPDATE XML_EXPORT SET EXPORTED_DATETIME = ?, IS_EXPORTED = ? WHERE (ID = ?)
bind => [2014-04-14 08:18:04.853, Y, 9]
出于测试目的,我有时想重新发送相同的消息。要做到这一点,我只需要更新我要重新发送的记录,并将其设置为isExported to' N'的值。 并且消息会再次导出。
这是wierd(?)部分,这是我运行更新语句后生成的内容
UPDATE XML_EXPORT SET EXPORTED_DATETIME = ? WHERE (ID = ?)
bind => [2014-04-13 11:54:53.97, 5]
因此,由于某种原因,此处没有生成代码来设置isExported到' Y',只有日期代码。我觉得这很混乱。结果是此消息一次又一次地导出,因为命名查询将始终使用isExported =' N'来找到记录。
现在,只需更改我的命名查询以查看exportedDatetime而不是isExported,我就可以轻松解决这个问题,因为始终会为exportedDatetime生成update语句。
但是,我真的想了解为什么Camel生成的更新语句在这两种情况下看起来有所不同?我希望@Consumed方法的行为一致。
编辑: 这是isExported列的注释:
@Column(name="IS_EXPORTED", columnDefinition="VARCHAR2(1 CHAR)")
private String isExported;