> 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