二进制文件到 SQL 数据库 Apache Camel

2024-03-16

我需要一些关于使用 Camel 将二进制文件从文件夹加载到 MySQL 数据库的方法的指导。基本上我想将 PBX 系统中的语音日志存储到数据库中。包含语音日志的目录将是远程目录

我设计了一个原型,但我不确定这是否真的有效,它有效,但我对设计不满意。让我解释一下我在做什么。骆驼路线如下:

    <camelContext xmlns="http://camel.apache.org/schema/spring">
    <package>com.hia.camelone</package>
      <route>
            <from uri="file://c:/CTest/Inbox?noop=true&amp;recursive=true&amp;delay=3000"/>
            <to uri="bean://fileToSQL"/>
            <to uri="jdbc://timlogdb"/>

       </route>

</camelContext>

<bean id="timlogdb" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value=" com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://127.0.0.1:3306/TimLog" />
    <property name="username" value="root" />
    <property name="password" value="blahblah" />
</bean>
<bean id="fileToSQL" class="com.hia.camelone.fileToSQL"/>

fileToSQL bean 的代码是:

public class fileToSQL {

public String toString(@Headers Map<String,Object> header, @Body Object body){
    StringBuilder sb = new StringBuilder();
    String filename =(String)header.get("CamelFileNameOnly");
    String escapedFileName = StringEscapeUtils.escapeJava(filename).replace("\'", "");
    String filePath = StringEscapeUtils.escapeJava((String)header.get("CamelFilePath"));

    sb.append("insert into FileLog ");
    sb.append("(FileName,FileData) values (");
    sb.append("'").append(escapedFileName).append("',").append("LOAD_FILE(\"").append(filePath).append("\")");
    sb.append(")");
    System.out.println(sb.toString());
    System.out.println(body);
    System.out.println(header.toString());
    return sb.toString();
}
}

好吧,简短的解释是,我让文件组件使用文件,然后使用 MySQL LOAD_FILE() 函数构建 SQL 字符串来加载文件。

我对此的想法:

LOAD_FILE 函数仅适用于本地计算机,因此此路由仅适用于本地计算机上的文件。我可以使用文件生成器将文件从某个远程目录复制到本地目录,然后使用该路由。那么我的路线将是这样的:

<route>
            <from uri="file://c:/CTest/Inbox?noop=true&amp;recursive=true&amp;delay=3000"/>
            <to uri="file://c:/outbox"/>
            <to uri="bean://fileToSQL"/>
            <to uri="jdbc://timlogdb"/>

</route>

然而,由于我可以访问来自文件使用者的消息中的文件内容,理论上我应该能够访问字符串的主体/内容并构建不使用 LOAD_FILE() 函数的 SQL 命令。

我知道如何构建这样的字符串的唯一方法是使用 JDBC 的准备语句。如果我能以某种方式使用文件使用者的内容构建插入语句,这将是一等奖。

我可以在 fileToSQL bean 中创建准备好的语句并将其传递给我的 jdbc 组件吗? 或者如何在没有 LOAD_FILE() 函数的情况下构建 INSERT 语句?

由于我必须使用 LOAD_FILE() 函数,所以我现在必须同时满足 UNIX 和 Windows 文件路径的要求。虽然这应该不难,但我只是不喜欢将操作系统特定代码放入我的应用程序中的想法(感觉像是一种解决方法)。

这里的任何人都曾经使用 Camel 将二进制文件上传到 MySQL 数据库,他们可以就上述几点给我一些指导。虽然我可以解决这些问题,但我只是想确保我不会错过明显的做事方式。

我环顾四周,只发现人们主要使用文本文件。伙计们,请不要走我将文件存储在文件系统上并将其链接到数据库的路线。我们有一些非常具体的灾难恢复要求和法律要求,强制要求我将其存储在数据库中。


是的,所以我设法找到了一种方法,而且并不那么困难。我本质上所做的就是去掉路由中的 JDBC Camel 组件。然后我将数据源 bean 注入到我的 fileToSQL bean 中。然后,我使用一个简单的准备好的语句将文件及其名称插入 MySQL。

一如既往,代码比我的英语更明确。

 <camelContext xmlns="http://camel.apache.org/schema/spring">
    <package>com.hia.camelone</package>

      <route>
            <from uri="file://c:/CTest/Inbox?noop=true&amp;recursive=true&amp;delay=3000"/>
            <to uri="bean://fileToSQL"/>
            <!--<to uri="jdbc://timlogdb"/>-->

       </route>

</camelContext>

<bean id="timlogdb" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value=" com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://127.0.0.1:3306/TimLog" />
    <property name="username" value="root" />
    <property name="password" value="lalala" />
</bean>
<bean id="fileToSQL" class="com.hia.camelone.fileToSQL">
    <property name="dataSource" ref="timlogdb"/>
</bean>

正如您所看到的,我将 timlogdb bean 注入到 fileToSQL bean 中。春天的岩石!

这是我的 fileToSQL bean。

public class fileToSQL {
private DriverManagerDataSource dataSource;
private static final String SQL_INSERT="insert into FileLog(FileName,FileData)values(?,?)";
@Handler
public void toString(@Headers Map<String,Object> header,Exchange exchange){
    Connection conn = null;
    PreparedStatement stmt=null;
    String filename =StringEscapeUtils.escapeJava(((String)header.get("CamelFileNameOnly")).replace("\'", ""));

    try {
        conn= dataSource.getConnection();
        stmt =conn.prepareStatement(SQL_INSERT);
        stmt.setString(1, filename);
        byte[] filedata = exchange.getIn().getBody(byte[].class);
        stmt.setBytes(2,filedata );
        int s = stmt.executeUpdate();

    }
    catch (Exception e)
    {
        System.out.println(e.getMessage());
    }
    finally{
        try
        {
                if (stmt!=null)
                {
                    stmt.close();
                }
                if (conn!=null)
                {
                    conn.close();
                }
        }
        catch(SQLException e)
        {
            System.out.println(e.getMessage());
        }
    }


}

/**
 * @param dataSource the dataSource to set
 */
public void setDataSource(DriverManagerDataSource dataSource) {
    this.dataSource = dataSource;
}
}

骆驼队的人做得很好。 Camel 非常灵活,尤其是当您将它与 Spring 结合使用时。

多么美妙的旅程啊!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二进制文件到 SQL 数据库 Apache Camel 的相关文章

  • 如何在php中根据url从mysql获取数据?

    我在 mysql 数据库中有一个页表 其中包含 page name title content author 字段 我想用 php 来获取它http www domain com index php page page name http
  • Laravel Schema Builder 改变存储引擎

    我正在尝试更改表并将其存储引擎更改为InnoDb 当我跑步时php artisan migrate它完成且没有错误 然而 当我检查 Sequel Pro 中的存储引擎时 没有任何变化 public function up Schema ta
  • 使用数据库进行日志记录

    大多数日志似乎都是纯文本形式 而不是放入 MySQL 其他类型的数据库中 这是否有原因 在我看来 将它们放入数据库将使分析变得非常非常容易 但这会以牺牲速度还是其他什么为代价 我不太关心可移植性 显然你会有数据库连接的文本日志 我能想到两大
  • 更新 SQLAlchemy 中的特定行

    我将 SQLAlchemy 与 python 一起使用 我想更新表中等于此查询的特定行 UPDATE User SET name user WHERE id 3 我通过 sql alchemy 编写了这段代码 但它不起作用 session
  • ssl.SSLEOFError: EOF 发生违反协议 (_ssl.c:1129)

    我正在尝试使用 GOOGLE Drive Api 从电脑上传多个文件到云端硬盘 from pydrive auth import GoogleAuth from pydrive drive import GoogleDrive import
  • SQL 按计数排序

    如果我有一个表和这样的数据 ID Name Group 1 Apple A 2 Boy A 3 Cat B 4 Dog C 5 Elep C 6 Fish C 我希望根据 Group 的总和从小到大进行排序 例如 A 2条记录 B 1条记录
  • 我应该如何审核 MySQL 表中的更改(使用 MySQL 4)?

    我被要求审核 MySQL 表中的任何 所有更改 有谁知道有什么工具可以帮助我做到这一点 还是我需要编写自己的解决方案 如果我编写自己的审计 我最初的想法是制作一个单独的表并在 PHP 代码中构建一系列更改 类似 fieldname1 gt
  • PHP,文本从数据库中回显,没有换行,全部一体

    我的数据库中有一个长文本 从 php mayadmin 来看它看起来很好 但是当我将它回显到页面时 它会丢失所有格式 即没有新行 全部都在一个块中 有任何想法吗 Thanks 可能是因为换行符是 n 并且 html 想要 br 所以使用nl
  • 如何编写可以补偿拼写错误数据的 MySQL 搜索?

    有没有什么方法可以编写一个 MySQL 搜索来弥补用户在拼写等方面的错误 作为随机示例 有人可能会输入 电子邮件受保护 cdn cgi l email protection代替 电子邮件受保护 cdn cgi l email protect
  • 为什么我收到“无法进行二进制日志记录”的信息。在我的 MySQL 服务器上?

    当我今天启动 MySQL 服务器并尝试使用以下命令进行一些更改时用于 MySQL 的 Toad http www quest com toad for mysql 我收到此消息 MySQL 数据库错误 无法进行二进制日志记录 消息 交易级别
  • 选择前 n 个字符相等的行(MySQL)

    我有一张带有玩家句柄的桌子 如下所示 1 N Laka 2 N James 3 nor Brian 4 nor John 5 Player 2 6 Spectator 7 N Joe 从那里我想选择第一个 n 字符匹配的所有玩家 但我不知道
  • HTML:选择多个文件但未显示文件名?

    我使用 多个 标签让用户选择多个文件进行上传
  • 如何重命名 MySQL 数据库(更改架构名称)?

    如何快速重命名 MySQL 数据库 更改其架构名称 通常我只是转储数据库并使用新名称重新导入它 对于非常大的数据库来说 这不是一个选项 显然RENAME DATABASE SCHEMA db name TO new db name 做了坏事
  • 无法在类上找到适当的构造函数

    我正在尝试将本机 SQL 结果映射到 POJO 但它返回错误 这是完整的堆栈跟踪 Hibernate SELECT FROM members tb where memberName like 2019 12 19 07 40 20 688
  • 维护/更新mysql中的记录顺序

    我在 mySql 中有一个记录表 我需要按照用户指定的方式维护它们的订单 所以我添加了一个 位置 列 当我移动特定记录时更新所有记录的 SQL 语句是什么 我有类似的东西 UPDATE items SET position 2 WHERE
  • SQL UPDATE 语句根据另一个现有行更新列

    基本上我有一个与下表具有相似格式的表格 我想做的是根据这个逻辑更新 Col4 如果 Col2 为空 则用 Col3 更新 Col4 如果 Col2 不为 null 则在 Col1 中查找与 Col2 中的值匹配的值 使用 col3 中的相应
  • 删除表的重复项

    In my activity logs 它包含列 material name user id mod result 这标志着测试是否通过 失败 cert links 不知何故 用户生成了两倍的条目material name与cert lin
  • 如何将 javax.persistence.Column 定义为 Unsigned TINYINT?

    我正在基于 MySQL 数据库中的现有表创建 Java 持久性实体 Bean 使用 NetBeans IDE 8 0 1 我在这个表中遇到了一个字段 其类型为 无符号 TINYINT 3 我发现可以执行以下操作将列的类型定义为 unsign
  • 如何将 mysql 转换为 mysqli? [复制]

    这个问题在这里已经有答案了 我厌倦了将 mysql 转换为 mysqli 但似乎收到了很多错误和警告 连接到数据库没有问题 但其余代码似乎错误 我做错了什么 sql
  • 计算 mysql 数据库行数的最佳方法

    在遇到 mysql 查询加载时间慢的问题后 我现在正在寻找计算行数的最佳方法 我曾经愚蠢地使用过mysql num rows 函数来做到这一点 现在意识到这是最糟糕的方法 我实际上正在制作一个分页来用 PHP 制作页面 我找到了几种计算行数

随机推荐

  • 使用 Internet Explorer 8 进行提示()

    我很难找到解决我的问题的方法 这是一个代码片段 var ans prompt Mot de passe if ans ans null doPostBack Page ans else window location Erreurs Not
  • 如何在 npm 中升级全局包的依赖项

    我已经全局安装了pouchdb server我收到了这条消息graceful fs npm install g pouchdb server npm WARN deprecated email protected cdn cgi l ema
  • 修改 NumPy 数组的特定行/列

    如何修改 NumPy 数组的特定行或列 例如 我有一个 NumPy 数组 如下所示 P array 1 2 3 4 5 6 如何更改第一行的元素 1 2 3 to 7 8 9 所以这样P会变成 P array 7 8 9 4 5 6 同样
  • Java SimpleDateFormat 解析时区,如 America/Los_Angeles

    我想用Java解析以下字符串并将其转换为日期 DTSTART TZID America Los Angeles 20140423T120000 我试过这个 SimpleDateFormat sdf new SimpleDateFormat
  • 用户登录后调用方法

    我想知道用户登录后是否可以调用函数 这是我要调用的代码 point this gt container gt get process points point gt ProcessPoints 1 this gt container 您可以
  • 如何避免单元测试中的浮点舍入错误?

    我正在尝试为一些对单精度浮点数数组进行操作的简单向量数学函数编写单元测试 这些函数使用 SSE 内在函数 并且在 32 位系统上运行测试时出现误报 至少我认为 测试在 64 位上通过 当操作遍历数组时 我积累了越来越多的舍入误差 这是单元测
  • 将最新的各种用户元数据标签添加到用户行

    我有一个 postgres 数据库 其中包含用户表 用户 ID 名字 姓氏 和用户元数据表 用户 ID 代码 内容 创建日期时间 我通过代码将每个用户的各种信息存储在用户元数据表中 并保留完整的历史记录 例如 一个用户 userid 15
  • 自定义 MapView 抛出 NoSuchMethodException,但它就在那里!

    我正在尝试实现自定义 MapView 在我的 MapActivity 名为 mainmap 中 我有一个扩展 MapView 的内部类 private class Lmapview extends MapView public Lmapvi
  • igraph - 绘制有向网络创建三角形边

    我正在尝试绘制一个有向网络 该网络仅具有细边和箭头 我不断得到看起来是三角形的边缘 我怎样才能得到一条简单的直线和一个箭头 vertice1 lt c a b c vertice2 lt c d e f edge list lt data
  • TCPStream.Read 会阻塞直到收到发送消息中的所有数据吗?

    我编写了一个多线程简单服务器 它使用 clientStream Read message 0 4096 阻塞直到客户端发送消息 然后代码继续处理该消息 到目前为止我只用它来发送短命令 ex login username login 但我担心
  • 将一个范围从一个电子表格复制到另一个电子表格

    我试图将数组的内容从一张工作表 其中数组是通过迭代并推送用户选择的列的选择项来创建的 复制到不同电子表格中的另一张工作表 我遇到了许多关于如何将一个范围从一个电子表格导入到另一个电子表格的问题和答案 但没有一个对我有用 所有问题和答案都返回
  • gnuplot 与 iOS

    这里有人有在 iOS 上使用 gnuplot 的经验吗 我想在 iOS 设备上开发一个科学计算应用程序 并想使用 gnuplot 作为绘图引擎 有什么好的教程可以让我开始学习吗 我有同样的一般问题 快速的谷歌搜索让我找到了以下应用程序 它似
  • Django 多对多交叉过滤

    为了简单起见 假设我只有 2 个模型 书籍 作者 class Author models Model name models CharField max length 100 class Book models Model name mod
  • 如何将两个 div 并排放置并使其占据屏幕的整个宽度?

    我试图将两个 div 放在一起 并让它们都填满屏幕的宽度 理想情况下 我希望它看起来像this https i stack imgur com RVxb2 png 我自己尝试过这样做 但是 div 的宽度最终太大并且显示在两行中 这是我正在
  • 更改 withProgress() 生成的消息框的样式和位置

    The withProgress 函数可以生成一个消息框 指示闪亮的应用程序正在运行 但该消息位于浏览器的右上角 文字尺寸较小 这使得该消息不那么引人注目 所以我想知道有没有什么方法可以改变这个框的样式和位置 以便消息更具有表现力 这是我的
  • 将属性值从属性文件或 xml 文件注入 PreAuthorize(...) java 注释(未解决)

    我在之前的帖子中问过这个问题 Spring Security 的 SpEL 将值从 XML 传递到基于 Java 的 SpEL 配置 https stackoverflow com questions 19625465 spel for s
  • wp_mail wordpress html,样式不适用

    我正在尝试从我的 WordPress 插件发送邮件 但是当我检索它时 它没有样式或图像 我正在这样做
  • 骨干木偶不同的合成视图

    是否可以在 Marionette 中拥有一个复合视图 其中包含不同的项目视图 例如 var myCompositeView Backbone Marionette CompositeView extend template Handleba
  • Spring+WebSocket+STOMP。发送给特定会话的消息(非用户)

    我正在尝试使用我找到的配方在 Spring 框架上设置基本的消息代理here https stackoverflow com questions 34929578 spring websocket sendtosession send me
  • 二进制文件到 SQL 数据库 Apache Camel

    我需要一些关于使用 Camel 将二进制文件从文件夹加载到 MySQL 数据库的方法的指导 基本上我想将 PBX 系统中的语音日志存储到数据库中 包含语音日志的目录将是远程目录 我设计了一个原型 但我不确定这是否真的有效 它有效 但我对设计