Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

DataSourse com url dinâmica. (Spring)

Tenho uma rota que deve começar buscando arquivos .db (sqlite) de um diretório. Os nomes dos arquivos são dinâmicos, conforme a data que foram inseridos.

Como vocês fariam para pegar esses arquivos, ler os dados dele e enviar o arquivo para outra pasta?

Para ler os arquivos de uma pasta e enviar para outra eu sei que devemos usar

<from uri="file://diretorio?move=outrodiretorio" />

Mas a partir desse ponto, não estou sabendo usar o banco com o meu datasource, para que eu possa fazer o select e continuar a rota.

Segue um sample do camel-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:camel="http://camel.apache.org/schema/spring"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd        http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
    <!-- this is the JDBC data source which uses an sqlite database -->
    <bean class="org.apache.commons.dbcp2.BasicDataSource"
        destroy-method="close" id="dataSource">
        <property name="driverClassName" value="org.sqlite.JDBC"/>
        <property name="url" value="jdbc:sqlite:data/db/sample.db"/>
        <property name="username" value=""/>
        <property name="password" value=""/>
    </bean>
    <!-- configure the Camel SQL component to use the JDBC data source -->
    <bean class="org.apache.camel.component.sql.SqlComponent" id="sql">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <camelContext id="camelContext-b79610fc-a020-4545-9bb2-cc70681d430b"
        trace="false" xmlns="http://camel.apache.org/schema/spring">
        <propertyPlaceholder id="placeholder" location="classpath:sql.customers.import.properties"/>
        <route id="customers.route1">
            <from id="_from1" uri="sql:SELECT * FROM clientes"/>
            <log id="_log1" message="${body}"/>
            <to id="_to1" uri="mock:foo"/>
        </route>
    </camelContext>
</beans>

Desta forma funciona perfeitamente, buscando sempre do mesmo .db, pois a url do dataSource está estática, mas como fazê-la dinâmica? Ou talvez usar o file que está trafegando pela rota?

Obrigado.

1 resposta
solução!

Deixa eu responder minha própria pergunta, pois consegui achar a solução.

No camel context eu fiz a rota dessa forma:

<camelContext id="camelContext-b79610fc-a020-4545-9bb2-cc70681d430b"
        trace="false" xmlns="http://camel.apache.org/schema/spring">
        <propertyPlaceholder id="placeholder" location="classpath:sql.customers.import.properties"/>
        <route id="customers.route1">
            <from id="_from1" uri="file:data/db?move=done"/>
            <bean ref="dataSource" method="setUrl(jdbc:sqlite:${file:path})" />
            <to id="_to1" uri="sql:SELECT * FROM clientes"/>
            <log id="_log1" message="${body}"/>
        </route>
    </camelContext>

Inserindo dentro do meu bean, via method, a url do arquivo:

<bean ref="dataSource" method="setUrl(jdbc:sqlite:${file:path})" />

Simples e fácil.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software