activemq分析(一)启动流程

activemq 启动是非常简单的。

1.从二进制发布包启动

On Windows:

cd [activemq_install_dir]
bin\activemq start

2.从源码方式启动

Main class    :    org.apache.activemq.console.Main

arguments    :    start xbean:activemq2.xml

其中activemq2.xml内容一个最简单的配置文件

<beans
  xmlns="http://www.springframework.org/schema/beans"
  xmlns:amq="http://activemq.apache.org/schema/core"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
  http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd
  http://activemq.apache.org/camel/schema/spring http://activemq.apache.org/camel/schema/spring/camel-spring.xsd">
  <!-- Allows us to use system properties as variables in this configuration file -->
  <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>
  <broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.base}/data">
    <!-- The transport connectors ActiveMQ will listen to -->
    <transportConnectors>
       <transportConnector name="openwire" uri="tcp://localhost:61616" />
    </transportConnectors>
  </broker>
</beans>

命令列表

有很多命令,启动命令只是其中之一

Tasks:
    browse                   - Display selected messages in a specified destination.
    bstat                    - Performs a predefined query that displays useful statistics regarding the specified broker
    create                   - Creates a runnable broker instance in the specified path.
    decrypt                  - Decrypts given text
    encrypt                  - Encrypts given text
    export                   - Exports a stopped brokers data files to an archive file
    list                     - Lists all available brokers in the specified JMX context
    purge                    - Delete selected destination‘s messages that matches the message selector
    query                    - Display selected broker component‘s attributes and statistics.
    start                    - Creates and starts a broker using a configuration file, or a broker URI.
    stop                     - Stops a running broker specified by the broker name.

启动过程序列图

通过分析activemq*.jar,查看main方法入口。定位到org.apache.activemq.console.Main。

通过反射,调用ShellCommand的main方法

public static final String TASK_DEFAULT_CLASS = "org.apache.activemq.console.command.ShellCommand";
public void runTaskClass(List<String> tokens) throws Throwable {
...
    ClassLoader cl = getClassLoader();
    Thread.currentThread().setContextClassLoader(cl);

    // Use reflection to run the task.
    try {
        String[] args = tokens.toArray(new String[tokens.size()]);
        Class<?> task = cl.loadClass(TASK_DEFAULT_CLASS);
        Method runTask = task.getMethod("main", new Class[] {
            String[].class, InputStream.class, PrintStream.class
        });
        runTask.invoke(task.newInstance(), args, System.in, System.out);
    } catch (InvocationTargetException e) {
        throw e.getCause();
    }
}

步骤2

org.apache.activemq.console.command.ShellCommand :main方法

构造运行上下文及Formatter

public static int main(String[] args, InputStream in, PrintStream out) {
    CommandContext context = new CommandContext();
    context.setFormatter(new CommandShellOutputFormatter(out));
    // Convert arguments to list for easier management
    List<String> tokens = new ArrayList<String>(Arrays.asList(args));
    ShellCommand main = new ShellCommand();
    try {
        main.setCommandContext(context);
        main.execute(tokens);
        return 0;
    } catch (Exception e) {
        context.printException(e);
        return -1;
    }
}

步骤3:

org.apache.activemq.console.command.ShellCommand  :runTask

找出适配的Command ,处理请求

protected void runTask(List<String> tokens) throws Exception {
    // Process task token
    if (tokens.size() > 0) {
        Command command=null;
        String taskToken = (String)tokens.remove(0);

        for( Command c: getCommands() ) {
            if( taskToken.equals(c.getName()) ) {//根据每个command的名称与参数比对
                command = c;
                break;
            }
        }
        if( command == null ) {
            if (taskToken.equals("help")) {
                printHelp();
            } else {
                printHelp();
            }
        }

        if( command!=null ) {
            command.setCommandContext(context);
            command.execute(tokens);
        }
    } else {
        printHelp();
    }
}

步骤5:org.apache.activemq.console.command.StartCommand : runTask

启动broker,先判断参数是否有brokerURI

protected void runTask(List<String> brokerURIs) throws Exception {
    try {
        // If no config uri, use default setting
        if (brokerURIs.isEmpty()) {
            setConfigUri(new URI(DEFAULT_CONFIG_URI));
            startBroker(getConfigUri());
            // Set configuration data, if available, which in this case
            // would be the config URI
        } else {
            String strConfigURI;
            while (!brokerURIs.isEmpty()) {
                strConfigURI = (String)brokerURIs.remove(0);
                try {
                    setConfigUri(new URI(strConfigURI));
                } catch (URISyntaxException e) {
                    context.printException(e);
                    return;
                }

                startBroker(getConfigUri());
            }
        }

        // Prevent the main thread from exiting unless it is terminated
        // elsewhere
    } catch (Exception e) {
        context.printException(new RuntimeException("Failed to execute start task. Reason: " + e, e));
        throw new Exception(e);
    }
    
    // The broker start up fine.  If this unblocks it‘s cause they were stopped
    // and this would occur because of an internal error (like the DB going offline)
    waitForShutdown();
}

类图

时间: 2024-12-29 21:43:24

activemq分析(一)启动流程的相关文章

一,移植uboot,分析uboot启动流程

文档时间:2018-08-08 交叉编译器:arm-linux-gcc-4.3.2 Ubuntu版本:16.04 uboot版本:2013.10 uboot启动流程简要如下: a,设置CPU为管理模式 b,关闭看门狗 c,关闭中断 d,设置时钟频率 e,进入lowlevel_init.S,初始化各个bank f,进入board_init_f()函数 h,代码重定位,清除bss i,跳转到board_init_r(),进入第二阶段 1,进入https://www.amazon.com/cloudd

Spring源码分析: SpringMVC启动流程与DispatcherServlet请求处理流程

Spring版本: 4.0.X 注:这里的分析只关注整个处理流程的大致过程,省略与流程无关的代码. 应用根上下文(Root ApplicationContext)的启动 我们知道在一个web项目中使用SpringMVC时,需在web.xml中配置一个监听器: <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </list

SpringMVC源码分析和启动流程

https://yq.aliyun.com/articles/707995 在Spring的web容器启动时会去读取web.xml文件,相关启动顺序为:<context-param> --> <listener> --> <filter> --> <servlet>,具体为: 1.解析<context-param>键值对 2.创建一个application对象即ServletContext,servlet上下文,用于全局共享 3

Activity的启动流程分析

Activity是Android应用程序的四大组件之一,负责管理Android应用程序的用户界面,一般一个应用程序中包含很多个Activity,他们可能运行在一个进程中,也可能运行在不同的进程中. 我们主要通过启动在不同进程中的Activity,来分析Activity的启动流程及AMS对Activity的管理逻辑. 有两个应用程序App1和App2,在App1的Activity A中点击button 启动 App2中的Activity B. 通过分析以上ActivityB的启动过程来了解AMS对

从0移植uboot (二) _启动流程分析

来源:Linux社区  作者:xiaojiang1025  : http://www.linuxidc.com/Linux/2017-02/141019.htm 经过了上一篇的配置,我们已经执行make就可以编译出一个uboot.bin,但这还不够,首先,此时的uboot并不符合三星芯片对bootloader的格式要求,其次,此时的uboot.bin也没有结合我们的开发板进行配置,还无法使用.而要进行这样的个性化配置,前提条件就是对uboot开机流程和编译系统有所了解,本文主要讨论前者.uboo

SpringBoot启动流程分析(五):SpringBoot自动装配原理实现

SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一):SpringApplication类初始化过程 SpringBoot启动流程分析(二):SpringApplication的run方法 SpringBoot启动流程分析(三):SpringApplication的run方法之prepareContext()方法 SpringBoot启动流程分析(四

记录Linux启动流程的工具bootchart

/*********************************************************************  * Author  : Samson  * Date    : 04/28/2014  * Test platform:  *              3.11.0-12-generic #19-Ubuntu  *              GNU bash, version 4.2.45  * ****************************

【嵌入式开发】 Bootloader 详解 ( 代码环境 | ARM 启动流程 | uboot 工作流程 | 架构设计)

作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42462795 转载请著名出处 相关资源下载 :  -- u-boot 源码 : http://download.csdn.net/detail/han1202012/8342761 -- S3C2440 文档 : http://download.csdn.net/detail/han1202012/8342701 -- S5PV210_iROM_Applicati

0923------APUE 学习笔记----------Linux系统的启动流程

前言: 前天在看APUE的时候突然想到了这个问题,于是给自己科普一下Linux系统的启动流程. 1.加载BIOS 接通电源后,计算机首先加载BIOS(即Basic Input-Output System,该程序被固化在主板上的一个ROM芯片中,包括最基本的输入输出程序.系统设置程序.开机硬件自检程序和系统自举程序等),进行硬件自检(即Power On Self Test)检查计算机硬件是否满足运行的基本条件(对于非严重故障,会发出一些声音,严重故障则会直接退出),硬件自检完成以后,BIOS根据C