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 <steve.gar...@gmail.com>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 <rica...@cflex.com.br>
> 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 <steve.gar...@gmail.com
> >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 <rica...@cflex.com.br>
> >> 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
> >
>



-- 
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