3

我有一个 Spring JMS 应用程序。事实上没有用户界面。只是 Spring 配置(JMS 侦听器),Spring 配置由 web.xml 加载。所以当我在服务器中部署时,监听器开始工作。

但我不想要 Web 部件,因为没有 UI,它只是一个监听队列并进行处理的项目。所以我认为它应该是 JAR 并且它应该独立运行(或者当我在服务器中部署时)如何创建这样的项目/ JAR 在服务器中部署时它会自动开始运行。我不想每次更新 JAR 时都运行一个主类。

4

2 回答 2

1

我之前使用过一个可执行的 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>
于 2012-09-18T16:31:55.840 回答
0

我通常看到 JMS 应用程序作为 Windows 服务或 Unix 守护程序运行。这些为您提供了可以配置的功能,例如在服务器重新启动时重新启动 JMS 应用程序等。

有一些商业 Java EE 容器(如 Weblogic)提供了启动类,您可以使用这些类在集群中的节点启动时启动 JMS 应用程序。这提供了对 JMS 应用程序/服务器的控制台控制。不过,在您的情况下,这听起来不是一个选择。

于 2012-09-18T16:48:05.960 回答