Java主要方法应该用于独立应用程序(对于Spring JMS)?

时间:2010-03-23 04:43:15

标签: java spring jms

我感兴趣的是创建一个Spring独立应用程序,它将运行并等待使用Spring JMS从ActiveMQ队列接收消息。我搜索过很多地方,但找不到一种实现这种独立应用程序主方法的一致方法。 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 个答案:

答案 0 :(得分:24)

使用Spring JMS时,您已经在配置中使用了自动启动的组件/ bean,并且在您停止应用程序之前保持活动状态(从队列/主题中订阅和读取)。

要启动并保持应用程序运行,因此加载applicationcontext应该足够了。 好的做法是调用registerShutdownHook,因此在应用程序暂停时(即通过控制台中的ctrl + c),你的bean正常关闭并处理掉:)

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

答案 1 :(得分:3)

这就是我们所拥有的,在app-context.xml中我们使用spring(例如, 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);
    }

}

答案 2 :(得分:1)

主要思想是让主线程等到app完成。 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();
}

答案 3 :(得分:-2)

在你的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()

您可以使用Spring's JMS template注入您的Utiltity bean来为您的用例执行gruntwork。

答案 4 :(得分:-4)

尝试循环读取。如果找到消息,则处理它,然后再次睡眠和迭代。还要在其中放置某种终结器逻辑(中断线程)。您可以在X次尝试后终止,从文件中读取,终止JVM,从队列中读取终结符msg等等。

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;
        }
    }
}