Fuse ide如何定义数据库表的端点

时间:2014-05-17 00:35:31

标签: mysql apache-camel fuseesb

在使用Fuse的Apache Camel时,我听到了很多成功的集成故事。因此。我刚刚开始探索Fuse IDE,只需要一个简单的任务,我想实现:

  1. 阅读修订长度文件
  2. 解析修复长度文件
  3. 将其持久化到mysql数据库表
  4. 我只能得到:

    1. 阅读修订长度文件(使用Endpoint“文件:src / data / Japan?noop = true”)
    2. 使用Bindy定义Marshal并使用@FixedLengthRecord注释定义POJO包模型
    3. 然后我被卡住 ...如何将POJO持久存储到mysql数据库表中?我可以看到一些JDBC,IBatis和JPA的终点,但是如何在Fuse IDE中实现呢?
    4. CamelContext.xml

      My POJO package:
      package com.mbww.model;
      
      import org.apache.camel.dataformat.bindy.annotation.DataField;
      import org.apache.camel.dataformat.bindy.annotation.FixedLengthRecord;
      
      @FixedLengthRecord(length=91)
      public class Japan {
      
      @DataField(pos=1, length=10)
      private String TNR; 
      
      @DataField(pos=11, length=10)
      private String ATR;
      
      @DataField(pos=21, length=70)
      private String STR; 
      }
      

1 个答案:

答案 0 :(得分:3)

您可以使用以下所有组件来实际读取和写入数据库:

  1. JDBC
  2. IBATIS
  3. MyBatis的
  4. 弹簧JDBC
  5. SQL
  6. 自定义处理器
  7. 我将向您展示如何使用自定义处理器将行插入表中。这样做的主要原因是您可以使用消息和交换,这将使您更深入地了解Camel。可以按照camel网站上的文档使用所有其他组件。

    让我们回顾一下你的拥有情况。您正在读取文件并将正文转换为绑定对象。因此,对于文本文件中的每一行,Camel会将类com.mbww.model.JAPAN的绑定对象发送到下一个端点。下一个终点需要与数据库通信。我可以立即发现一个问题,即您使用的marshal应该使用unmarshal

    文档明确指出:如果您收到来自其中一个Camel组件(如文件,HTTP或JMS)的消息,您通常希望将有效负载解组为某个bean,以便您可以使用某些Bean Integration或执行谓词评估等。为此,请使用Java中的DSL或Xml配置中的unmarshal单词。

    你的bindy类看起来不错,但缺少getter和setters修改类看起来像这样:

    package com.mbww.model;
    import org.apache.camel.dataformat.bindy.annotation.DataField;
    import org.apache.camel.dataformat.bindy.annotation.FixedLengthRecord;
    
    @FixedLengthRecord(length=91)
    public class Japan {
    
      @DataField(pos=1, length=10)
      private String TNR; 
    
      @DataField(pos=11, length=10)
      private String ATR;
    
      @DataField(pos=21, length=70)
      private String STR;
    
      public String getTNR() {
        return TNR;
      }
    
      public void setTNR(String tNR) {
        TNR = tNR;
      }
    
      public String getATR() {
        return ATR;
      }
    
      public void setATR(String aTR) {
        ATR = aTR;
      }
    
      public String getSTR() {
        return STR;
      }
    
      public void setSTR(String sTR) {
        STR = sTR;
      } 
    }
    

    首先,您需要在路线中为数据库创建数据源。第一件事是将mysql驱动程序jar添加到你的maven依赖项中打开你的pom.xml文件并添加以下依赖项。

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <!-- use this version of the driver or a later version of the driver -->
        <version>5.1.25</version>
    </dependency>
    

    现在我们需要声明一个自定义处理器,用于将使用此驱动程序的路由并将接收到的主体插入表中。

    因此,让我们在Fuse IDE中创建一个名为PersistToDatabase代码的新类:

    package com.mbww.JapanData;
    import java.sql.DriverManager;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.util.Map;
    
    import org.apache.camel.Body;
    import org.apache.camel.Exchange;
    import org.apache.camel.Handler;
    import org.apache.camel.Headers;
    
    import com.mbww.model.Japan;
    import com.mysql.jdbc.Statement;
    
    
    public class PersistToDatabase {
    @Handler
    public void PersistRecord
    (
            @Body Japan msgBody
            , @Headers Map hdr
            , Exchange exch
    ) throws Exception
    {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            System.out.println("Where is your MySQL JDBC Driver?");
            e.printStackTrace();
            return;
        }
    
        System.out.println("MySQL JDBC Driver Registered!");
        Connection connection = null;
    
        try {
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/databasename","root", "password");
    
        } catch (SQLException e) {
            System.out.println("Connection Failed! Check output console");
            e.printStackTrace();
            return;
        }
    
        if (connection != null) {
            System.out.println("You made it, take control your database now!");
        } else {
            System.out.println("Failed to make connection!");
        }
        try {
            PreparedStatement stmt=connection.prepareStatement("INSERT INTO JapanDate(TNR,ATR,STR) VALUES(?,?,?)");
            stmt.setString(1, msgBody.getTNR());
            stmt.setString(2, msgBody.getATR());
            stmt.setString(1, msgBody.getSTR());
            int rows = stmt.executeUpdate();
            System.out.println("Number of rows inserted: "+Integer.toString(rows));
        }
        catch(Exception e){
            System.out.println("Error in executing sql statement: "+e.getMessage() );
            throw new Exception(e.getMessage());
        }
    
    }
    }
    

    @Handler上的PersistRecord注释外,此类是POJO没什么特别之处。这个注释告诉camel PersistRecord方法/过程将处理消息交换。您还会注意到方法PersistRecord具有日本类型的参数。如前所述,当您在骆驼路线中调用转换bean时,它会将每一行转换为日本对象并沿路径传递。

    其余代码就是如何处理JDBC连接和调用insert语句。

    我们差不多完成了最后一件事。我们需要在camel route xml中声明这个类。此文件通常称为camel-route.xml或blueprint.xml,具体取决于您的arch类型。打开源标签,在<bean id="JapanPersist" class="com.mbww.JapanData.PersistToDatabase"/>标记前添加以下行<camelContext>

    这基于我们刚刚添加到camel路由的类声明了一个名为JapanPersist的新spring bean。您现在可以在骆驼路线中引用此bean。

    因此,最终路由xml文件应如下所示:

    <?xml version="1.0" encoding="UTF-8"?>
    <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:camel="http://camel.apache.org/schema/blueprint"
       xsi:schemaLocation="
       http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
       http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">
    
    <bean id="JapanPersist" class="com.mbww.JapanData.PersistToDatabase"/>
    
      <camelContext trace="false" id="blueprintContext" xmlns="http://camel.apache.org/schema/blueprint">
        <route id="JapanDataFromFileToDB">
            <from uri="file:src/data/japan"/>
            <unmarshal ref="Japan"/>
            <bean ref="JapanPersist"/>        
        </route>
    </camelContext>
    
    </blueprint>
    

    或者看下面的屏幕截图:

    enter image description here

    了解了这种技术后,您可以通过使用拆分器,连接池和线程来开始扩展解决方案,以执行大量并发插入等。

    使用上面的技术,您学会了如何将自己的bean注入camel路由,这使您能够直接在代码中处理消息。

    我没有对代码进行测试,因此可能会有一两个错误,但这个想法应该是明确的。