Каким должен быть основной метод Java для автономного приложения (для Spring JMS)? - PullRequest
23 голосов
/ 23 марта 2010

Я заинтересован в создании отдельного приложения Spring, которое будет запускаться и ждать получения сообщений из очереди ActiveMQ с использованием Spring JMS.Я искал много мест и не могу найти последовательный способ реализации основного метода для такого автономного приложения.Кажется, есть несколько примеров автономных приложений Spring.Я посмотрел Tomcat, JBoss, ActiveMQ и другие примеры со всего Интернета, но я не пришел к выводу, так что ...

Каков наилучший способ реализации основного метода для приложения Java (в частности Spring with 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();
        }
}

Ответы [ 5 ]

24 голосов
/ 04 апреля 2010

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

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

public static void main(String args[]) {
    AbstractApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
    context.registerShutdownHook();
}
3 голосов
/ 24 марта 2010

Это то, что у нас есть, внутри app-context.xml мы используем весенние 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);
    }

}
1 голос
/ 01 апреля 2010

Основная идея состоит в том, чтобы заставить основной поток ждать, пока приложение не будет завершено. в то время как (! закончено) является правильным способом ожидания, пока основной поток не проснется.

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();
}
0 голосов
/ 23 марта 2010

В вашем 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 , чтобы выполнить хрюканье для вашего сценария использования.

0 голосов
/ 23 марта 2010

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