Hi

An alternative is maybe to use 2 routes, where the first route checks
if that 2nd file exists with a <choice> and then move the files to
another folder, where the 2nd route pickup and process that file,
knowing that the other file exists.
On Thu, Dec 13, 2018 at 3:20 PM Claus Ibsen <claus.ib...@gmail.com> wrote:
>
> Hi
>
> You can use a bit of Java code to read the file content into memory, and then 
> use xpath to extract that other file name.
> Camel has some helper APIs for that in IOHelper#loadTexxt and XPathBuilder.
>
> Here is some snippet from an unit test
>
> @Test
> public void testNotUsingExchangeResultType() throws Exception {
>     String xml = "<xml><a>1</a><a>2</a></xml>";
>
>     // will evaluate as NodeSet
>     XPathBuilder xpb = new XPathBuilder("/xml/a/text()");
>     assertEquals("12", xpb.evaluate(context, xml, String.class));
>
>     xpb.setResultType(String.class);
>     assertEquals("1", xpb.evaluate(context, xml));
> }
> On Thu, Dec 13, 2018 at 2:58 PM John F. Berry <bohnje...@yahoo.com.invalid> 
> wrote:
> >
> >  Thank you Claus.. it's great to hear from you again..
> > I did see an example close to this on stackoverflow.. someone referenced a 
> > bean as a filter to check for an extra file to exist, but in that example 
> > the extra file's name that needed to exist was static.The "chicken or the 
> > egg" question about that is.. I need to use the xpath in the current 
> > consumed XML to determine what file should exist for the route to continue. 
> > I haven't seen to many examples of parameter passing of the internal 
> > workings of a Camel route to beans and the route accepting data from to use 
> > in <choice>.  I did think I needed to pass this off to another java 
> > execution, thus the reason I'm pulling my results to the log and so forth, 
> > but I still thought I needed the facilites of the CamelContext to run 
> > first... or is the filter not really so close on incept of an inbound file 
> > as I think?   Is the inbound "message" (file in this case) really 
> > "consumed" as in loaded/headers made, etc. before the filter instruction 
> > applies?
> > Thanks for the heads up on noop.. I did know I had to address that once 
> > things were in place.. I put it there to test "once throughs" and was going 
> > to adjust that later in testing.
> >
> >
> >     On ‎Thursday‎, ‎December‎ ‎13‎, ‎2018‎ ‎02‎:‎43‎:‎00‎ ‎AM‎ ‎EST, Claus 
> > Ibsen <claus.ib...@gmail.com> wrote:
> >
> >  Hi
> >
> > Just use Java - You can use Java File API to check for the existence
> > of a file ;)
> >
> > You can also use a file filter to only pickup the file where you check
> > for the existence of that other file.
> > You can then write a bit of Java code as the filter and configure it
> > on the file endpoint. In the filter you grab the file context, do the
> > xpath to extract the name, and check for the file exists.
> >
> > Also mind that noop=true will leave the file as-is after processing
> > it, but will not pickup it again, unless you configure the idempotent
> > to false also. Which you would need in cases while you may
> > wait for that other file.
> >
> > So the better alternative is the file filter, and then move the files
> > after it has been processed, so you wont process the file again in the
> > future.
> > On Thu, Dec 13, 2018 at 1:58 AM John F. Berry
> > <bohnje...@yahoo.com.invalid> wrote:
> > >
> > > OK.. not hearing any pre-build advise.. I started building.
> > > I can successfully extract the XML field value that is the name of the 
> > > work file out of the consumed file of the route.
> > > What I need to do is only move both (the file I'm consuming and it's work 
> > > file).. if the work file shows up..
> > >
> > > Here's what I got so far....
> > >
> > >
> > > package org.mainegeneral.camel;
> > > import org.apache.camel.Processor;
> > > import org.apache.camel.Exchange;
> > > import org.apache.camel.builder.RouteBuilder;
> > > public class MyRouteBuilder extends RouteBuilder {
> > >    public void configure() {
> > >        from("file:src/data?noop=true&include=.*\\.xml")
> > >        
> > > .setProperty("SourceFN").xpath("/SYSTEMJOB/WORKDETAIL/SOURCE_FILENAME", 
> > > String.class)
> > >        .process(new Processor() {
> > >                      public void process(Exchange exchange) throws 
> > > Exception {
> > >              }
> > >          } )
> > >        .log("Reading XML file: ${header.CamelFileName}")
> > >        .log("XML Source Filename = ${property.SourceFN}")
> > >        .to("file:target/messages/others");
> > >    }
> > > }
> > >
> > >
> > > Now I will need to not move the XML I'm consuming if the file named in 
> > > SOURCE_FILENAME doesn't yet exist, and go on to the other XML files in 
> > > the directory and come back to check this one.
> > > I was going to use a choice to perform both those moves in.. but 
> > > struggling to check for the named SOURCE_FILENAME's existance.
> > >
> > > Suggestions?
> > >
> > > Thanks!
> > >
> > >
> > >
> > >
> > >
> > > On Monday, December 10, 2018, 3:10:09 PM EST, John F. Berry 
> > > <bohnje...@yahoo.com.INVALID> wrote:
> > >
> > >
> > >
> > >
> > >
> > > Figured I'd try something new and ask for advice here first before 
> > > hitting a brick wall and asking after I hit that dead end...I need to 
> > > poll for XML files dumping into a specific NFS directory, read in the 
> > > XML, find the "work" file generated by the task that generated the XML, 
> > > and move both files together.  The XML file is a custom small app 
> > > specific job detail sort of file, with the exported work contained in a 
> > > file named between the <SOURCE_FILENAME> tag.I could just regex the file, 
> > > instead of parsing XML "officially", then use a choice and when 
> > > satisfied, move both the file I'm reading, and the result from the regex. 
> > >  I don't really need the 50 or so other job statistic tags contained in 
> > > the XML.  I plan to use Java DSL with a blueprint or some Karaf supported 
> > > type to run as a bundle.
> > > Since these xml files are generated at invocation, the "work" file might 
> > > not show up for a few minutes.  In that time, I'm hoping to round-robin 
> > > any other XML files to find completed "pairs" in this landing directory. 
> > > Sound simple enough?  Any gotchas that people can think of?
> > > Thanks!
> >
> >
> >
> > --
> > Claus Ibsen
> > -----------------
> > http://davsclaus.com @davsclaus
> > Camel in Action 2: https://www.manning.com/ibsen2
>
>
>
> --
> Claus Ibsen
> -----------------
> http://davsclaus.com @davsclaus
> Camel in Action 2: https://www.manning.com/ibsen2



-- 
Claus Ibsen
-----------------
http://davsclaus.com @davsclaus
Camel in Action 2: https://www.manning.com/ibsen2

Reply via email to