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
> 

Reply via email to