camel-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Christian Müller <christian.muel...@gmail.com>
Subject Re: action at the end of the split
Date Mon, 10 Aug 2015 20:15:51 GMT
http://camel.apache.org/splitter.html

Best,

Christian
-----------------

Software Integration Specialist

Apache Member
V.P. Apache Camel | Apache Camel PMC Member | Apache Camel committer
Apache Incubator PMC Member

https://www.linkedin.com/pub/christian-mueller/11/551/642

On Mon, Aug 10, 2015 at 10:15 PM, Christian Müller <
christian.mueller@gmail.com> wrote:

> Sure, that's how stream works. We do not load the entire payload into
> memory.
> Why don't you use the property CamelSplitIndex? In this case, the output
> will be
>
> [Test worker] INFO route1 - each time 0
>
> [Test worker] INFO route1 - each time 1
>
> [Test worker] INFO route1 - each time 2
>
> Best,
>
> Christian
> -----------------
>
> Software Integration Specialist
>
> Apache Member
> V.P. Apache Camel | Apache Camel PMC Member | Apache Camel committer
> Apache Incubator PMC Member
>
> https://www.linkedin.com/pub/christian-mueller/11/551/642
>
> On Mon, Aug 10, 2015 at 4:35 AM, Wilson MacGyver <wmacgyver@gmail.com>
> wrote:
>
>> public class SplitTest extends CamelTestSupport {
>>
>>     @EndpointInject(uri = "mock:result")
>>
>>     protected MockEndpoint resultEndpoint;
>>
>>
>>     @Produce(uri = "direct:testSplit")
>>
>>     protected org.apache.camel.ProducerTemplate template;
>>
>>
>>     @Test
>>
>>     public void testWithString() throws Exception{
>>
>>         String content = "a\nb\nc";
>>
>>
>>         resultEndpoint.expectedMessageCount(3);
>>
>>
>>         template.sendBodyAndHeader(
>>
>>                 content,
>>
>>                 "foo", "bar");
>>
>>
>>         resultEndpoint.assertIsSatisfied();
>>
>>     }
>>
>>
>>     @Override
>>
>>     protected RouteBuilder createRouteBuilder() {
>>
>>         return new RouteBuilder() {
>>
>>             public void configure() {
>>
>>                 from("direct:testSplit")
>>
>>                         .split(body().tokenize("\n")).streaming()
>>
>>                             .log("each time ${property.CamelSplitSize}")
>>
>>                             .to("mock:result")
>>
>>                         .end()
>>
>>                         .log("Processed ${property.CamelSplitSize}
>> updates")
>>
>>                         .log("should only happen once");
>>
>>             }
>>
>>         };
>>
>>     }
>>
>> }
>>
>>
>> running this, I get the following
>>
>>
>>
>> [Test worker] INFO route1 - each time
>>
>> [Test worker] INFO route1 - each time
>>
>> [Test worker] INFO route1 - each time 3
>>
>> [Test worker] INFO route1 - Processed  updates
>>
>> [Test worker] INFO route1 - should only happen once
>>
>>
>> given the input of 3 lines. CamelSplitSize is only set at the end of the
>> split. so only the 3rd time has the 3 displayed which is correct.
>>
>> however notice it says  Processed  updates, because the property is only
>> set within the split..end block
>>
>> that's what I meant by out of scope
>>
>>
>>
>> On Sun, Aug 9, 2015 at 3:23 PM, Christian Müller <
>> christian.mueller@gmail.com> wrote:
>>
>> > What do you mean with "is out of scope"?
>> > You can use the message header to get this information.
>> >
>> > Best,
>> >
>> > Christian
>> > -----------------
>> >
>> > Software Integration Specialist
>> >
>> > Apache Member
>> > V.P. Apache Camel | Apache Camel PMC Member | Apache Camel committer
>> > Apache Incubator PMC Member
>> >
>> > https://www.linkedin.com/pub/christian-mueller/11/551/642
>> >
>> > On Thu, Aug 6, 2015 at 5:26 PM, Wilson MacGyver <wmacgyver@gmail.com>
>> > wrote:
>> >
>> > > I figured out what I was doing wrong.  It's because I was using filter
>> > with
>> > > bean. I didn't realize I had to add an end() to terminate the
>> filtering
>> > >
>> > >
>> > > from()
>> > >
>> > > .split(body().tokenize("\n")).streaming()
>> > >
>> > > .process() /do stuff
>> > >
>> > > .filter().method(MyFilter.class, "keepIt")
>> > >
>> > >   .to("mock:result")
>> > >
>> > > .end()
>> > >
>> > > .log("final time ${property.CamelSplitSize}")
>> > >
>> > > .to(smtp://)
>> > >
>> > >
>> > > now I have a different problem. I need to know the # of total
>> processed.
>> > > But the CamelSplitSize property is out of scope. Anyway to work around
>> > > that?
>> > >
>> > >
>> > > Thanks
>> > >
>> > >
>> > >
>> > > On Thu, Jul 23, 2015 at 2:03 PM, Claus Ibsen <claus.ibsen@gmail.com>
>> > > wrote:
>> > >
>> > > > You must be doing some more inside the splitter and you may need 2
x
>> > end
>> > > >
>> > > > On Thu, Jul 23, 2015 at 7:45 PM, Wilson MacGyver <
>> wmacgyver@gmail.com>
>> > > > wrote:
>> > > > > hmm, if I understand you correctly, this isn't working for me.
>> > > > >
>> > > > > I have
>> > > > >
>> > > > > from()
>> > > > >
>> > > > > .split(body().tokenize("\n")).streaming()
>> > > > >
>> > > > > .process() /do stuff
>> > > > >
>> > > > > .end()
>> > > > >
>> > > > > .log("${in.body}")
>> > > > >
>> > > > > .to(smtp://)
>> > > > >
>> > > > >
>> > > > > say if the file has 100 lines, I'd except to see the log once
if I
>> > > > > understand what you are saying correctly. but I see the log 100
>> > times.
>> > > > >
>> > > > >
>> > > > > Thanks,
>> > > > >
>> > > > >
>> > > > >
>> > > > > On Thu, Jul 23, 2015 at 1:24 PM, Claus Ibsen <
>> claus.ibsen@gmail.com>
>> > > > wrote:
>> > > > >
>> > > > >> You can do that after the splitter
>> > > > >>
>> > > > >> <from>
>> > > > >>   <split>
>> > > > >>     ... inside splitter
>> > > > >>   </split>
>> > > > >>  .. split done
>> > > > >>   <to email> send email here
>> > > > >>
>> > > > >> In Java DSL you can use .end() to end the split block.
>> > > > >>
>> > > > >> On Thu, Jul 23, 2015 at 7:21 PM, Wilson MacGyver <
>> > wmacgyver@gmail.com
>> > > >
>> > > > >> wrote:
>> > > > >> > Hi,
>> > > > >> >
>> > > > >> > I'm processing a large file. so I use .split and .streaming
to
>> > > process
>> > > > >> it a
>> > > > >> > record at a time.
>> > > > >> >
>> > > > >> > I would like to send an email alert upon completion
of
>> processing
>> > > the
>> > > > >> file.
>> > > > >> >
>> > > > >> > but I can't figure out where to do that.
>> > > > >> >
>> > > > >> > I know I can check to see if it's the last exchange
using
>> property
>> > > > >> > "CamelSplitComplete", but it's set to true on the last
>> exchange.
>> > So
>> > > I
>> > > > >> still
>> > > > >> > need to let it finish.
>> > > > >> >
>> > > > >> > Is there a good way to this?
>> > > > >> >
>> > > > >> > Thanks,
>> > > > >> > Mac
>> > > > >> >
>> > > > >> > --
>> > > > >> > Omnem crede diem tibi diluxisse supremum.
>> > > > >>
>> > > > >>
>> > > > >>
>> > > > >> --
>> > > > >> Claus Ibsen
>> > > > >> -----------------
>> > > > >> http://davsclaus.com @davsclaus
>> > > > >> Camel in Action 2nd edition: http://www.manning.com/ibsen2
>> > > > >>
>> > > > >
>> > > > >
>> > > > >
>> > > > > --
>> > > > > Omnem crede diem tibi diluxisse supremum.
>> > > >
>> > > >
>> > > >
>> > > > --
>> > > > Claus Ibsen
>> > > > -----------------
>> > > > http://davsclaus.com @davsclaus
>> > > > Camel in Action 2nd edition: http://www.manning.com/ibsen2
>> > > >
>> > >
>> > >
>> > >
>> > > --
>> > > Omnem crede diem tibi diluxisse supremum.
>> > >
>> >
>>
>>
>>
>> --
>> Omnem crede diem tibi diluxisse supremum.
>>
>
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message