二进制文件到 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 的相关文章

  • MySQL Workbench 6.0 错误无法获取管理员的管理访问权限?

    我在这里使用 MySQL Workbench 6 0 当我选择服务器状态时 出现此错误 对此 我尝试在Google和StackOverflow上寻找解决方案 e g 这个结果 https stackoverflow com question
  • SQL统计高于和低于平均分的学生人数

    我在下面有一个示例表 我试图获取高于平均分数的学生人数和低于平均分数的学生人数 name subject classroom classarm session first term score first term grade std1 m
  • 如何使PHP中的激活链接过期?

    我有一个 php 脚本 它通过电子邮件向用户发送激活链接 以便他们可以激活他们的帐户 链接是这样的 mysite com activation phpid id 20 如何创建 24 小时后过期的链接 我还没有尝试过任何东西 因为我找不到任
  • Preg_replace() 删除除查询结尾之外的所有内容

    首先 为我糟糕的英语感到抱歉 我有这样的疑问 SELECT t1 SELECT COUNT FROM table a t2 WHERE t1 id t2 id c AND t2 status 1 AS aula FROM table c t
  • 在docker中使用MySQL数据库设置aspnetcore

    我正在尝试设置一个 docker compose 文件 其中包含 asp net core mysql 数据库和 phpmyadmin 的容器 设置我的 mysql 服务器没有问题 我可以使用 phpmyadmin 访问它 我的 asp n
  • MySQL 服务器未启动

    当我做 mysql u root p并输入my password这就是我得到的 错误 2002 HY000 无法通过套接字 var run mysqld mysqld sock 连接到本地 MySQL 服务器 2 所以我输入 systemc
  • 文件上传处理程序

    这是文件上传处理程序的代码 这在我的服务器上工作正常 但上传文件后仅显示文件上传成功但我还想显示上传的文件的名称 import java io File import java io IOException import java util
  • 如何将 MySQL 数据库更改为 UTC?

    我使用的是 Windows 7 对数据库方面的东西有点陌生 我尝试在 Google 上搜索如何将系统时区更改为 UTC 但文档有些高级 我不太确定如何更改此字段 在 my ini 文件的 mysqld 部分下 添加以下行 default t
  • 单行的总和值?

    我有一个 MySQL 查询 它返回由一系列 1 和 0 组成的单行 它用于进度条指示器 我现在在代码中对它进行求和 但我尝试对查询中的值求和 并意识到我无法使用 SUM 因为它们有很多列 但只有一行 有没有办法可以在查询中自动求和 就像这样
  • 比较表中的行以了解字段之间的差异

    我有一个包含 20 多列的表 客户端 其中大部分是历史数据 就像是 id clientID field1 field2 etc updateDate 如果我的数据如下所示 10 12 A A 2009 03 01 11 12 A B 200
  • 如何在 phpmyadmin 中创建 MySQL 触发器

    我想在 MySQL 中创建一个触发器 我运行以下命令 mysql gt delimiter mysql gt CREATE TRIGGER before insert money BEFORE INSERT ON money gt FOR
  • 查询中列的顺序重要吗?

    当从 MySQL 表中选择列时 与表中的顺序相比 选择列的顺序是否会影响性能 不考虑可能覆盖列的索引 例如 您有一个包含行 uid name bday 的表 并且有以下查询 SELECT uid name bday FROM table M
  • java mysql 准备好的语句

    我正在尝试使用 java 向数据库中进行简单的插入 它告诉我我的 sql 语法已关闭 但是 当我复制打印出来的字符串并将其放入 phpmyadmin 中的 sql 命令中时 它会正确执行该命令 并且我似乎无法弄清楚 java 中的字符串查询
  • 截断 Mysql 表 Cron 作业?

    我在如何使用 cron 作业截断 Mysql 表时遇到了一些麻烦 无论我尝试什么 我似乎都无法让数据库清除表格 感谢您的帮助 mysql uderp example pexample hlocalhost Dexample e TRUNCA
  • 如何在Mysql中仅将不同的值从一个表复制到另一个表?

    我有一个大约 2 5GB 的 MySql 数据库 表 A 具有以下列 anoid query date item rank url 我刚刚创建了另一个仅包含列的表 b query and date 我想在查询列中插入所有不同的记录 及其各自
  • 无法通过套接字“/var/lib/mysql/mysql.sock”连接到本地 MySQL 服务器 (2)

    当我尝试连接 mysql 时出现以下错误 Can t connect to local MySQL server through socket var lib mysql mysql sock 2 这个错误有解决办法吗 其背后的原因可能是什
  • 忽略重复条目并在 EF Core 中的 DbContext.SaveChanges() 上提交成功条目

    我有一个 ASP Net Core 2 2 Web API 在我的一个控制器操作中 我向 MySQL 数据库表添加了一堆行 我使用的是 Pomelo 例如 dbContext AddRange entities dbContext Save
  • 将古吉拉特语文本插入 MySQL 表会产生垃圾字符和不可读的文本

    我有三个 MySQL 表 我正在向其中插入古吉拉特语内容 当我插入两个表时 它们插入得很好并且可读 但在一个表中 它显示垃圾字符 不可读的文本 我怎样才能解决这个问题 MySQL 有每个表的字符集设置 http dev mysql com
  • Laravel $request->file() 返回 null

    尝试在后端使用 Laravel 上传文件时遇到问题 Issue Laravel request gt file 方法返回 null Setup 我使用以下方法构建了一个 AJAX 请求超级代理人 https github com visio
  • 将第三个表链接到多对多关联中的桥接表

    设计这个数据库的正确方法是什么 这是我设置表格的方式 我在名为 教师 的表和名为 仪器 的表之间存在多对多关系 然后我有一个连接两者的桥接表 我想将另一个表与 BRIDGE 表关联起来 意思是乐器 老师的组合 该表有 3 行 指定老师可以教

随机推荐

  • 使用 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 系统中的语音日志存储到数据库中 包含语音日志的目录将是远程目录 我设计了一个原型 但我不确定这是否真的有效 它有效 但我对设计