Подтвердить что ты не робот

Каким должен быть основной метод 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();
        }
}
4b9b3361

Ответ 1

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

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

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

Ответ 2

Это то, что у нас есть, внутри app-context.xml мы используем классы spring JMS, такие как (org.springframework.jms.listener.DefaultMessageListenerContainer, чтобы управлять количеством потребителей и предоставлять пользовательский прослушиватель, используя org.springframework.jms.listener.adapter.MessageListenerAdapter)

app-context.xml содержит все spring beans прослушиватели и другие материалы, приведенный ниже код является загрузочной загрузкой spring, предоставляемой слушателям в очередях. Поэтому идея состоит в том, чтобы использовать классы spring для управления несколькими потребителями. Дайте мне знать, если это то, что вам нужно, и вам нужна дополнительная информация о настройке MessageListenerAdapter.

public static void main(String[] args)
{

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

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

}

Ответ 3

Основная идея - сделать основной поток до тех пор, пока приложение не будет завершено. 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();
}

Ответ 4

В вашем основном() сделайте что-то вроде этого:

// 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()

Вы бы ввели свою Utilityity bean с помощью Spring шаблона JMS, чтобы выполнить gruntwork для вашей usecase.

Ответ 5

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