您的位置:首页 > 其它

activemq分析(一)启动流程

2016-07-10 19:04 309 查看
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();
}


类图





本文出自 “简单” 博客,请务必保留此出处http://dba10g.blog.51cto.com/764602/1817646
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: