Как создать источник данных с использованием верблюда?
Я только начал изучать Apache Camel. Я понял основы маршрутов и компонентов. Теперь я хочу попробовать подключиться к базе данных Oracle, прочитать записи из одной конкретной таблицы и записать эти записи в файл, используя File
составная часть. Для чтения из базы данных я предполагаю, что мне нужно использовать JDBC
компонент и дать dataSourceName
,
Однако я не смог найти никакой информации о том, как создать источник данных с использованием верблюда. Вся информация, которую я нашел, связанная с этой темой, использует примеры Spring DSL. Я не использую Spring, и мне просто нужно проверить это с помощью простого автономного Java-приложения.
Я использую JDK7u25 с Apache Camel 2.12.1.
Может кто-нибудь, пожалуйста, опубликуйте образец для чтения из таблицы оракула и записи в файл?
[РЕДАКТИРОВАТЬ]
После проверки нескольких решений в Интернете я узнал о следующих двух подходах:
Верблюд, чтобы бежать как самостоятельный. Вот мой код:
import javax.sql.DataSource; import org.apache.camel.main.Main; import org.apache.camel.builder.RouteBuilder; import org.apache.commons.dbcp.BasicDataSource; public class JDBCExample { private Main main; public static void main(String[] args) throws Exception { JDBCExample example = new JDBCExample(); example.boot(); } public void boot() throws Exception { // create a Main instance main = new Main(); // enable hangup support so you can press ctrl + c to terminate the JVM main.enableHangupSupport(); String url = "jdbc:oracle:thin:@MYSERVER:1521:myDB"; DataSource dataSource = setupDataSource(url); // bind dataSource into the registery main.bind("myDataSource", dataSource); // add routes main.addRouteBuilder(new MyRouteBuilder()); // run until you terminate the JVM System.out.println("Starting Camel. Use ctrl + c to terminate the JVM.\n"); main.run(); } class MyRouteBuilder extends RouteBuilder { public void configure() { String dst = "C:/Local Disk E/TestData/Destination"; from("direct:myTable") .setBody(constant("select * from myTable")) .to("jdbc:myDataSource") .to("file:" + dst); } } private DataSource setupDataSource(String connectURI) { BasicDataSource ds = new BasicDataSource(); ds.setDriverClassName("oracle.jdbc.driver.OracleDriver"); ds.setUsername("sa"); ds.setPassword("devon1"); ds.setUrl(connectURI); return ds; } }
Используя подход, упомянутый Клаусом Лбсеном. Вот код снова:
import javax.sql.DataSource; import org.apache.camel.CamelContext; import org.apache.camel.impl.DefaultCamelContext; import org.apache.camel.impl.SimpleRegistry; import org.apache.camel.main.Main; import org.apache.camel.builder.RouteBuilder; import org.apache.commons.dbcp.BasicDataSource; public class JDBCExample { private Main main; public static void main(String[] args) throws Exception { String url = "jdbc:oracle:thin:@MYSERVER:1521:myDB"; DataSource dataSource = setupDataSource(url); SimpleRegistry reg = new SimpleRegistry() ; reg.put("myDataSource",dataSource); CamelContext context = new DefaultCamelContext(reg); context.addRoutes(new JDBCExample().new MyRouteBuilder()); context.start(); Thread.sleep(5000); context.stop(); } class MyRouteBuilder extends RouteBuilder { public void configure() { String dst = "C:/Local Disk E/TestData/Destination"; from("direct:myTable") .setBody(constant("select * from myTable")) .to("jdbc:myDataSource") .to("file:" + dst); } } private static DataSource setupDataSource(String connectURI) { BasicDataSource ds = new BasicDataSource(); ds.setDriverClassName("oracle.jdbc.driver.OracleDriver"); ds.setUsername("sa"); ds.setPassword("devon1"); ds.setUrl(connectURI); return ds; } }
Но в обоих случаях я получаю ниже исключения:
Caused by: org.apache.camel.ResolveEndpointFailedException: Failed to resolve endpoint: jdbc://myDataSource due to: No component found with scheme: jdbc
at org.apache.camel.impl.DefaultCamelContext.getEndpoint(DefaultCamelContext.java:534)
at org.apache.camel.util.CamelContextHelper.getMandatoryEndpoint(CamelContextHelper.java:63)
at org.apache.camel.model.RouteDefinition.resolveEndpoint(RouteDefinition.java:192)
at org.apache.camel.impl.DefaultRouteContext.resolveEndpoint(DefaultRouteContext.java:106)
at org.apache.camel.impl.DefaultRouteContext.resolveEndpoint(DefaultRouteContext.java:112)
at org.apache.camel.model.SendDefinition.resolveEndpoint(SendDefinition.java:61)
at org.apache.camel.model.SendDefinition.createProcessor(SendDefinition.java:55)
at org.apache.camel.model.ProcessorDefinition.makeProcessor(ProcessorDefinition.java:500)
at org.apache.camel.model.ProcessorDefinition.addRoutes(ProcessorDefinition.java:213)
at org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:909)
... 12 more
[Thread-0] INFO org.apache.camel.main.MainSupport$HangupInterceptor - Received hang up - stopping the main instance.
3 ответа
Так глупо я! Я не включил camel-jdbc-2.12.1.jar в CLASSPATH. Теперь вышеприведенные примеры работают.
Существует пример SQL, который показывает, как настроить DataSource
Да, что примеры с использованием Spring XML. Но то, как вы настраиваете DataSource, можно сделать и в коде Java. Затем вам нужно зарегистрировать источник данных в Camel Registry.
Например, вы можете использовать JndiRegistry
или SimpleRegistry
, Последнее проще.
Вот некоторый псевдокод, демонстрирующий принцип создания реестра, добавления компонентов в этот реестр и предоставления реестра конструктору DefaultCamelContext
,
SimpleRegistry registry = new SimpleRegistry();
// code to create data source here
DateSource ds = ...
registry.put("myDataSource", ds);
CamelContext camel = new DefaultCamelContext(registry);
Spring упоминается там только потому, что это очень полезная парадигма работы с БД (в основном из-за шаблонов, представленных Spring Framework.) Конечно, вы можете подключить стандартное соединение JDBC и реализовать DAO самостоятельно - в этом нет ничего плохого.