0

I am using Jboss fuse 6.3 and apache camel 2.17.I wanted to split a huge json message in to multiple messages in camel spring dsl.

Sample message structure is below in this message i have 9 arrays of countries i need to split in to array of two as 5 messages the last message contains only one array.The order of messages doesn't matter.

Input message:

[{
        "Cities": [{

            "name": "Paris",
            "lat": "45.75",
            "lng": "4.583333"
        }, {

            "name": "Marseille",
            "lat": "45.97",
            "lng": "4.54"
        }, {

            "name": "Lyon",
            "lat": "24.75",
            "lng": "4.75"
        }, {

            "name": "Toulouse",
            "lat": "37.75",
            "lng": "4.755"
        }, {

            "name": "Nice",
            "lat": "89.75",
            "lng": "4.77"
        }],
        "country": "FR"
    },
    {
        "Cities": [{

            "name": "Berlin",
            "lat": "45.75",
            "lng": "4.583333"
        }, {

            "name": "Hamburg",
            "lat": "45.97",
            "lng": "4.54"
        }, {

            "name": "Munich",
            "lat": "24.75",
            "lng": "4.75"
        }, {

            "name": "Cologne",
            "lat": "37.75",
            "lng": "4.755"
        }, {

            "name": "Frankfurt",
            "lat": "89.75",
            "lng": "4.77"
        }],
        "country": "DE"
    }, {
        "Cities": [{

            "name": "mumbai",
            "lat": "45.75",
            "lng": "4.583333"
        }, {

            "name": "Bangalore",
            "lat": "45.97",
            "lng": "4.54"
        }, {

            "name": "Delhi",
            "lat": "24.75",
            "lng": "4.75"
        }, {

            "name": "Chattisgarh",
            "lat": "37.75",
            "lng": "4.755"
        }, {

            "name": "Hyderabad",
            "lat": "89.75",
            "lng": "4.77"
        }],
        "country": "IN"
    }, {
        "Cities": [{

            "name": "Aberdeen",
            "lat": "45.75",
            "lng": "4.583333"
        }, {

            "name": "Armagh",
            "lat": "45.97",
            "lng": "4.54"
        }, {

            "name": "Bangor",
            "lat": "24.75",
            "lng": "4.75"
        }, {

            "name": "Bath",
            "lat": "37.75",
            "lng": "4.755"
        }, {

            "name": "Belfast",
            "lat": "89.75",
            "lng": "4.77"
        }],
        "country": "UK"
    }, {
        "Cities": [{

            "name": "Budapest",
            "lat": "45.75",
            "lng": "4.583333"
        }, {

            "name": "Debrecen",
            "lat": "45.97",
            "lng": "4.54"
        }, {

            "name": "Szeged",
            "lat": "24.75",
            "lng": "4.75"
        }, {

            "name": "Miskolc",
            "lat": "37.75",
            "lng": "4.755"
        }, {

            "name": "Pecs",
            "lat": "89.75",
            "lng": "4.77"
        }],
        "country": "HUNGARY"
    }, {
        "Cities": [{

            "name": "Alingsas",
            "lat": "45.75",
            "lng": "4.583333"
        }, {

            "name": "Arboga",
            "lat": "45.97",
            "lng": "4.54"
        }, {

            "name": "Arvika",
            "lat": "24.75",
            "lng": "4.75"
        }, {

            "name": "Askersund",
            "lat": "37.75",
            "lng": "4.755"
        }, {

            "name": "Avesta",
            "lat": "89.75",
            "lng": "4.77"
        }],
        "country": "SWEDEN"
    }, {
        "Cities": [{

            "name": "Amsterdam",
            "lat": "45.75",
            "lng": "4.583333"
        }, {

            "name": "Den Helder",
            "lat": "45.97",
            "lng": "4.54"
        }, {

            "name": "Edam",
            "lat": "24.75",
            "lng": "4.75"
        }, {

            "name": "Haarlem",
            "lat": "37.75",
            "lng": "4.755"
        }, {

            "name": "Purmerend",
            "lat": "89.75",
            "lng": "4.77"
        }],
        "country": "NETHERLANDS"
    }, {
        "Cities": [{

            "name": "Abrantes",
            "lat": "45.75",
            "lng": "4.583333"
        }, {

            "name": "Agualva-Cacem",
            "lat": "45.97",
            "lng": "4.54"
        }, {

            "name": "Agueda",
            "lat": "24.75",
            "lng": "4.75"
        }, {

            "name": "Albufeira",
            "lat": "37.75",
            "lng": "4.755"
        }, {

            "name": "Alcacer do Sal",
            "lat": "89.75",
            "lng": "4.77"
        }],
        "country": "PORTUGAL"
    }, {
        "Cities": [{

            "name": "Barcelona",
            "lat": "45.75",
            "lng": "4.583333"
        }, {

            "name": "madrid",
            "lat": "45.97",
            "lng": "4.54"
        }, {

            "name": "Saragossa",
            "lat": "24.75",
            "lng": "4.75"
        }, {

            "name": "Salamanca",
            "lat": "37.75",
            "lng": "4.755"
        }, {

            "name": "Granada",
            "lat": "89.75",
            "lng": "4.77"
        }],
        "country": "SPAIN"
    }
]

Expected output:

First split:

[{
        "Cities": [{

            "name": "Paris",
            "lat": "45.75",
            "lng": "4.583333"
        }, {

            "name": "Marseille",
            "lat": "45.97",
            "lng": "4.54"
        }, {

            "name": "Lyon",
            "lat": "24.75",
            "lng": "4.75"
        }, {

            "name": "Toulouse",
            "lat": "37.75",
            "lng": "4.755"
        }, {

            "name": "Nice",
            "lat": "89.75",
            "lng": "4.77"
        }],
        "country": "FR"
    },
    {
        "Cities": [{

            "name": "Berlin",
            "lat": "45.75",
            "lng": "4.583333"
        }, {

            "name": "Hamburg",
            "lat": "45.97",
            "lng": "4.54"
        }, {

            "name": "Munich",
            "lat": "24.75",
            "lng": "4.75"
        }, {

            "name": "Cologne",
            "lat": "37.75",
            "lng": "4.755"
        }, {

            "name": "Frankfurt",
            "lat": "89.75",
            "lng": "4.77"
        }],
        "country": "DE"
    }
]

Second split:

[{
        "Cities": [{

            "name": "mumbai",
            "lat": "45.75",
            "lng": "4.583333"
        }, {

            "name": "Bangalore",
            "lat": "45.97",
            "lng": "4.54"
        }, {

            "name": "Delhi",
            "lat": "24.75",
            "lng": "4.75"
        }, {

            "name": "Chattisgarh",
            "lat": "37.75",
            "lng": "4.755"
        }, {

            "name": "Hyderabad",
            "lat": "89.75",
            "lng": "4.77"
        }],
        "country": "IN"
    },{
        "Cities": [{

            "name": "Aberdeen",
            "lat": "45.75",
            "lng": "4.583333"
        }, {

            "name": "Armagh",
            "lat": "45.97",
            "lng": "4.54"
        }, {

            "name": "Bangor",
            "lat": "24.75",
            "lng": "4.75"
        }, {

            "name": "Bath",
            "lat": "37.75",
            "lng": "4.755"
        }, {

            "name": "Belfast",
            "lat": "89.75",
            "lng": "4.77"
        }],
        "country": "UK"
    }
]

. . .

Fifth split:

[{
        "Cities": [{

            "name": "Barcelona",
            "lat": "45.75",
            "lng": "4.583333"
        }, {

            "name": "madrid",
            "lat": "45.97",
            "lng": "4.54"
        }, {

            "name": "Saragossa",
            "lat": "24.75",
            "lng": "4.75"
        }, {

            "name": "Salamanca",
            "lat": "37.75",
            "lng": "4.755"
        }, {

            "name": "Granada",
            "lat": "89.75",
            "lng": "4.77"
        }],
        "country": "SPAIN"
    }
]

I tried below referring Apache Camel with Json Array split from the post of Ricardo.But iam not sure how to configure aggregate(AggregationStrategies.groupedExchange()) in spring dsl.

Camel route:

<split streaming="true">
                    <jsonpath>$</jsonpath>
                    <aggregate completionTimeout="1000" completionSize="2" groupExchanges="true">

                    </aggregate>

                    <log message="${body}"></log>
                </split>
Ravi
  • 1,247
  • 4
  • 15
  • 35
  • see if this helps https://stackoverflow.com/questions/47796217/apache-camel-with-json-array-split/47799999#47799999 – pvpkiran Jan 08 '18 at 11:16

2 Answers2

0

Here's a simple example of how you could split your JSON array using Spring DSL:

<split>
    <jsonpath>$</jsonpath>
    <!-- Add rest of the logic here -->
</split>
Erik Karlstrand
  • 1,479
  • 9
  • 22
0

The Spring DSL example from the mentioned question is this one:

<camel:route>
    <camel:from uri="direct:start" />
    <camel:split streaming="true">
        <camel:jsonpath>$</camel:jsonpath>
        <camel:aggregate completionSize="5"
            completionTimeout="1000" groupExchanges="true">
            <camel:correlationExpression>
                <camel:constant>true</camel:constant>
            </camel:correlationExpression>
            <camel:log message="${body}"></camel:log>
            <camel:to uri="mock:result"></camel:to>
        </camel:aggregate>
    </camel:split>
</camel:route>

There's a full implementation example here.

The groupExchange property just return a default aggregation strategy: GroupedExchangeAggregationStrategy.

You could implement your own and pass it as a bean parameter to your DSL like this:

<camel:route>
    <camel:from uri="direct:start" />
    <camel:split streaming="true">
        <camel:jsonpath>$</camel:jsonpath>
        <camel:aggregate strategyRef="stringConcatStrategy" completionSize="5"
            completionTimeout="1000" >
            <camel:correlationExpression>
                <camel:constant>true</camel:constant>
            </camel:correlationExpression>
            <camel:log message="${body}"></camel:log>
            <camel:to uri="mock:result"></camel:to>
        </camel:aggregate>
    </camel:split>
</camel:route>

Cheers!

Ricardo Zanini
  • 1,041
  • 7
  • 12