Quantcast

Callback after startup from org.apache.camel.main.Main afterStart()

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Callback after startup from org.apache.camel.main.Main afterStart()

Andrew Bailey
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
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Callback after startup from org.apache.camel.main.Main afterStart()

Claus Ibsen-2
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 <[hidden email]> 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: [hidden email]
Web: http://fusesource.com
Twitter: davsclaus
Blog: http://davsclaus.com
Author of Camel in Action: http://www.manning.com/ibsen
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Callback after startup from org.apache.camel.main.Main afterStart()

Andrew Bailey
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 <[hidden email]> 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 <[hidden email]>
> 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: [hidden email]
> 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
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Callback after startup from org.apache.camel.main.Main afterStart()

Claus Ibsen-2
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 <[hidden email]> 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 <[hidden email]> 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 <[hidden email]>
>> 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: [hidden email]
>> 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: [hidden email]
Web: http://fusesource.com
Twitter: davsclaus
Blog: http://davsclaus.com
Author of Camel in Action: http://www.manning.com/ibsen
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Callback after startup from org.apache.camel.main.Main afterStart()

Chris Wolf
What I did was extend Main, overriding:
protected AbstractApplicationContext createDefaultApplicationContext();

The overridden method looks like:

@Override
public AbstractApplicationContext createDefaultApplicationContext() {
    AbstractApplicationContext appctx =
super.createDefaultApplicationContext();
    appctx.addApplicationListener(new
ApplicationListener<ContextStartedEvent>() {
            @Override
            public void onApplicationEvent(ContextStartedEvent event) {
                LOG.info("********** CONTEXT STARTED...");
     }});

    return appctx;
}

Works for me...

   -Chris



On Tue, Apr 9, 2013 at 9:49 AM, Claus Ibsen <[hidden email]> wrote:

> 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 <[hidden email]>
> 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 <[hidden email]>
> 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 <[hidden email]>
> >> 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: [hidden email]
> >> 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: [hidden email]
> Web: http://fusesource.com
> Twitter: davsclaus
> Blog: http://davsclaus.com
> Author of Camel in Action: http://www.manning.com/ibsen
>
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Callback after startup from org.apache.camel.main.Main afterStart()

Claus Ibsen-2
Chris,

Yeah this would work. But only when you use Spring.

We should have a common and easier solution for the MainSupport in camel-core.
I have logged a ticket
https://issues.apache.org/jira/browse/CAMEL-6269

On Wed, Apr 10, 2013 at 4:24 PM, Chris Wolf <[hidden email]> wrote:

> What I did was extend Main, overriding:
> protected AbstractApplicationContext createDefaultApplicationContext();
>
> The overridden method looks like:
>
> @Override
> public AbstractApplicationContext createDefaultApplicationContext() {
>     AbstractApplicationContext appctx =
> super.createDefaultApplicationContext();
>     appctx.addApplicationListener(new
> ApplicationListener<ContextStartedEvent>() {
>             @Override
>             public void onApplicationEvent(ContextStartedEvent event) {
>                 LOG.info("********** CONTEXT STARTED...");
>      }});
>
>     return appctx;
> }
>
> Works for me...
>
>    -Chris
>
>
>
> On Tue, Apr 9, 2013 at 9:49 AM, Claus Ibsen <[hidden email]> wrote:
>
>> 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 <[hidden email]>
>> 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 <[hidden email]>
>> 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 <[hidden email]>
>> >> 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: [hidden email]
>> >> 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: [hidden email]
>> Web: http://fusesource.com
>> Twitter: davsclaus
>> Blog: http://davsclaus.com
>> Author of Camel in Action: http://www.manning.com/ibsen
>>



--
Claus Ibsen
-----------------
Red Hat, Inc.
FuseSource is now part of Red Hat
Email: [hidden email]
Web: http://fusesource.com
Twitter: davsclaus
Blog: http://davsclaus.com
Author of Camel in Action: http://www.manning.com/ibsen
Loading...