在使用Fuse的Apache Camel时,我听到了很多成功的集成故事。因此。我刚刚开始探索Fuse IDE,只需要一个简单的任务,我想实现:
我只能得到:
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;
}
答案 0 :(得分:3)
您可以使用以下所有组件来实际读取和写入数据库:
我将向您展示如何使用自定义处理器将行插入表中。这样做的主要原因是您可以使用消息和交换,这将使您更深入地了解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>
或者看下面的屏幕截图:
了解了这种技术后,您可以通过使用拆分器,连接池和线程来开始扩展解决方案,以执行大量并发插入等。
使用上面的技术,您学会了如何将自己的bean注入camel路由,这使您能够直接在代码中处理消息。
我没有对代码进行测试,因此可能会有一两个错误,但这个想法应该是明确的。