Hi,

I' m confronted to the following "dilemma". The architecture of a product
that I currently design uses Apache Camel 2.0 and Spring DSL. I have decided
to use Spring DSL because I would benefit of the fact that routing can be
modified in the XML file. Nevertheless, I' m confronted to the following
issue who could be solved in different ways.

This is why I ask point of view of Camel designer to have your advices !

The routing calls different services to parse/validate/transform and save
content of messages. These services have been designed as interface and
classes implementing the interface. Spring is used to publish the services
top of OSGI server (Apache Karaf). Here is the description of the routing :

        <camel:route>
            <!-- Create request message -->
            <camel:from ref="directRequestMessageEndpoint" /> // direct
endpoint

            <!-- Split the collection of messages -->
            <camel:split>
                <camel:ognl>request.body</camel:ognl>

                <!-- (1) Call the service to create the request message
object based on the content received -->
                <camel:bean ref="serviceHelper"
method="createRequestMessage"/> // Receive as input parameter : Map<String,
Object> and return a RequestMessage object

                <!-- (2) Validate the business message -->
                <camel:bean ref="serviceHelper"
method="validateRequestMessage"/> // Receive as input parameter :
RequestMessage and return a ValidationResultHolder containing List of
Errors/ boolean isValid

                <camel:choice>
                    <camel:when>
                        <camel:ognl>request.isValid = true</camel:ognl>

                        <!-- (3) Save business message --> // Receive as
input parameter : RequestMessage and does not return anything ??????
                        <camel:bean ref="serviceHelper"
method="saveRequestMessage"/>
                        <camel:to ref="queueRequestMessageEndpoint" />
                    </camel:when>
                    <camel:when>
                        <camel:ognl>request.isValid = false</camel:ognl>
                        <!-- (4) Error reported -->
                        <camel:bean ref="serviceHelper"
method="saveErrors"/>
                        <camel:to ref="queueReportingEndpoint" />

                    </camel:when>
                </camel:choice>
            </camel:split>
        </camel:route>

ISSUE : After calling the bean process : (2) Validate the business message,
my RequestMessage is lost and replaced by a ValidationResultHolder
containing information about List of Errors, boolean isValid BUT the
requestMessage object is required in the process (3) Save business message

Scenario possible to solve the issue :

1) Encapsulate RequestMessage class in the ValidationResultHolder class and
use the ValidationResultHolder class as input parameter for (3) save
business message process. Is it a good idea to copy objects between classes
2) Add property in the RequestMessage class to extract from
ValidationResultHolder class : List of Errors/ boolean isValid(). Is the
purpose of a java bean model class to expose result from a validation
service ?
3) Merge service 1), 2) 3) into one. Granularity/flexility of Camel is lost
4) Use Java DSL instead of Spring DSL. Routing is hardcoded

Question : Is a session context available to keep my requestMessage object
during the validation process ?

Regards,

Charles Moulliard
Senior Enterprise Architect
Apache Camel Committer

*****************************
blog : http://cmoulliard.blogspot.com

Reply via email to