camel-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Claus Ibsen <claus.ib...@gmail.com>
Subject Re: Callback after startup from org.apache.camel.main.Main afterStart()
Date Tue, 09 Apr 2013 13:49:04 GMT
Hi

Yeah we probably need some API on MainSupport so you can add a custom
EventNotifier, which we then add to the CamelContext before its
started.

Though another option that may be easier is just to have a beforeStart
| beforeStop method which you can implement and do your custom code
there. A bit like what you did, but IMHO should have simpler api's
than a Callable et all.

On Mon, Apr 8, 2013 at 6:34 PM, Andrew Bailey <andrew.bailey@apps4u.co> wrote:
> Claus, thanks for the reply.
>
> Ok I tried that, however, if in the bootstrap code in main just before
> calling run() I place
>
>  List<CamelContext> contexts=getCamelContexts();
>                 System.out.println(contexts); // []
>                 CamelContext context=contexts.get(0);
> //IndexOutOfBoundsException: Index: 0, Size: 0
>             context.getManagementStrategy().addEventNotifier(new
> MyLoggingSentEventNotifer()); //as in
> http://camel.apache.org/eventnotifier-to-log-details-about-all-sent-exchanges.html
> run();
>
> It produces
> []
> Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0,
> Size: 0
>
> Is this a bug or am I doing something wrong?
>
>
>
> On Fri, Apr 5, 2013 at 9:24 AM, Claus Ibsen <claus.ibsen@gmail.com> wrote:
>
>> Hi
>>
>> Yeah we could add some methods to the Main class you can override to
>> have callbacks after start | before stop etc.
>> But you can also just use the event notifier api in Camel for that.
>>
>>
>>
>> On Wed, Apr 3, 2013 at 4:17 PM, Andrew Bailey <andrew.bailey@apps4u.co>
>> wrote:
>> > I have a use case, where I require a fast startup time for camel and wish
>> > to avoid classpath scanning.
>> > I use the Main class however it appears that its not possible to obtain a
>> > ProducerTemplate template = getCamelTemplate();
>> > before calling the run method. (it produces an ArrayOutOfBounds
>> exception -
>> > I could file a bug for that if you like)
>> >
>> > What I did was to extend Main (see code fragment below) and add a
>> callback
>> > called from the afterStart() method, so that user code can access the
>> > context, and TypeConverterRegistry (as before that it is not
>> initialized).
>> >
>> > Is there a better way to do it?
>> >
>> > If not and the developers think its a good idea, I would like to
>> contribute
>> > the code for a future release.
>> >
>> >
>> > Thanks
>> >
>> > Andy
>> >
>> >
>> > import org.apache.camel.main.Main;
>> >
>> > public class ServiceManager extends Main {
>> >
>> >
>> >         public static void main(String[] args) throws Exception {
>> >             ServiceManager example = new ServiceManager();
>> >             example.boot();
>> >         }
>> >
>> >         public void boot() throws Exception {
>> > //cut
>> >
>> >          setAfterStartCallback(new Callable<Void>(){
>> >                 public Void call() throws Exception
>> >                 {
>> >                         ProducerTemplate template = getCamelTemplate();
>> >
>> >                         fileMonitor.setProducer(template);
>> >
>> >                        /*
>> >                        List<CamelContext> contexts=getCamelContexts();
>> >                        System.out.println(contexts);
>> >                        CamelContext context=contexts.get(0);
>> >                        TypeConverterRegistry converterRegistry =
>> > context.getTypeConverterRegistry();
>> >                        TypeConverter converter =
>> > converterRegistry.lookup(String[].class, String.class);
>> >                        System.out.println("Converter "+converter);
>> >
>> >                        TypeConverter converter2 =
>> > converterRegistry.lookup(List.class, String.class);
>> >                        System.out.println("Converter "+converter2);
>> >
>> >                        */
>> >                        return null;
>> >                 }
>> >             });
>> > //code cut
>> >      System.out.println("Starting Camel. Use ctrl + c to terminate the
>> > JVM.\n");
>> >             run();
>> >         }
>> >
>> >         private Callable<Void> afterStartCallback;
>> >
>> >         @Override
>> >         protected void afterStart() throws Exception {
>> >
>> >             if (afterStartCallback!=null) afterStartCallback.call();
>> >         }
>> >
>> >         public Callable<Void> getAfterStartCallback() {
>> >             return afterStartCallback;
>> >         }
>> >
>> >         public void setAfterStartCallback(Callable<Void>
>> > afterStartCallback) {
>> >             this.afterStartCallback = afterStartCallback;
>> >         }
>> > }
>> >
>> > --
>> >
>> >
>> >
>> > Andrew Bailey
>> > Cel - 312 866 95 56
>> >
>> > http://www.apps4u.co
>> > Chat Skype: apps4u
>> > Twitter @apps4uco
>>
>>
>>
>> --
>> Claus Ibsen
>> -----------------
>> Red Hat, Inc.
>> FuseSource is now part of Red Hat
>> Email: cibsen@redhat.com
>> Web: http://fusesource.com
>> Twitter: davsclaus
>> Blog: http://davsclaus.com
>> Author of Camel in Action: http://www.manning.com/ibsen
>>
>
>
>
> --
>
>
>
> Andrew Bailey
> Cel - 312 866 95 56
>
> http://www.apps4u.co
> Chat Skype: apps4u
> Twitter @apps4uco



-- 
Claus Ibsen
-----------------
Red Hat, Inc.
FuseSource is now part of Red Hat
Email: cibsen@redhat.com
Web: http://fusesource.com
Twitter: davsclaus
Blog: http://davsclaus.com
Author of Camel in Action: http://www.manning.com/ibsen

Mime
View raw message