0

I am beginner for camel. I have some problem.

We are implementing file transfer system using camel.

I set property from external property file.

But application is not accessed to this property file. We cannot use propertyplaceholder because the value will be changed at runtime.

We implemented it like below.

  • camelContext.xml :

    <bean id="myProperties" class="java.util.Properties"/>
    <bean id="propertylist"
        class="org.apache.camel.component.properties.PropertiesComponent">
    <property name="cache" value="true"/>
    <property name="location" value="classpath:camelap.properties"/>
    <property name="overrideProperties" ref="myProperties"/>
    </bean>
    <camelContext id="camelContext-f611cb6c-d516-4346-9adc-5512d327a88d"
                trace="false" xmlns="http://camel.apache.org/schema/spring">
    <camel:route id="initial_info">
        <camel:from id="_initial" uri="direct:sqlParam"/>
        <camel:to id="_selectReference" uri="sql:{{sql.referenceInfo}}?
            dataSource=dataSource"/>
        <camel:process id="_process1" ref="tempBean"/>
        <camel:log id="_aaaa" loggingLevel="WARN" message="tttttttt :::
            {{test}} ::: ${header.sourceDirectory}"/>
    </camel:route>
    
  • camelap.properties :

    path : target/classes
    file.uri=/home/WRK/KR/SND/DAT
    test=OLD_VALUE
    file.pattern=SLPNPM*,SPLNCC*,SLPNCM*,SLPNPC*
    
    ############################################
    ## SQL Statement ##
    ############################################
    sql.referenceInfo=SELECT DISTINCT \
                            A.WFLOW_INST_ID ,\
                            TO_CHAR(A.EFCT_ST_DT,'YYYYMMDDHH24MISS') EFCT_ST_DT, \
                            B.NE_ID , \
                            B.NE_TYPE_ID , \
                            B.CDR_FILE_COLEC_DIR_NM , \
                            B.ORIGIN_FMT_ID , \
                            B.TRM_DIR_NM , \
                            D.CDR_FILE_NMNG_RULE_SBST, \
                            D.FILE_NM_LEN , \
                            B.FNS_FILE_CRET_YN , \
                            B.FNS_FILE_DIV_CD \
                            FROM TB_WFLOW_INFO A, \
                                TB_CDRSEND_BASE_INFO B, \
                                TB_FILE_FMT_INFO D \
                            WHERE A.WFLOW_INST_ID = 'P1_IPTVKR' \
                            AND B.NE_ID = 'KRLPPM10' \
                            AND now() BETWEEN A.EFCT_ST_DT AND A.EXP_DT \
                            AND now() BETWEEN B.EFCT_ST_DT AND B.EXP_DT \
                            AND A.WFLOW_INST_ID = B.WFLOW_INST_ID \
                            AND B.ORIGIN_FMT_ID = D.CDR_FILE_FMT_ID;
    
  • Error Log :

       org.apache.camel.RuntimeCamelException:
       org.apache.camel.FailedToCreateRouteException: Failed to create route initial_info at: >>> To[sql:{{sql.referenceInfo}}?dataSource=dataSource] <<< in route: Route(initial_info)[[From[direct:sqlParam]] -> [To[sql:{{sql... because of Property with key [sql.referenceInfo] not found in properties from text: sql:{{sql.referenceInfo}}?dataSource=dataSource
           at org.apache.camel.util.ObjectHelper.wrapRuntimeCamelException(ObjectHelper.java:1826) ~[camel-core-2.23.1.jar:2.23.1]
           at org.apache.camel.spring.SpringCamelContext.start(SpringCamelContext.java:136) ~[camel-spring-2.23.1.jar:2.23.1]
           at org.apache.camel.spring.CamelContextFactoryBean.start(CamelContextFactoryBean.java:370) ~[camel-spring-2.23.1.jar:2.23.1]
           at org.apache.camel.spring.CamelContextFactoryBean.onApplicationEvent(CamelContextFactoryBean.java:417) ~[camel-spring-2.23.1.jar:2.23.1]
           at org.apache.camel.spring.CamelContextFactoryBean.onApplicationEvent(CamelContextFactoryBean.java:95) ~[camel-spring-2.23.1.jar:2.23.1]
           at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172) ~[spring-context-5.1.5.RELEASE.jar:5.1.5.RELEASE]
           at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165) ~[spring-context-5.1.5.RELEASE.jar:5.1.5.RELEASE]
           at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139) ~[spring-context-5.1.5.RELEASE.jar:5.1.5.RELEASE]
           at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:402) ~[spring-context-5.1.5.RELEASE.jar:5.1.5.RELEASE]
           at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:359) ~[spring-context-5.1.5.RELEASE.jar:5.1.5.RELEASE]
           at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:896) ~[spring-context-5.1.5.RELEASE.jar:5.1.5.RELEASE]
           at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.finishRefresh(ServletWebServerApplicationContext.java:163) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
           at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:552) ~[spring-context-5.1.5.RELEASE.jar:5.1.5.RELEASE]
           at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
           at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
           at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
      at org.springframework.boot.SpringApplication.run(SpringApplication.java:316) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
      at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
      at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
      at com.ktds.openmzn.OpenmznApplication.main(OpenmznApplication.java:25) ~[classes/:na]
      .....
      Caused by: java.lang.IllegalArgumentException: Property with key [sql.referenceInfo] not found in properties from text: sql:{{sql.referenceInfo}}?dataSource=dataSource
      at org.apache.camel.component.properties.DefaultPropertiesParser$ParsingContext.getPropertyValue(DefaultPropertiesParser.java:271) ~[camel-core-2.23.1.jar:2.23.1]
      at org.apache.camel.component.properties.DefaultPropertiesParser$ParsingContext.readProperty(DefaultPropertiesParser.java:157) ~[camel-core-2.23.1.jar:2.23.1]
      at org.apache.camel.component.properties.DefaultPropertiesParser$ParsingContext.doParse(DefaultPropertiesParser.java:116) ~[camel-core-2.23.1.jar:2.23.1]
      at org.apache.camel.component.properties.DefaultPropertiesParser$ParsingContext.parse(DefaultPropertiesParser.java:100) ~[camel-core-2.23.1.jar:2.23.1]
      at org.apache.camel.component.properties.DefaultPropertiesParser.parseUri(DefaultPropertiesParser.java:63) ~[camel-core-2.23.1.jar:2.23.1]
      at org.apache.camel.component.properties.PropertiesComponent.parseUri(PropertiesComponent.java:235) ~[camel-core-2.23.1.jar:2.23.1]
      at org.apache.camel.component.properties.PropertiesComponent.parseUri(PropertiesComponent.java:178) ~[camel-core-2.23.1.jar:2.23.1]
      at org.apache.camel.impl.DefaultCamelContext.resolvePropertyPlaceholders(DefaultCamelContext.java:2547) ~[camel-core-2.23.1.jar:2.23.1]
    
Nicolás Alarcón Rapela
  • 2,714
  • 1
  • 18
  • 29
이성규
  • 125
  • 11

1 Answers1

1

If you want to use the properties component, you need to bind a name with properties, just like this.

<camelContext trace="{{foo.trace}}" xmlns="http://camel.apache.org/schema/spring">
    <propertyPlaceholder id="properties" location="org/apache/camel/spring/processor/myprop.properties"/>
    <template id="camelTemplate" defaultEndpoint="{{foo.cool}}"/>
    <route>
        <from uri="direct:start"/>
        <setHeader headerName="{{foo.header}}">
            <simple>${in.body} World!</simple>
        </setHeader>
        <to uri="mock:result"/>
    </route>
</camelContext>

You can find more information here

Not sure if you are using spring boot, there is a simple way to leverage the spring boot properties within Camel Route.

Willem Jiang
  • 3,291
  • 1
  • 14
  • 14
  • Thank you for your comment. But I want to use Property, not propertyPlaceholder because I read some articles that property value can be changed at runtime by the use of property, but the use of propertyplaceholder cannot change the value. I want to how to bind property using property tag. Thank you. – 이성규 Mar 27 '19 at 00:15
  • 1
    PropertyPlaceHolder helps us to resolve the value from property component. The example is to help you to fix the exception. If you use the property on the endpoint uri, it only takes the value of property when camel resolve the endpoint. – Willem Jiang Mar 29 '19 at 08:32