入口在 org.apache.activemq.console.Main这个类
在main方法内最前面加入如下代码
// debug
System.setProperty("activemq.base", "E:\\apache-activemq-5.10.2");
System.setProperty("activemq.home", "E:\\apache-activemq-5.10.2");
System.setProperty("org.apache.activemq.default.directory.prefix", "E:\\activeMQ\\");
eclipse 中 program arguments 如下
start broker:(tcp://localhost:61616)?brokerName=broker&deleteAllMessagesOnStartup=true
截图如下
具体 URL 后的参数在这里 http://activemq.apache.org/broker-uri.html
/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.activemq.console; import java.io.File; import java.io.InputStream; import java.io.PrintStream; import java.lang.management.ManagementFactory; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.JarURLConnection; import java.net.MalformedURLException; import java.net.URI; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; import java.util.StringTokenizer; /** * Main class that can bootstrap an ActiveMQ broker console. Handles command * line argument parsing to set up and run broker tasks. */ public class Main { public static final String TASK_DEFAULT_CLASS = "org.apache.activemq.console.command.ShellCommand"; private static boolean useDefExt = true; private File activeMQHome; private File activeMQBase; private ClassLoader classLoader; private final Set<File> extensions = new LinkedHashSet<File>(); private final Set<File> activeMQClassPath = new LinkedHashSet<File>(); public static void main(String[] args) { // debug System.setProperty("activemq.base", "E:\\apache-activemq-5.10.2"); System.setProperty("activemq.home", "E:\\apache-activemq-5.10.2"); System.setProperty("org.apache.activemq.default.directory.prefix", "E:\\activeMQ\\"); // Create the tmpdir if it does not exist yet.. File tmpdir = new File(System.getProperty("java.io.tmpdir")); if(!tmpdir.exists()) { tmpdir.mkdirs(); } Main app = new Main(); // Convert arguments to collection for easier management List<String> tokens = new LinkedList<String>(Arrays.asList(args)); // Parse for extension directory option app.parseExtensions(tokens); // lets add the conf directory first, to find the log4j.properties just in case its not // in the activemq.classpath system property or some jar incorrectly includes one File confDir = app.getActiveMQConfig(); app.addClassPath(confDir); // Add the following to the classpath: // // ${activemq.base}/conf // ${activemq.base}/lib/* (only if activemq.base != activemq.home) // ${activemq.home}/lib/* // ${activemq.base}/lib/optional/* (only if activemq.base != activemq.home) // ${activemq.home}/lib/optional/* // ${activemq.base}/lib/web/* (only if activemq.base != activemq.home) // ${activemq.home}/lib/web/* if (useDefExt && app.canUseExtdir()) { boolean baseIsHome = app.getActiveMQBase().equals(app.getActiveMQHome()); File baseLibDir = new File(app.getActiveMQBase(), "lib"); File homeLibDir = new File(app.getActiveMQHome(), "lib"); if (!baseIsHome) { app.addExtensionDirectory(baseLibDir); } app.addExtensionDirectory(homeLibDir); if (!baseIsHome) { app.addExtensionDirectory(new File(baseLibDir, "camel")); app.addExtensionDirectory(new File(baseLibDir, "optional")); app.addExtensionDirectory(new File(baseLibDir, "web")); app.addExtensionDirectory(new File(baseLibDir, "extra")); } app.addExtensionDirectory(new File(homeLibDir, "camel")); app.addExtensionDirectory(new File(homeLibDir, "optional")); app.addExtensionDirectory(new File(homeLibDir, "web")); app.addExtensionDirectory(new File(homeLibDir, "extra")); } // Add any custom classpath specified from the system property activemq.classpath app.addClassPathList(System.getProperty("activemq.classpath")); try { app.runTaskClass(tokens); System.exit(0); } catch (ClassNotFoundException e) { System.out.println("Could not load class: " + e.getMessage()); try { ClassLoader cl = app.getClassLoader(); if (cl != null) { System.out.println("Class loader setup: "); printClassLoaderTree(cl); } } catch (MalformedURLException e1) { } System.exit(1); } catch (Throwable e) { System.out.println("Failed to execute main task. Reason: " + e); System.exit(1); } } /** * Print out what's in the classloader tree being used. * * @param cl * @return depth */ private static int printClassLoaderTree(ClassLoader cl) { int depth = 0; if (cl.getParent() != null) { depth = printClassLoaderTree(cl.getParent()) + 1; } StringBuffer indent = new StringBuffer(); for (int i = 0; i < depth; i++) { indent.append(" "); } if (cl instanceof URLClassLoader) { URLClassLoader ucl = (URLClassLoader)cl; System.out.println(indent + cl.getClass().getName() + " {"); URL[] urls = ucl.getURLs(); for (int i = 0; i < urls.length; i++) { System.out.println(indent + " " + urls[i]); } System.out.println(indent + "}"); } else { System.out.println(indent + cl.getClass().getName()); } return depth; } public void parseExtensions(List<String> tokens) { if (tokens.isEmpty()) { return; } int count = tokens.size(); int i = 0; // Parse for all --extdir and --noDefExt options while (i < count) { String token = tokens.get(i); // If token is an extension dir option if (token.equals("--extdir")) { // Process token count--; tokens.remove(i); // If no extension directory is specified, or next token is // another option if (i >= count || tokens.get(i).startsWith("-")) { System.out.println("Extension directory not specified."); System.out.println("Ignoring extension directory option."); continue; } // Process extension dir token count--; File extDir = new File(tokens.remove(i)); if (!canUseExtdir()) { System.out.println("Extension directory feature not available due to the system classpath being able to load: " + TASK_DEFAULT_CLASS); System.out.println("Ignoring extension directory option."); continue; } if (!extDir.isDirectory()) { System.out.println("Extension directory specified is not valid directory: " + extDir); System.out.println("Ignoring extension directory option."); continue; } addExtensionDirectory(extDir); } else if (token.equals("--noDefExt")) { // If token is // --noDefExt option count--; tokens.remove(i); useDefExt = false; } else { i++; } } } public void runTaskClass(List<String> tokens) throws Throwable { StringBuilder buffer = new StringBuilder(); buffer.append(System.getProperty("java.vendor")); buffer.append(" "); buffer.append(System.getProperty("java.version")); buffer.append(" "); buffer.append(System.getProperty("java.home")); System.out.println("Java Runtime: " + buffer.toString()); buffer = new StringBuilder(); buffer.append("current="); buffer.append(Runtime.getRuntime().totalMemory()/1024L); buffer.append("k free="); buffer.append(Runtime.getRuntime().freeMemory()/1024L); buffer.append("k max="); buffer.append(Runtime.getRuntime().maxMemory()/1024L); buffer.append("k"); System.out.println(" Heap sizes: " + buffer.toString()); List<?> jvmArgs = ManagementFactory.getRuntimeMXBean().getInputArguments(); buffer = new StringBuilder(); for (Object arg : jvmArgs) { buffer.append(" ").append(arg); } System.out.println(" JVM args:" + buffer.toString()); System.out.println("Extensions classpath:\n " + getExtensionDirForLogging()); System.out.println("ACTIVEMQ_HOME: " + getActiveMQHome()); System.out.println("ACTIVEMQ_BASE: " + getActiveMQBase()); System.out.println("ACTIVEMQ_CONF: " + getActiveMQConfig()); System.out.println("ACTIVEMQ_DATA: " + getActiveMQDataDir()); 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(); } } public void addExtensionDirectory(File directory) { extensions.add(directory); } public void addClassPathList(String fileList) { if (fileList != null && fileList.length() > 0) { StringTokenizer tokenizer = new StringTokenizer(fileList, ";"); while (tokenizer.hasMoreTokens()) { addClassPath(new File(tokenizer.nextToken())); } } } public void addClassPath(File classpath) { activeMQClassPath.add(classpath); } /** * The extension directory feature will not work if the broker factory is * already in the classpath since we have to load him from a child * ClassLoader we build for it to work correctly. * * @return true, if extension dir can be used. false otherwise. */ public boolean canUseExtdir() { try { Main.class.getClassLoader().loadClass(TASK_DEFAULT_CLASS);// org.apache.activemq.console.command.ShellCommand return false; } catch (ClassNotFoundException e) { return true; } } public ClassLoader getClassLoader() throws MalformedURLException { if (classLoader == null) { // Setup the ClassLoader classLoader = Main.class.getClassLoader(); if (!extensions.isEmpty() || !activeMQClassPath.isEmpty()) { ArrayList<URL> urls = new ArrayList<URL>(); for (Iterator<File> iter = activeMQClassPath.iterator(); iter.hasNext();) { File dir = iter.next(); urls.add(dir.toURI().toURL()); } for (Iterator<File> iter = extensions.iterator(); iter.hasNext();) { File dir = iter.next(); if (dir.isDirectory()) { File[] files = dir.listFiles(); if (files != null) { // Sort the jars so that classpath built is consistently in the same // order. Also allows us to use jar names to control classpath order. Arrays.sort(files, new Comparator<File>() { public int compare(File f1, File f2) { return f1.getName().compareTo(f2.getName()); } }); for (int j = 0; j < files.length; j++) { if (files[j].getName().endsWith(".zip") || files[j].getName().endsWith(".jar")) { urls.add(files[j].toURI().toURL()); } } } } } URL u[] = new URL[urls.size()]; urls.toArray(u); classLoader = new URLClassLoader(u, classLoader); } Thread.currentThread().setContextClassLoader(classLoader); } return classLoader; } public void setActiveMQHome(File activeMQHome) { this.activeMQHome = activeMQHome; } public File getActiveMQHome() { if (activeMQHome == null) { if (System.getProperty("activemq.home") != null) { activeMQHome = new File(System.getProperty("activemq.home")); } if (activeMQHome == null) { // guess from the location of the jar URL url = Main.class.getClassLoader().getResource("org/apache/activemq/console/Main.class"); if (url != null) { try { JarURLConnection jarConnection = (JarURLConnection)url.openConnection(); url = jarConnection.getJarFileURL(); URI baseURI = new URI(url.toString()).resolve(".."); activeMQHome = new File(baseURI).getCanonicalFile(); System.setProperty("activemq.home", activeMQHome.getAbsolutePath()); } catch (Exception ignored) { } } } if (activeMQHome == null) { activeMQHome = new File("../."); System.setProperty("activemq.home", activeMQHome.getAbsolutePath()); } } return activeMQHome; } public File getActiveMQBase() { if (activeMQBase == null) { if (System.getProperty("activemq.base") != null) { activeMQBase = new File(System.getProperty("activemq.base")); } if (activeMQBase == null) { activeMQBase = getActiveMQHome(); System.setProperty("activemq.base", activeMQBase.getAbsolutePath()); } } return activeMQBase; } public File getActiveMQConfig() { File activeMQConfig = null; if (System.getProperty("activemq.conf") != null) { activeMQConfig = new File(System.getProperty("activemq.conf")); } else { activeMQConfig = new File(getActiveMQBase() + "/conf"); System.setProperty("activemq.conf", activeMQConfig.getAbsolutePath()); } return activeMQConfig; } public File getActiveMQDataDir() { File activeMQDataDir = null; if (System.getProperty("activemq.data") != null) { activeMQDataDir = new File(System.getProperty("activemq.data")); } else { activeMQDataDir = new File(getActiveMQBase() + "/data"); System.setProperty("activemq.data", activeMQDataDir.getAbsolutePath()); } return activeMQDataDir; } public String getExtensionDirForLogging() { StringBuilder sb = new StringBuilder("["); for (Iterator<File> it = extensions.iterator(); it.hasNext();) { File file = it.next(); sb.append(file.getPath()); if (it.hasNext()) { sb.append(","); } } sb.append("]"); return sb.toString(); } }
相关推荐
本篇文章将详细解析ActiveMQ 5.15.1在Windows和Linux操作系统上的安装过程,以及如何获取和使用源代码。 首先,我们来看ActiveMQ的安装步骤: 1. **下载**: 从Apache官方网站获取ActiveMQ的发行版,这里有两个可供...
这个源码包"activemq-4.0.1-src.zip"包含了ActiveMQ 4.0.1版本的完整源代码,为开发者提供了深入理解其工作原理的机会。 ActiveMQ的核心特性包括: 1. **高性能与可伸缩性**:ActiveMQ的设计目标之一就是提供高...
开发者可能遇到的问题可能涉及到配置、性能优化、消息丢失、消息重复、网络中断等问题,这些问题通常需要深入理解ActiveMQ的内部工作原理和源代码来解决。 "工具"标签可能意味着博主使用了一些辅助工具来调试和监控...
5. 调试和优化:根据测试结果,可能需要调试代码或调整ActiveMQ的配置以优化性能和稳定性。 了解这些基本概念后,你可以开始着手搭建环境,运行这个示例,从而深入理解ActiveMQ RCP的工作原理及其在实际应用中的...
标题中的"ActiveMQ 使用Ajax 收发消息实战"指出我们将探讨如何...`src`目录包含源代码,可能包含了与ActiveMQ和Ajax集成的相关Java类和Web资源。然而,具体的实现细节无法从这些文件名中获取,需要查看实际的代码内容。
`activemq-tools-1.5.jar`就是一个包含了所有相关类和资源的`jar`包,可以直接在Java环境中运行,无需编译源代码。开发者可以通过Java的`java -jar`命令来执行这个工具包,例如: ```bash java -jar activemq-tools...
5. **开源特性**:作为开源软件,ActiveMQ Plugin遵循开放源代码协议,允许社区成员自由使用、修改和分发。这意味着用户不仅可以免费使用,还可以根据自身需求定制功能,或者参与项目的改进,推动其不断发展。 6. *...
标签“源码”意味着文章可能涉及Spring和ActiveMQ的相关源代码分析,帮助读者理解底层工作原理,比如Spring的JMS(Java Message Service)模板是如何与ActiveMQ交互的,或者ActiveMQ的Broker是如何处理消息的。...
2. **获取源码**:从官方网站或者GitHub仓库下载ActiveMQ的源代码。 3. **配置项目**:在VS2015中创建一个新的C++项目,将ActiveMQ-C++的源代码添加到项目中。 4. **设置编译选项**:在项目属性中配置包括路径、链接...
此项目可能包括了Flex前端的源代码以及配置文件,展示了如何创建消息生产者(发布消息)和消费者(订阅并接收消息)。 6. **配置与编程**: 在实际操作中,你需要配置BlazeDS以连接到ActiveMQ,设置相应的目的地...
- **JmsSpring**:这个目录可能包含了整个工程的源代码,包括配置文件、Java类以及相关的资源文件。 - **配置文件**:如`applicationContext.xml`,可能包含Spring和JMS的相关配置。 - **Java类**:可能有消息...
而“工具”标签可能指的是博客中提到了一些辅助开发和调试JMS应用的工具,如消息中间件(如Apache ActiveMQ、RabbitMQ或IBM WebSphere MQ)或者是集成开发环境(IDE)的插件等。 在压缩包文件“src”中,通常会包含...
至于标签中的“源码”和“工具”,这可能意味着博客可能涉及了JMS的实现原理,例如开源消息中间件如ActiveMQ、RabbitMQ或Kafka的源代码分析,或者是介绍了一些使用JMS的实用工具或库。此外,还可能包含了如何配置和...
10. **测试和调试**:在开发过程中,使用模拟的JMS提供者(如ActiveMQ Artemis的In-Memory Broker)进行单元测试,可以帮助快速验证代码的正确性。同时,日志和跟踪工具对于调试JMS应用程序也非常关键。 综上所述,...