2012-05-29 3 views
1

Я пытаюсь скопировать данные из Mysql (5.1.37) в базу данных Oracle (11) с помощью Camel и Spring. Конфигурация выглядит следующим образом:Как перенести данные из mysql в oracle с помощью camel

<camelContext id="camelContext" xmlns="http://camel.apache.org/schema/spring"> 
<route> 
    <from uri="direct:start" /> 
    <to uri="sql:select id, name, description from user?dataSourceRef=fromDataSource" /> 
    <to uri="sql:insert into user (id, name, description) values (#, #, #)?dataSourceRef=toDataSource"/> 
</route> 
</camelContext> 

Я бегу его, используя следующий код:

public void fetchUsers() throws Exception { 
    CamelContext context = (CamelContext) SpringUtil.getBean("camelContext"); 
    ProducerTemplate template = context.createProducerTemplate(); 
    context.start(); 
    template.sendBody("direct:start", "test"); 
} 

Однако я получаю исключение:

10:04:24,208 ERROR [main] DefaultErrorHandler - Failed delivery for (MessageId: ID-UNISTHDW177-55800-1338278663095-0-3 on ExchangeId: ID-UNISTHDW177-55800-1338278663095-0-2). Exhausted after delivery attempt: 1 caught: org.apache.camel.CamelExecutionException: Exception occurred during execution on the exchange: Exchange[Message: [{id=1, name=Carl, description=Developer}, {id=2, name=Lars, description=Developer}]] 
org.apache.camel.CamelExecutionException: Exception occurred during execution on the exchange: Exchange[Message: [{id=1, name=Carl, description=Developer}, {id=2, name=Lars, description=Developer}]] 
    at org.apache.camel.util.ObjectHelper.wrapCamelExecutionException(ObjectHelper.java:1237) 
    at org.apache.camel.impl.DefaultExchange.setException(DefaultExchange.java:282) 
    at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:64) 
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) 
    at org.apache.camel.processor.SendProcessor$2.doInAsyncProducer(SendProcessor.java:115) 
    at org.apache.camel.impl.ProducerCache.doInAsyncProducer(ProducerCache.java:285) 
    at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:110) 
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) 
    at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99) 
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) 
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:71) 
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) 
    at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99) 
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) 
    at org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:91) 
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) 
    at org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:333) 
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:223) 
    at org.apache.camel.processor.RouteContextProcessor.processNext(RouteContextProcessor.java:45) 
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) 
    at org.apache.camel.processor.interceptor.DefaultChannel.process(DefaultChannel.java:304) 
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) 
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:117) 
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:80) 
    at org.apache.camel.processor.RouteContextProcessor.processNext(RouteContextProcessor.java:45) 
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) 
    at org.apache.camel.processor.UnitOfWorkProcessor.process(UnitOfWorkProcessor.java:122) 
    at org.apache.camel.processor.RouteInflightRepositoryProcessor.processNext(RouteInflightRepositoryProcessor.java:50) 
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) 
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) 
    at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99) 
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) 
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:71) 
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) 
    at org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:61) 
    at org.apache.camel.processor.UnitOfWorkProcessor.processAsync(UnitOfWorkProcessor.java:150) 
    at org.apache.camel.processor.UnitOfWorkProcessor.process(UnitOfWorkProcessor.java:117) 
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:99) 
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:86) 
    at org.apache.camel.processor.UnitOfWorkProducer.process(UnitOfWorkProducer.java:63) 
    at org.apache.camel.impl.ProducerCache$2.doInProducer(ProducerCache.java:352) 
    at org.apache.camel.impl.ProducerCache$2.doInProducer(ProducerCache.java:324) 
    at org.apache.camel.impl.ProducerCache.doInProducer(ProducerCache.java:223) 
    at org.apache.camel.impl.ProducerCache.sendExchange(ProducerCache.java:324) 
    at org.apache.camel.impl.ProducerCache.send(ProducerCache.java:169) 
    at org.apache.camel.impl.DefaultProducerTemplate.send(DefaultProducerTemplate.java:111) 
    at org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:124) 
    at org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:131) 
    at com.unibet.finance.reporting.camel.GordiumFetcherTest.camelShouldFetchGordiumAttributes(GordiumFetcherTest.java:22) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
Caused by: java.lang.AbstractMethodError 
    at org.apache.camel.component.sql.SqlProducer$1.doInPreparedStatement(SqlProducer.java:50) 
    at org.apache.camel.component.sql.SqlProducer$1.doInPreparedStatement(SqlProducer.java:48) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:586) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:614) 
    at org.apache.camel.component.sql.SqlProducer.process(SqlProducer.java:48) 
    at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61) 
    ... 70 more 

Что я отсутствующий Вот?

+0

Как устанавливаются источники данных? Транзакционный? –

+0

Какую версию Camel вы используете? И какие версии драйвера JDBC. Я подозреваю, что драйвер JDBC может не поддерживать метаданные, так как AbstractMethodError выбрано –

+0

Я использую Camel 2.9.2 и драйверы Oracle 10.2.0.3.0. Я также попытался использовать 11.2.0.3.0, но там же возникла такая же проблема. Проблема, похоже, связана с классом 'oracle.jdbc.driver.T4CPreparedStatement'. Он просто не имеет метода getParameterMetaData(), который пытается вызвать Camel (в строке SqlProducer.java 50), и его суперклассы, похоже, не реализуют его. – uzilan

ответ

0

Эта ошибка возникает, когда ваш драйвер JDBC реализует более раннюю версию JDBC API, а затем одну из доступных в JRE, которую вы используете для запуска вашего приложения (и которое требуется Camel). В этом случае вам нужна версия API JDBC> = 3.

Необходимо решить проблему обновления драйвера Oracle до последней версии (поддерживающей вашу базу данных).

В комментарии вы написали, что уже пытались обновить версию драйвера (без эффекта). Вероятно, вы получили более старую версию драйвера Oracle где-то в каталоге lib/ext на вашем сервере приложений. Вероятно, вы используете Maven для извлечения драйвера JDBC Oracle, а другой экземпляр драйвера предоставляется сервером приложений.

Проблема не с верблюдом, а с драйвером JDBC и проблемой класса classpath. Исправьте проблему с вашим классом, и Camel выполнит свою работу :).

+0

Я не использую его через сервер, я пытаюсь его проверить. Я заменил драйвер последней (11.2.0.3.0) и снова отладил тест. Экземпляр PreparedStatement представляет собой oracle.jdbc.driver.T4CPreparedStatement и он по-прежнему не реализует метод getParameterMetaData(), и я получаю исключение. Поэтому я предполагаю, что это проблема Oracle. Означает ли это, что я просто не могу использовать Camel для вставки данных в базу данных Oracle? Есть ли обходной путь? – uzilan

+0

Oracle предоставляет несколько драйверов ojdbc_.jar, предназначенных для конкретной версии JDK. Вероятно, вы не используете правильный. Если вы запустите Java 6, убедитесь, что вы используете драйвер ojdbc6. –

+0

Насколько я помню, Oracle заявляет, что поддерживает JDBC3 полностью с определенной версии своего драйвера. Это означало бы, что можно выбрать драйвер, который реализует метод getParameterMetaData(). –