I implemented CompletionAwareAggregationStrategy and in onCompletion() I checked the class but it crashes with an Ex eption in there as well…
> On 25 Mar 2020, at 09:59, Mikael Andersson Wigander > <mikael.grevs...@gmail.com> wrote: > > > >> On 25 Mar 2020, at 09:28, Zoran Regvart <zo...@regvart.com> wrote: >> Thx > > I have tried this and they are the same > > > ************* onCompletion ************** > 2020-03-25 09:57:16.747 INFO 77480 --- [nio-8080-exec-9] > s.t.m.u.ArrayListAggregationStrategy : Class: > se.tradechannel.mifid.gateway.model.Gateway > 2020-03-25 09:57:16.747 INFO 77480 --- [nio-8080-exec-9] > s.t.m.u.ArrayListAggregationStrategy : Code source: > file:/Users/mgr/IdeaProjects/mifid/target/classes/ > 2020-03-25 09:57:16.748 DEBUG 77480 --- [nio-8080-exec-9] > o.a.c.p.aggregate.AggregateProcessor : Processing aggregated exchange: > Exchange[ID-MAW-MacBook-Space-local-1585126611320-0-2] > 2020-03-25 09:57:16.751 INFO 77480 --- [nio-8080-exec-9] SHUTTLE > : Aggregation state: 1 > 2020-03-25 09:57:16.751 INFO 77480 --- [nio-8080-exec-9] SHUTTLE > : Aggregation completed by: force > 2020-03-25 09:57:20.709 DEBUG 77480 --- [eRecoverChecker] > o.a.c.c.l.LevelDBAggregationRepository : Scanned and found 1 exchange(s) to > recover (note some of them may already be in progress). > 2020-03-25 09:57:24.563 INFO 77480 --- [nio-8080-exec-9] > s.t.m.gateway.routes.ShuttleIntegration : ************* > direct:investmentFirm ************** > 2020-03-25 09:57:25.090 INFO 77480 --- [nio-8080-exec-9] > s.t.m.gateway.routes.ShuttleIntegration : Class: > se.tradechannel.mifid.gateway.model.Gateway > 2020-03-25 09:57:25.795 INFO 77480 --- [nio-8080-exec-9] > s.t.m.gateway.routes.ShuttleIntegration : Code source: > file:/Users/mgr/IdeaProjects/mifid/target/classes/ > 2020-03-25 09:57:42.410 ERROR 77480 --- [nio-8080-exec-9] > s.t.m.gateway.routes.ShuttleIntegration : Error occurred in > ShuttleIntegration > > > >> Hi Mikael, >> ClassCastException with SameClass cannot be cast to SameClass means >> that there is an object passed from one classloader and being cast to >> a type loaded from another classloader. >> >> Look at the difference between obj.getClass() and SameClass.class, I >> usually check with getProtectionDomain().getCodeSource() on those >> class objects. >> >> zoran >> >> >> On Wed, Mar 25, 2020 at 8:23 AM Mikael Andersson Wigander >> <mikael.grevs...@gmail.com> wrote: >>> >>> TL;DR >>> >>> We have a very interesting mystery in one of our Camel applications. >>> >>> We have a route where we aggregate incoming messages. >>> The messages are first unmarshalled from a JSON String to a Map<String, >>> Object> and then processed thru a model ending up with a POJO of “Gateway >>> objects". >>> This POJO is then aggregated in a List<Gateway>. The POJO implements >>> Serializable and has equals() and hash. >>> >>> The aggregationStrategy is from the example in documentation when wanting >>> to aggregate a List… >>> >>> LevelDB is used for persistance Repository >>> >>> When flushed we process the Exchange and starts looping using a for-loop >>> >>> final List<Gateway> body=exchange.getIn().getBody(List.class); >>> boolean hasObject=false; >>> for(Gateway s:body){ >>> final InvestmentFirm investmentFirm=s.getInvestmentFirm(); >>> if(null!=investmentFirm){ >>> if(StringUtils.isNoneBlank(investmentFirm.getExternalId())){ >>> hasObject=true; >>> break; >>> } >>> } >>> } >>> >>> >>> The thing is where we get an Exception at the start of the for-loop, saying >>> : >>> >>> java.lang.ClassCastException: se.tradechannel.mifid.gateway.model.Gateway >>> cannot be cast to se.tradechannel.mifid.gateway.model.Gateway >>> >>> I have debugged the code and the outcome of the aggregation is a >>> List<Gateway> but when starting to loop we get the exception >>> >>> >>> And if we step here it will crash. >>> >>> We have refactored the aggregation for this route; previously we >>> unmarshalled the incoming JSON string to a Map<String, Object> and >>> aggregated this in a List but here we use Object as the datatype. After >>> flushing we execute the same logic with the for-loop and it runs fine… >>> >>> Below is a snippet of the code >>> >>> public void configure() throws Exception { >>> final DefaultAggregateController defaultAggregateController = new >>> DefaultAggregateController(); >>> >>> final LevelDBAggregationRepository shuttleRepo = new >>> LevelDBAggregationRepository("shuttleArt26", >>> "mifir/data/shuttle/article26.dat"); >>> >>> >>> //tag::route[] >>> from("{{shuttle.jms.incoming}}") >>> .unmarshal().json(JsonLibrary.Jackson, true) >>> .process(this::createShuttleObject) >>> .aggregate(constant(true), new ArrayListAggregationStrategy()) >>> .aggregateController(defaultAggregateController) >>> .aggregationRepository(shuttleRepo) >>> .parallelProcessing(false) >>> .completionSize(aggregation_size) >>> .stopOnException() >>> .to("direct:investmentFirm") >>> >>> .end(); >>> >>> >>> from("direct:investmentFirm") >>> .choice() >>> .when(exchange -> { //<.> >>> final List<Gateway> body = >>> exchange.getIn().getBody(List.class); >>> boolean hasObject = false; >>> for (Gateway s : body) { >>> final InvestmentFirm investmentFirm = >>> s.getInvestmentFirm(); >>> if (null != investmentFirm) { >>> if >>> (StringUtils.isNoneBlank(investmentFirm.getExternalId())) { >>> hasObject = true; >>> break; >>> } >>> } >>> } >>> log.debug("InvestmentFirms = " + hasObject); >>> return hasObject; >>> }) >>> .end(); >>> >>> } >>> >>> public class ArrayListAggregationStrategy implements AggregationStrategy { >>> public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { >>> List<Gateway> newBody = newExchange.getIn().getBody(ArrayList.class); >>> List<Gateway> list; >>> >>> >>> //Ignore Exception here >>> if (null != newExchange.getException()) { >>> return oldExchange; >>> } >>> >>> //First Exchange to aggregate >>> if (null == oldExchange) { >>> list = new ArrayList<>(newBody); >>> newExchange.getIn().setBody(list); >>> return newExchange; >>> } else { >>> list = oldExchange.getIn().getBody(ArrayList.class); >>> list.addAll(newBody); >>> oldExchange.getIn().setBody(list); >>> return oldExchange; >>> } >>> } >>> } >>> >>> >>> >>> >>> >>> We really can’t see what the heck is going on, it seems OK everything but >>> "the computer says No!” >>> >>> Anyone? >>> >>> Thx >>> >>> M >> >> >> >> -- >> Zoran Regvart >