Hi,

Camel provides lots of build blocks for testing, if you interest it here is the link[1].

[1]http://camel.apache.org/testing.html

Willem

Ricardo Melo wrote:
ste,

Thank you very much for the support. I'll try that solution. It's very
interesting, I have never used Mock endepoints.

In the meantime, I've tested a simple solution that worked: remove the
route, modify and add it again. :) For my needs, it worked well.

Thanks!
Ricardo



On Fri, Jan 29, 2010 at 5:05 PM, Stephen Gargan <[email protected]>wrote:

Ricardo,

What you're doing is very possible but you'll need to modify how you
are doing it. Routes are not really meant to be modified and restarted
like that, the setters are mostly for camel to initialize them in the
first place. Typically you use RouteBuilders to create and initialize
new Routes. Using the old RouteDefinition in a RouteBuilder to create
a new Route should give you what you need.

You are supplying each Route with is own id so, as Claus suggests, you
can use the methods on the CamelContext to stop the existing route.
Then use a RouteBuilder to create the new Route and add this back to
the context. The following test illustrates a basic solution.
Depending on how complex your route is, you'll need to do more work
when you create the new route from the old one. I suggest that you try
and keep this as simple as possible.

Give this a try and see how it works for you

rgds,

ste

public class DynamicRoutesTest extends CamelTestSupport {

   @Test
   public void routesCanBeCreatedDynamically() throws Exception {
       MockEndpoint mock = setExpectedMessagesToMock("mock:out-endpoint",
1);

       context.addRoutes(createDynamicRoute("dynamicRouteId",
"direct:in", "mock:out-endpoint"));

       sendBody("direct:in", "payload to dynamic endpoint");

       assertSatisfied(mock);
   }

   @Test
   public void routesCanBeUpdatedDynamicallyToo() throws Exception {
       // we're going to change the destination endpoint so the old
one should receive no exchanges and the new on one.
       MockEndpoint oldDestination =
setExpectedMessagesToMock("mock:out-endpoint", 0);
       MockEndpoint newDestination =
setExpectedMessagesToMock("mock:new-out-endpoint", 1);

       context.addRoutes(createDynamicRoute("dynamicRouteId",
"direct:in", "mock:out-endpoint"));

       //stop the route by its id
       context.stopRoute("dynamicRouteId");


 context.addRoutes(redirectTrafficToDifferentEndpoint("dynamicRouteId",
"mock:new-out-endpoint"));

       sendBody("direct:in", "payload to dynamic endpoint");

       assertSatisfied(oldDestination, newDestination);

   }

   public RouteBuilder createDynamicRoute(final String id, final
String uri, final String touri) {
       return new RouteBuilder() {
           public void configure() throws Exception {
               from(uri).id(id).to(touri);
           }
       };
   }

   public RouteBuilder redirectTrafficToDifferentEndpoint(final
String id, final String newDestination) {
       return new RouteBuilder() {
           public void configure() throws Exception {
               RouteDefinition old = getContext().getRouteDefinition(id);

               for (FromDefinition from : old.getInputs()) {
                   from(from.getUri()).id(old.getId()).to(newDestination);
               }
           }
       };
   }

   private MockEndpoint setExpectedMessagesToMock(String mockUri, int
expectedMessages) {
       MockEndpoint mock = getMockEndpoint(mockUri);
       mock.expectedMessageCount(expectedMessages);
       return mock;
   }

   private void assertSatisfied(MockEndpoint... mocks) throws
InterruptedException {
       for (MockEndpoint mock : mocks) {
           mock.await(1, TimeUnit.SECONDS);
           mock.assertIsSatisfied();
        }
   }
}

On Fri, Jan 29, 2010 at 3:52 AM, Ricardo Melo <[email protected]>
wrote:
Hi ste,

Thank you for the response.

I'm developing a system where routes destination endpoint can be
added/updated/removed dynamically. A received XML message specifies the
operation, a route identifier name and the route destination endpoint
address. After this, the camel route from the camel context is
updated/removed. The routes are also present in a database, which have
its
routes added/updated/removed from.

That's why I need to remove or update the route. Adding is pretty easy,
but
for updating/removing I need to first find the route using the previously
specified address.

I've tried something like the code below, which is not working (the route
is
not being updated for some reason. I'm using the setURI() method):

[CODE]

List<RouteDefinition> routes = camelContext.getRouteDefinitions();

// Searches for the route to be updated
for( int i = 0 ; i < routes.size() ; i++ ) {

RouteDefinition routeToUpdate = routes.get(i);

/*
* Look for the correct route to update.
* The route to be updated is
* [FROM=activemq:queue:out_<routeId>] -> [TO:<newRouteDestination>]
*/

// Look for the route that starts with :
[FROM=activemq:queue:out_<routeId>]
if ( SearchUtil.find(
((FromDefinition) routeToUpdate.getInputs().get(0)).getLabel() ,
"out_" + newCommunicationRoute.getId() ) == true ) {

// Found! Update the destination. First stops the route, update it, then
restarts it
camelContext.stopRoute( routeToUpdate );

// Update destination [TO:<newRouteDestination>]
((SendDefinition<ProcessorDefinition>)
routeToUpdate.getOutputs().get(0)).setUri(
newConfiguration.getTransp() + newConfiguration.getParam());

// restart it
camelContext.startRoute( routeToUpdate );

[/CODE]

Strangely, the printed result of

(SendDefinition<ProcessorDefinition>) routeToUpdate.getOutputs().get(0)

is differente from

((SendDefinition<ProcessorDefinition>) routeToUpdate.getOutputs().get(0))
                       .getUri()
.

The getUri() returns something that seems not to be used, and the route
is
not updated.

About the route removal, I didn't tried yet.

Thank you,
Ricardo






On Thu, Jan 28, 2010 at 6:32 PM, Stephen Gargan <[email protected]
wrote:

Ricardo,

What are you trying to do? Are you trying to programmatically stop a
route from processing by removing it? If so try specifying a
RoutePolicy instead. If you can explain your intention a little more
we can definitely suggest options.

rgds,

ste

On Thu, Jan 28, 2010 at 10:37 AM, Ricardo Melo <[email protected]>
wrote:
Hi,

I'm new to camel API and I need to update or remove camel routes that
have
been created.

I've found in an example that to find current routes, I need to use
the
code:
List<RouteDefinition> routes = camelContext.getRouteDefinitions();

I can iterate through the routes definition, however how can I see the
"to"
(destination) endpoint of a route definition, to update or remove the
route
I'm looking for? Where is it?

Thanks in advance!
--
Ricardo Britto Melo

CFlex - Empower your Decisions
Tel: (+55 19) 3251-5211
Rua Barão de Paranapanema, 401A
Campinas - SP
www.cflex.com.br



--
Ricardo Britto Melo

CFlex - Empower your Decisions
Tel: (+55 19) 3251-5211
Rua Barão de Paranapanema, 401A
Campinas - SP
www.cflex.com.br





Reply via email to