Я интересуюсь созданием автономного приложения Spring, которое будет работать и ожидать для получения сообщений из очереди ActiveMQ, использующей Spring JMS. Я искал много мест и не могу найти последовательный способ реализовать основной метод для такого автономного приложения. Кажется, существует немного примеров автономных приложений Spring. Я посмотрел на Tomcat, JBoss, ActiveMQ и другие примеры от вокруг сети, но я не пришел к выводу так...
Какова лучшая практика для реализации основного метода для JAVA-приложения (конкретно Spring с JMS)?
Обновление: вот пример от: http://forum.springsource.org/showthread.php?t=48197 - это лучший способ сделать это?
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();
}
}
В вашей main() сделайте что-то вроде этого:
// 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()
Вы должны внедрить ваш боб Utiltity с шаблоном JMS от Spring, чтобы сделать грубую работу для вашего случая.
Попытка чтения в цикле. Если сообщение найдено, обработайте его, затем спите и повторите попытку. Также поместите туда какую-то логику терминатора (прервите поток).Вы можете завершить работу после X попыток, прочитать из файла, убить JVM, прочитать сообщение о терминаторе из очереди и т. Д. И т. Д.
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;
}
}
}
Это то, что у нас есть, внутри app-context.xml мы используем классы Spring JMS, такие как ( org.springframework.jms.listener.DefaultMessageListenerContainer , для управления количеством потребителей и предоставления настраиваемого прослушивателя с использованием org.springframework.jms.listener.adapter.MessageListenerAdapter )
app-context.xml содержит все прослушиватели bean-компонентов Spring и другие вещи, приведенный ниже код загружает прослушиватели, предоставленные Spring, в очереди. Итак, идея состоит в том, чтобы использовать классы Spring для управления несколькими потребителями. Сообщите мне, если это то, что вам нужно, и вам нужна дополнительная информация о настройке MessageListenerAdapter.
public static void main(String[] args)
{
try
{
new ClassPathXmlApplicationContext("app-context.xml");
}
catch (Throwable e)
{
e.printStackTrace();
System.exit(-1);
}
}
Основная идея состоит в том, чтобы заставить основной поток ждать, пока приложение не будет завершено. while (! Finished) - правильный способ дождаться, пока основной поток нить проснется.
finishEventHandler - метод, обрабатывающий событие завершения / выхода.
Я считаю, что инициализация JMS выполняется в Spring conf. И в ". . . . ." раздел.
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();
}
При использовании Spring JMS вы уже используете в своей конфигурации компоненты / бины, которые запускаются автоматически и остаются активными (подписка и чтение из очереди / темы) до тех пор, пока вы не остановите приложение.
Для запуска и продолжения работы приложения должно быть достаточно загрузки контекста приложения. Хорошая практика - также вызвать registerShutdownHook, чтобы при остановке приложения (например, с помощью ctrl + c в консоли), все ваши bean-компоненты корректно завершаются и удаляются :)
public static void main(String args[]) {
AbstractApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
context.registerShutdownHook();
}