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

2013-04-13 Thread Claus Ibsen
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 cwolf.a...@gmail.com 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
 ApplicationListenerContextStartedEvent() {
 @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 claus.ib...@gmail.com 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 andrew.bai...@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
 
   ListCamelContext 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.ib...@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.bai...@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 CallableVoid(){
   public Void call() throws Exception
   {
   ProducerTemplate template =
 getCamelTemplate();
  
   fileMonitor.setProducer(template);
  
  /*
  ListCamelContext 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 CallableVoid afterStartCallback;
  
   @Override
   protected void afterStart() throws Exception {
  
   if 

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

2013-04-10 Thread 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
ApplicationListenerContextStartedEvent() {
@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 claus.ib...@gmail.com 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 andrew.bai...@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
 
   ListCamelContext 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.ib...@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.bai...@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 CallableVoid(){
   public Void call() throws Exception
   {
   ProducerTemplate template =
 getCamelTemplate();
  
   fileMonitor.setProducer(template);
  
  /*
  ListCamelContext 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 CallableVoid afterStartCallback;
  
   @Override
   protected void afterStart() throws Exception {
  
   if (afterStartCallback!=null) afterStartCallback.call();
   }
  
   public CallableVoid getAfterStartCallback() {
   return afterStartCallback;
   }
  
   public void setAfterStartCallback(CallableVoid
   afterStartCallback) {
   this.afterStartCallback 

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

2013-04-09 Thread Claus Ibsen
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.bai...@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

  ListCamelContext 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.ib...@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.bai...@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 CallableVoid(){
  public Void call() throws Exception
  {
  ProducerTemplate template = getCamelTemplate();
 
  fileMonitor.setProducer(template);
 
 /*
 ListCamelContext 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 CallableVoid afterStartCallback;
 
  @Override
  protected void afterStart() throws Exception {
 
  if (afterStartCallback!=null) afterStartCallback.call();
  }
 
  public CallableVoid getAfterStartCallback() {
  return afterStartCallback;
  }
 
  public void setAfterStartCallback(CallableVoid
  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: cib...@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: cib...@redhat.com
Web: http://fusesource.com
Twitter: davsclaus
Blog: http://davsclaus.com
Author of Camel in Action: http://www.manning.com/ibsen


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

2013-04-08 Thread 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

 ListCamelContext 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.ib...@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.bai...@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 CallableVoid(){
  public Void call() throws Exception
  {
  ProducerTemplate template = getCamelTemplate();
 
  fileMonitor.setProducer(template);
 
 /*
 ListCamelContext 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 CallableVoid afterStartCallback;
 
  @Override
  protected void afterStart() throws Exception {
 
  if (afterStartCallback!=null) afterStartCallback.call();
  }
 
  public CallableVoid getAfterStartCallback() {
  return afterStartCallback;
  }
 
  public void setAfterStartCallback(CallableVoid
  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: cib...@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


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

2013-04-05 Thread Claus Ibsen
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.bai...@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 CallableVoid(){
 public Void call() throws Exception
 {
 ProducerTemplate template = getCamelTemplate();

 fileMonitor.setProducer(template);

/*
ListCamelContext 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 CallableVoid afterStartCallback;

 @Override
 protected void afterStart() throws Exception {

 if (afterStartCallback!=null) afterStartCallback.call();
 }

 public CallableVoid getAfterStartCallback() {
 return afterStartCallback;
 }

 public void setAfterStartCallback(CallableVoid
 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: cib...@redhat.com
Web: http://fusesource.com
Twitter: davsclaus
Blog: http://davsclaus.com
Author of Camel in Action: http://www.manning.com/ibsen


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

2013-04-03 Thread 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 CallableVoid(){
public Void call() throws Exception
{
ProducerTemplate template = getCamelTemplate();

fileMonitor.setProducer(template);

   /*
   ListCamelContext 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 CallableVoid afterStartCallback;

@Override
protected void afterStart() throws Exception {

if (afterStartCallback!=null) afterStartCallback.call();
}

public CallableVoid getAfterStartCallback() {
return afterStartCallback;
}

public void setAfterStartCallback(CallableVoid
afterStartCallback) {
this.afterStartCallback = afterStartCallback;
}
}

-- 



Andrew Bailey
Cel - 312 866 95 56

http://www.apps4u.co
Chat Skype: apps4u
Twitter @apps4uco