activemq 启动是非常简单的。
如
1.从二进制发布包启动
On Windows:
1
2
|
cd
[activemq_install_dir]
bin\activemq start
|
2.从源码方式启动
Main class : org.apache.activemq.console.Main
arguments : start xbean:activemq2.xml
其中activemq2.xml内容一个最简单的配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<
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
>
|
命令列表
有很多命令,启动命令只是其中之一
1
2
3
4
5
6
7
8
9
10
11
12
|
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方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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 ,处理请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
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();
}
|
类图
本文转自 randy_shandong 51CTO博客,原文链接:http://blog.51cto.com/dba10g/1817646,如需转载请自行联系原作者