Hi
Yes, I tried that but maybe I implement4d it wrong:
final List<Gateway> body = exchange.getIn().getBody(List.class);
final Class<?> aClass = body.get(0).getClass();
final CodeSource codeSource = aClass.getProtectionDomain().getCodeSource();
log.info("************* onCompletion **************");
log.info("Class: " +aClass.getName());
log.info("Code source: " + codeSource.getLocation());
M
> On 25 Mar 2020, at 10:12, Zoran Regvart <[email protected]> wrote:
>
> 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
> <[email protected]> wrote:
>>
>>
>>
>>> On 25 Mar 2020, at 09:28, Zoran Regvart <[email protected]> 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
>>> <[email protected]> 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