Чем основной метод Java должен быть для автономного приложения (для Spring JMS)?

Я интересуюсь созданием автономного приложения 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();
        }
}

23
задан ThinkingStiff 10 March 2013 в 01:51
поделиться

5 ответов

В вашей 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, чтобы сделать грубую работу для вашего случая.

-2
ответ дан 29 November 2019 в 02:54
поделиться

Попытка чтения в цикле. Если сообщение найдено, обработайте его, затем спите и повторите попытку. Также поместите туда какую-то логику терминатора (прервите поток).Вы можете завершить работу после 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;
        }
    }
}
-4
ответ дан 29 November 2019 в 02:54
поделиться

Это то, что у нас есть, внутри 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);
    }

}
3
ответ дан 29 November 2019 в 02:54
поделиться

Основная идея состоит в том, чтобы заставить основной поток ждать, пока приложение не будет завершено. 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();
}
1
ответ дан 29 November 2019 в 02:54
поделиться

При использовании Spring JMS вы уже используете в своей конфигурации компоненты / бины, которые запускаются автоматически и остаются активными (подписка и чтение из очереди / темы) до тех пор, пока вы не остановите приложение.

Для запуска и продолжения работы приложения должно быть достаточно загрузки контекста приложения. Хорошая практика - также вызвать registerShutdownHook, чтобы при остановке приложения (например, с помощью ctrl + c в консоли), все ваши bean-компоненты корректно завершаются и удаляются :)

public static void main(String args[]) {
    AbstractApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
    context.registerShutdownHook();
}
24
ответ дан 29 November 2019 в 02:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: