2010-03-23 11 views
23

Estoy interesado en crear una aplicación independiente de Spring que se ejecutará y esperará a recibir mensajes de una cola de ActiveMQ con Spring JMS. He buscado en muchos lugares y no encuentro una manera consistente de implementar el método principal para una aplicación independiente. Parece que hay pocos ejemplos de aplicaciones independientes de Spring. He consultado Tomcat, JBoss, ActiveMQ y otros ejemplos de Internet, pero no he llegado a una conclusión así que ...¿Cuál debería ser el método principal de Java para una aplicación independiente (para Spring JMS)?

¿Cuál es la mejor práctica para implementar un método principal para una aplicación Java (específicamente Spring? con JMS)?

actualización: He aquí un ejemplo de: http://forum.springsource.org/showthread.php?t=48197 ¿Es ésta la mejor manera de hacer esto?

public static void main(String args[]) { 
     try { 
      ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); 
      . . . . . 
      Object lock = new Object(); 
      synchronized (lock) { 
       lock.wait(); 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
} 

Respuesta

-4

Intente leer en un bucle. Si se encuentra un mensaje, trátelo, luego duerma e itere nuevamente. También ponga algún tipo de lógica de terminación allí (interrumpa el hilo). Usted podría terminar después de varios intentos X, leídos desde un archivo, matar a la JVM, leer un msg terminador de la cola, etc., etc.

public static void main(String[] args) { 
    while(true) { 
     // look for some terminator 
     // attempt to read off queue 
     // process message 
     try { 
      TimeUnit.SECONDS.sleep(5); 
     } catch (Exception e) { 
      break; 
     } 
    } 
} 
+0

puedo estar equivocado, pero creo que esto causa problemas de rendimiento en dos puntos: 1. La constante procesamiento de bucle while consumiría procesador. 2. La suspensión provocaría un retraso en el procesamiento de los mensajes (no es una gran preocupación porque el marco maneja esto). Creo que la respuesta implicará el bloqueo del método principal, pero no estoy seguro. – Brandon

+0

estaba pidiendo una solución basada en la primavera ... –

+0

No sabía '¿Cuál es la mejor práctica para implementar un método principal para una aplicación Java? Tenía algo que ver con Spring. Si su pregunta era '¿Cómo obtengo un bean de una configuración Spring? Entonces tu respuesta sería espléndida. – Droo

-2

En el main() hacer algo como esto:

// gather config files 
String[] configs = { "classpath:applicationContext-myutil.xml" }; 

// create the app context 
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(configs); 

// obtain reference to your utility bean 
MyUtilityBean utility = (MyUtilityBean) ctx.getBean("utility"); 

// invoke methods on your utility bean 
utility.doSomething() 

Inyectará su bean de Utilidad con Spring's JMS template para hacer el trabajo de relleno para su uso.

+1

Creo que se me ocurre algo así: http://forum.springsource.org/showthread.php?t=48197 porque el método del bean es la nota que ejecuta cualquier cosa, solo está esperando recibir mensajes. – Brandon

+0

¿Qué tiene esto que ver con los métodos principales en aplicaciones Java? – Droo

+0

He proporcionado una actualización. Creo que la pregunta fue implícita. – Brandon

3

Esto es lo que tenemos en app-context.xml utilizamos primavera clases JMS como (org.springframework.jms.listener.DefaultMessageListenerContainer para gestionar número de consumidores y proporcionar escucha personalizado utilizando org.springframework.jms .listener.adapter.MessageListenerAdapter)

app-context.xml contiene todos los oyentes de beans de primavera y otras cosas, el siguiente código es bootstrapping Los oyentes proporcionados por Spring en las colas. Entonces la idea es usar clases de Spring para administrar múltiples consumidores. Avíseme si esto es lo que necesita y necesita más información sobre cómo configurar MessageListenerAdapter.

public static void main(String[] args) 
{ 

    try 
    { 
     new ClassPathXmlApplicationContext("app-context.xml"); 

    } 
    catch (Throwable e) 
    { 
     e.printStackTrace(); 
     System.exit(-1); 
    } 

} 
+0

Esto es lo que uso también ... – arrehman

1

La idea principal es hacer que esperar hasta el hilo principal estará terminado aplicación. while (! Finished) es la forma correcta de esperar hasta que se active el subproceso principal.

finishEventHandler - es un método que maneja el evento finish/quit.

Considero que la inicialización de JMS se realiza en Spring conf. y en ". . . . ." sección.

public static void main(String args[]) { 

try { 
     ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); 
     lock = new Object(); 

     while(!finished) { 
      synchronized (lock) { 
       lock.wait(); 
      } 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

}

public void finishEventHandler() { 
    finished = true; 
    lock.notify(); 
} 
24

Al utilizar primavera JMS ya utiliza componentes/frijoles en la configuración que se interponen auto-iniciado y se quedarán con vida (suscribirse y leer de cola/tema) hasta que detenga el solicitud.

Para iniciar y mantener la aplicación en ejecución, cargar el contexto de la aplicación debería ser suficiente. Sin embargo, una buena práctica es llamar al registerShutdownHook, por lo tanto, al detener una aplicación (i.E a través de Ctrl + C en la consola), sus granos son al apagado de precaución y dispuesto :)

public static void main(String args[]) { 
    AbstractApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); 
    context.registerShutdownHook(); 
} 
+3

Para las personas que están buscando el método de configuración de clases (vs XML), puedes usar [AnnotationConfigApplicationContext] (http: // static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/context/annotation/AnnotationConfigApplicationContext.html). Tengo un ejemplo aquí http://stackoverflow.com/a/15914136/311525. – Scott

Cuestiones relacionadas