0

can you inject a value from the config params file in to the splitter group attribute? if so, what is the proper way of doing it? thanks!

I've tried,

<split streaming="true" >
<tokenize token="\n" group="{{noOfLines}}" />
<log message="Split Group Body: ${body}"/>
    <to uri="bean:extractHeader" />
    <to id="acceptedFileType" ref="pConsumer" /> 
</split>

<split streaming="true" >
<tokenize token="\n" group={{noOfLines}} />
<log message="Split Group Body: ${body}"/>
    <to uri="bean:extractHeader" />
    <to id="acceptedFileType" ref="pConsumer" /> 
</split>

what am I doing wrong?

ERROR:  'Open quote is expected for attribute "group" associated with an  element type  "tokenize".

<tokenize token="\n" group="<simple>${properties:noOfLines:500}</simple>" /> 
ERROR:  'The value of attribute "group" associated with an element type "tokenize" must not contain the '<' character.'

            <tokenize token="\n" group="${properties:noOfLines:500}" /> 

Caused by: org.xml.sax.SAXParseException: cvc-datatype-valid.1.2.1: '${properties:noOfLines:500}' is not a valid value for 'integer'.
GLMills
  • 558
  • 1
  • 12
  • 37

2 Answers2

0

my quest for info and answers didn't go deep enough. I found this was already encounted and answered by Claus Ibsen. Please see if you run in to this need.

Validation error with integer property (camel)

http://camel.apache.org/using-propertyplaceholder.html

under section "Using Property Placeholders for Any Kind of Attribute in the XML DSL"

here is what I did following these instructions.

added property prefix namespace xmlns:prop="http://camel.apache.org/schema/placeholder"

then modified the tokenize attribute

<tokenize token="\n" prop:group="noOfLines" />

I'm using the property placeholder

<cm:property-placeholder persistent-id="com.digital.passthru.core" />

this works like a charm. thank you Claus.

GLMills
  • 558
  • 1
  • 12
  • 37
  • Hey there, I'm trying to achieve the same thing but importing the xmlns can't resolve the uri `xmlns:prop="http://camel.apache.org/schema/placeholder"` can't resolve... any idea what's wrong? – Fede E. Sep 19 '18 at 13:49
  • Im facing the same issue but with Java DSL. any suggestion please ? – BSL Oct 11 '21 at 19:05
0

this is what worked for me.

<?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:prop="http://camel.apache.org/schema/placeholder"
      xmlns:camel="http://camel.apache.org/schema/blueprint"
      xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0"
      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">

    <cm:property-placeholder persistent-id="com.ge.digital.passthru.core" />

    <bean id="deadLetterErrorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder">
        <property name="deadLetterUri" value="${deadLetterQueue}"/>
        <property name="redeliveryPolicy" ref="redeliveryPolicyConfig"/>
        <property name="useOriginalMessage" value="true" />
    </bean>

    <bean id="redeliveryPolicyConfig" class="org.apache.camel.processor.RedeliveryPolicy">
        <property name="maximumRedeliveries" value="3"/>
        <property name="redeliveryDelay" value="5000" />

    </bean>

...

<camelContext     
  id="com.ge.digital.passthru.coreCamelContext"
  trace="true"
  xmlns="http://camel.apache.org/schema/blueprint"
  allowUseOriginalMessage="false"
  streamCache="true"
  errorHandlerRef="deadLetterErrorHandler" >

...

<route 
    id="core.predix.accept.file.type.route"
    autoStartup="true" >
    <from uri="{{fileEntranceEndpoint}}" />
    <convertBodyTo type="java.lang.String" />
    <split streaming="true" strategyRef="csvAggregationStrategy">
    <tokenize token="\n" />
      <process ref="toCsvFormat" />     <!-- passthru only we do not allow embedded commas in numeric data -->
    </split>
    <log message="CSV body: ${body}" loggingLevel="INFO"/>
    <choice>
        <when>
            <simple>${header.CamelFileName} regex '^.*\.(csv|CSV|txt|gpg)$'</simple>
            <log message="${file:name} accepted for processing..." />
            <choice>
              <when>
                <simple>${header.CamelFileName} regex '^.*\.(CSV|txt|gpg)$'</simple>
                <setHeader headerName="CamelFileName">
            <!--    <simple>${file:name.noext}.csv</simple> -->  <!-- file:name.noext.single -->
                    <simple>${file:name.noext.single}.csv</simple>
                </setHeader>
                <log message="${file:name} changed file name." />                   
              </when>
            </choice>
            <split streaming="true" >
            <tokenize token="\n" prop:group="noOfLines" />
            <log message="Split Group Body: ${body}"/>
                <to uri="bean:extractHeader" />
                <to id="acceptedFileType" ref="predixConsumer" /> 
            </split>
            <to uri="bean:extractHeader?method=cleanHeader"/>
        </when>
        <otherwise>  
            <log message="${file:name} is an unknown file type, sending to unhandled repo." loggingLevel="INFO" />
            <to uri="{{unhandledArchive}}" />
        </otherwise>
    </choice>
</route>

... and noOfLines is a property

now there is an order to all this as I found out while doing this also. please go to the link below for the Camel ordering of components in XML DSL

Camel DataFormat Jackson using blueprint XML DSL throws context exception

GLMills
  • 558
  • 1
  • 12
  • 37