Apache camel 同步文件路由
Apache camel synchronize file routes
我在三个单独的 csv 文件中获得了一些数据,这些数据需要导入到 MySQL 数据库中。
所以我得到了三个骆驼路线,每个路线都从一个文件中读取,然后 inserting/updating 数据库。
这三个文件中的一个包含插入的数据集,另外两个正在更新刚刚插入的第一个文件的数据。
CSV-File-1 -> INSERT INTO table (id,...) VALUES ($id,...)
CSV-File-2 -> UPDATE table SET field = $value WHERE id = $idFromTheJustInsertedDataset
CSV-File-3 -> UPDATE table SET field = $value WHERE id = $idFromTheJustInsertedDataset
(这里的id不是从MySQL生成的auto_increment号码)
现在的问题是,当用于插入数据的路由 1 没有在其他 2 之前 运行 时,数据丢失了,因为我没有从 mysql 收到任何错误(id 只是不存在,因为尚未插入 - 查询仍然有效)。
因此,camel 的文件使用者每隔 xxx 毫秒才启动一次,我不知道是否有可能确定这三个路由的顺序 运行。也不可能在路由内使用另一个文件(一次)——至少我不知道如何做到这一点。
有人知道我如何同步这些路由吗?
Camel's documentation 中规定的并行处理的经验法则是将每条消息视为一个原子单元。所以,也许你可以重新设计一下你的程序,首先处理要插入的文件内容数据,然后一旦完成第一步,你就可以处理其他文件。
一个不错的选择可能是:
- 路径 1(对于 CSV-File-1)保持原样。
- 对于
route 2
和 route 3
添加 doneFileName
选项并从 route 1
末尾的 bean 生成 .done
文件。因此只有在 route 1
完成 之后才会开始处理
I think you can have two routes, one for reading from the directory and other route should be called from the end of the first route. first route will insert into DB and second will update record.
form("Route Name")
.routeId("InsertRoute")
.bean(InsertDB.class, "insertIntoDB()")
.to("direct:updateRoute");
form("direct:updateRoute")
.routeId("updateDBRoute")
.bean(UpdateDB.class, "updateData()")
.end();
这应该确保只有在插入完成后才会运行修改。
但是在这种方法中,您将没有任何更新文件的侦听器。所以所有更新文件都需要在UpdateDB里面手动读取 class.
我在三个单独的 csv 文件中获得了一些数据,这些数据需要导入到 MySQL 数据库中。 所以我得到了三个骆驼路线,每个路线都从一个文件中读取,然后 inserting/updating 数据库。
这三个文件中的一个包含插入的数据集,另外两个正在更新刚刚插入的第一个文件的数据。
CSV-File-1 -> INSERT INTO table (id,...) VALUES ($id,...)
CSV-File-2 -> UPDATE table SET field = $value WHERE id = $idFromTheJustInsertedDataset
CSV-File-3 -> UPDATE table SET field = $value WHERE id = $idFromTheJustInsertedDataset
(这里的id不是从MySQL生成的auto_increment号码)
现在的问题是,当用于插入数据的路由 1 没有在其他 2 之前 运行 时,数据丢失了,因为我没有从 mysql 收到任何错误(id 只是不存在,因为尚未插入 - 查询仍然有效)。
因此,camel 的文件使用者每隔 xxx 毫秒才启动一次,我不知道是否有可能确定这三个路由的顺序 运行。也不可能在路由内使用另一个文件(一次)——至少我不知道如何做到这一点。
有人知道我如何同步这些路由吗?
Camel's documentation 中规定的并行处理的经验法则是将每条消息视为一个原子单元。所以,也许你可以重新设计一下你的程序,首先处理要插入的文件内容数据,然后一旦完成第一步,你就可以处理其他文件。
一个不错的选择可能是:
- 路径 1(对于 CSV-File-1)保持原样。
- 对于
route 2
和route 3
添加doneFileName
选项并从route 1
末尾的 bean 生成.done
文件。因此只有在route 1
完成 之后才会开始处理
I think you can have two routes, one for reading from the directory and other route should be called from the end of the first route. first route will insert into DB and second will update record.
form("Route Name")
.routeId("InsertRoute")
.bean(InsertDB.class, "insertIntoDB()")
.to("direct:updateRoute");
form("direct:updateRoute")
.routeId("updateDBRoute")
.bean(UpdateDB.class, "updateData()")
.end();
这应该确保只有在插入完成后才会运行修改。 但是在这种方法中,您将没有任何更新文件的侦听器。所以所有更新文件都需要在UpdateDB里面手动读取 class.