【问题标题】:Spring JMS running as a JAR projectSpring JMS 作为 JAR 项目运行
【发布时间】:2012-09-18 12:41:42
【问题描述】:

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

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

【问题讨论】:

  • 您能否详细说明“部署到服务器”的含义?您是在使用 J2EE 容器还是将其作为 Java 进程运行?
  • 通常我们部署在tomcat或应用服务器中的所有war文件。同样,我们能否将 JAR 作为库项目或类似的东西部署在 J2EE 容器中,一旦部署,它应该开始监听 Message Queue(我的意思是 Spring JMS 监听器应该可以工作)。但我想这可能是不可能的。如果可能的话,我需要知道如何做到这一点。
  • @ThinkingStiff,你知道怎么做吗?
  • @LinuRaj 我还没有实现它,因为我们刚刚将 JMS 客户端与我们的一个 Web 应用程序合并。但我认为可以将它创建为一个独立的 spring 应用程序。但显然你需要一个主类来启动它。

标签: spring jar project


【解决方案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>

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-19
      • 2018-12-05
      • 2023-03-27
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-08
      相关资源
      最近更新 更多