Hi Mikael,
in the output you provided you're printing the name of the class, my
remark was about the fact that in Java you can have the same named
class loaded by two classloaders result in a ClassCastException. I
also provided a way to check for that.

zoran

On Wed, Mar 25, 2020 at 9:59 AM 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
>


-- 
Zoran Regvart

Reply via email to