我有一个 Spring JMS 应用程序。事实上没有用户界面。只是 Spring 配置(JMS 侦听器),Spring 配置由 web.xml 加载。所以当我在服务器中部署时,监听器开始工作。
但我不想要 Web 部件,因为没有 UI,它只是一个监听队列并进行处理的项目。所以我认为它应该是 JAR 并且它应该独立运行(或者当我在服务器中部署时)如何创建这样的项目/ JAR 在服务器中部署时它会自动开始运行。我不想每次更新 JAR 时都运行一个主类。
我之前使用过一个可执行的 jar 来启动一个 JMS 队列。您只需要确保您可以访问 Spring 和 JMS 的所有 jar 依赖项,这很多。这可以通过将类路径设置为指向依赖 jar 或创建一个 Uberjar 并将所有依赖 jar 打包到可执行 jar 中来完成。
这是一个示例类,当您将其设置为 jar 清单中的主类时,它将从 Jar 启动ActiveMQ 。将使用进程的进程 ID 创建一个jms.pid 。您必须在ConfigurableApplicationContext中为 JMS 设置 Spring 上下文的路径。
public class Server {
public static void main(String[] args) throws Exception {
// Define Spring contexts required for JMS to run
List<String> contexts = Arrays.asList( "classpath:applicationContext.xml", "classpath:spring/jmsContext.xml" );
ConfigurableApplicationContext applicationContext = new ClassPathXmlApplicationContext(contexts);
// Get activeMQ from JMS context
BrokerService broker = applicationContext.getBean( "broker" );
// Start up activeMQ
broker.start();
// Get pid for this process
String sysId = ManagementFactory.getRuntimeMXBean().getName();
String pid = sysId.substring(0, sysId.indexOf("@"));
// Write PID file
File file = new File("jms.pid");
DataOutputStream outs = new DataOutputStream(new FileOutputStream(file, false));
outs.write(pid.getBytes());
outs.close();
}
}
用于访问BrokerService的示例 Spring 配置
<bean id="broker" class="org.apache.activemq.xbean.BrokerFactoryBean">
<property name="config" value="classpath:org/activemq/xbean/activemq.xml" />
<property name="start" value="true" />
</bean>
我通常看到 JMS 应用程序作为 Windows 服务或 Unix 守护程序运行。这些为您提供了可以配置的功能,例如在服务器重新启动时重新启动 JMS 应用程序等。
有一些商业 Java EE 容器(如 Weblogic)提供了启动类,您可以使用这些类在集群中的节点启动时启动 JMS 应用程序。这提供了对 JMS 应用程序/服务器的控制台控制。不过,在您的情况下,这听起来不是一个选择。