我感兴趣的是创建一个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();
}
}
答案 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;
}
}
}