in artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/Create.java [543:872]
public Object run(ActionContext context) throws Exception {
super.run(context);
setupJournalType();
// requireLogin should set allowAnonymous=false, to avoid user's questions
if (requireLogin != null && requireLogin.booleanValue()) {
allowAnonymous = Boolean.FALSE;
}
context.out.println(String.format("Creating ActiveMQ Artemis instance at: %s", directory.getCanonicalPath()));
HashMap<String, String> filters = new LinkedHashMap<>();
if (journalDeviceBlockSize % 512 != 0) {
// This will generate a CLI error
// no need to a logger here as this would be just a regular UI output
throw new IllegalArgumentException("The device-block-size must be a multiple of 512");
}
filters.put("${device-block-size}", Integer.toString(journalDeviceBlockSize));
filters.put("${master-slave}", isSlave() ? "slave" : "master");
filters.put("${failover-on-shutdown}", isFailoverOnShutodwn() ? "true" : "false");
filters.put("${persistence-enabled}", isDisablePersistence() ? "false" : "true");
if (ping != null && !ping.isEmpty()) {
filters.put("${ping}", ping);
filters.put("${ping-config.settings}", readTextFile(ETC_PING_TXT, filters));
} else {
filters.put("${ping-config.settings}", readTextFile(ETC_COMMENTED_PING_TXT, filters));
}
if (staticNode != null) {
clustered = true;
}
if (replicated) {
clustered = true;
filters.put("${replicated.settings}", readTextFile(isSlave() ? ETC_REPLICATED_SLAVE_SETTINGS_TXT : ETC_REPLICATED_MASTER_SETTINGS_TXT, filters));
} else {
filters.put("${replicated.settings}", "");
}
if (sharedStore) {
clustered = true;
filters.put("${shared-store.settings}", readTextFile(ETC_SHARED_STORE_SETTINGS_TXT, filters));
} else {
filters.put("${shared-store.settings}", "");
}
filters.put("${journal.settings}", journalType.name());
if (sslKey != null) {
filters.put("${web.protocol}", "https");
getSslKeyPassword();
String extraWebAttr = " keyStorePath=\"" + sslKey + "\" keyStorePassword=\"" + sslKeyPassword + "\"";
if (useClientAuth) {
getSslTrust();
getSslTrustPassword();
extraWebAttr += " clientAuth=\"true\" trustStorePath=\"" + sslTrust + "\" trustStorePassword=\"" + sslTrustPassword + "\"";
}
filters.put("${extra.web.attributes}", extraWebAttr);
} else {
filters.put("${web.protocol}", "http");
filters.put("${extra.web.attributes}", "");
}
filters.put("${fsync}", String.valueOf(!noJournalSync));
filters.put("${default.port}", String.valueOf(defaultPort + portOffset));
filters.put("${support-advisory}", Boolean.toString(supportAdvisory));
filters.put("${suppress-internal-management-objects}", Boolean.toString(suppressInternalManagementObjects));
filters.put("${amqp.port}", String.valueOf(AMQP_PORT + portOffset));
filters.put("${stomp.port}", String.valueOf(STOMP_PORT + portOffset));
filters.put("${hq.port}", String.valueOf(HQ_PORT + portOffset));
filters.put("${mqtt.port}", String.valueOf(MQTT_PORT + portOffset));
filters.put("${http.host}", httpHost);
filters.put("${http.port}", String.valueOf(httpPort + portOffset));
filters.put("${data.dir}", data);
filters.put("${max-hops}", String.valueOf(maxHops));
filters.put("${message-load-balancing}", messageLoadBalancing.toString());
filters.put("${user}", getUser());
filters.put("${password}", getPassword());
filters.put("${encoded.role}", role.replaceAll(" ", "\\\\ "));
filters.put("${global-max-messages}", Long.toString(globalMaxMessages));
if (globalMaxSize == null || globalMaxSize.trim().equals("")) {
filters.put("${global-max-section}", readTextFile(ETC_GLOBAL_MAX_DEFAULT_TXT, filters));
} else {
filters.put("${global-max-size}", globalMaxSize);
filters.put("${global-max-section}", readTextFile(ETC_GLOBAL_MAX_SPECIFIED_TXT, filters));
}
if (jdbc) {
if (jdbcURL == null) {
jdbcURL = "jdbc:derby:" + getInstance().getAbsolutePath() + "/data/derby/db;create=true";
}
filters.put("${jdbcBindings}", jdbcBindings);
filters.put("${jdbcMessages}", jdbcMessages);
filters.put("${jdbcLargeMessages}", jdbcLargeMessages);
filters.put("${jdbcPageStore}", jdbcPageStore);
filters.put("${jdbcNodeManager}", jdbcNodeManager);
filters.put("${jdbcURL}", jdbcURL);
filters.put("${jdbcClassName}", jdbcClassName);
filters.put("${jdbcNetworkTimeout}", "" + jdbcNetworkTimeout);
filters.put("${jdbcLockRenewPeriod}", "" + jdbcLockRenewPeriod);
filters.put("${jdbcLockExpiration}", "" + jdbcLockExpiration);
filters.put("${jdbc}", readTextFile(ETC_DATABASE_STORE_TXT, filters));
} else {
filters.put("${jdbc}", "");
}
if (clustered) {
filters.put("${host}", getHostForClustered());
if (name == null) {
name = getHostForClustered();
}
String connectorSettings = getConnectors(filters);
filters.put("${name}", name);
filters.put("${connector-config.settings}", connectorSettings);
filters.put("${cluster-security.settings}", readTextFile(ETC_CLUSTER_SECURITY_SETTINGS_TXT, filters));
if (staticNode != null) {
String staticCluster = readTextFile(ETC_CLUSTER_STATIC_SETTINGS_TXT, filters);
StringWriter stringWriter = new StringWriter();
PrintWriter printWriter = new PrintWriter(stringWriter);
int countCluster = getStaticNodes().length;
for (int i = 0; i < countCluster; i++) {
printWriter.println(" <connector-ref>node" + i + "</connector-ref>");
}
filters.put("${connectors-list}", stringWriter.toString());
staticCluster = applyFilters(staticCluster, filters);
filters.put("${cluster.settings}", staticCluster);
} else {
filters.put("${cluster.settings}", readTextFile(ETC_CLUSTER_SETTINGS_TXT, filters));
}
filters.put("${cluster-user}", getClusterUser());
filters.put("${cluster-password}", getClusterPassword());
} else {
if (name == null) {
name = getHost();
}
filters.put("${name}", name);
filters.put("${host}", getHost());
filters.put("${connector-config.settings}", "");
filters.put("${cluster-security.settings}", "");
filters.put("${cluster.settings}", "");
filters.put("${cluster-user}", "");
filters.put("${cluster-password}", "");
}
applyAddressesAndQueues(filters);
if (home != null) {
filters.put("${home}", path(home));
}
new File(directory, "bin").mkdirs();
File etcFolder = createDirectory(etc, directory);
new File(directory, "tmp").mkdirs();
new File(directory, "lib").mkdirs();
File dataFolder = createDirectory(data, directory);
File logFolder = createDirectory("log", directory);
File oomeDumpFile = new File(logFolder, "oom_dump.hprof");
String processedJavaOptions = getJavaOptions();
addScriptFilters(filters, getHome(), getInstance(), etcFolder, dataFolder, oomeDumpFile, javaMemory, processedJavaOptions, role);
boolean allowAnonymous = isAllowAnonymous();
String retentionTag;
if (retentionDays > 0) {
if (retentionMaxBytes != null) {
retentionTag = "<journal-retention-directory period=\"" + retentionDays + "\" unit=\"DAYS\" storage-limit=\"" + retentionMaxBytes + "\">" + data + "/retention</journal-retention-directory>";
} else {
retentionTag = "<journal-retention-directory period=\"" + retentionDays + "\" unit=\"DAYS\">" + data + "/retention</journal-retention-directory>";
}
} else {
retentionTag = "\n" +
" <!-- if you want to retain your journal uncomment this following configuration.\n\n" +
" This will allow your system to keep 7 days of your data, up to 10G. Tweak it accordingly to your use case and capacity.\n\n" +
" it is recommended to use a separate storage unit from the journal for performance considerations.\n\n" +
" <journal-retention-directory period=\"7\" unit=\"DAYS\" storage-limit=\"10G\">data/retention</journal-retention-directory>\n\n" +
" You can also enable retention by using the argument journal-retention on the `artemis create` command -->\n\n";
}
filters.put("${journal-retention}", retentionTag);
filters.put("${java-opts}", processedJavaOptions);
filters.put("${java-memory}", javaMemory);
if (allowAnonymous) {
write(ETC_LOGIN_CONFIG_WITH_GUEST, new File(etcFolder, ETC_LOGIN_CONFIG), filters, false, force);
} else {
write(ETC_LOGIN_CONFIG_WITHOUT_GUEST, new File(etcFolder, ETC_LOGIN_CONFIG), filters, false, force);
}
writeEtc(ETC_ARTEMIS_ROLES_PROPERTIES, etcFolder, filters, false);
if (IS_WINDOWS) {
write(BIN_ARTEMIS_CMD, filters, false);
write(BIN_ARTEMIS_SERVICE_EXE, force);
write(BIN_ARTEMIS_SERVICE_EXE_CONFIG, force);
write(BIN_ARTEMIS_SERVICE_XML, filters, false);
writeEtc(ETC_ARTEMIS_PROFILE_CMD, etcFolder, filters, false);
}
if (!IS_WINDOWS || IS_CYGWIN) {
write(BIN_ARTEMIS, filters, true);
makeExec(BIN_ARTEMIS);
write(BIN_ARTEMIS_SERVICE, filters, true);
makeExec(BIN_ARTEMIS_SERVICE);
writeEtc(ETC_ARTEMIS_PROFILE, etcFolder, filters, true);
}
writeEtc(ETC_LOG4J2_PROPERTIES, etcFolder, null, false);
if (noWeb) {
filters.put("${bootstrap-web-settings}", "");
} else {
filters.put("${bootstrap-web-settings}", readTextFile(ETC_BOOTSTRAP_WEB_SETTINGS_TXT, filters));
}
if (noAmqpAcceptor) {
filters.put("${amqp-acceptor}", "");
} else {
filters.put("${amqp-acceptor}", readTextFile(ETC_AMQP_ACCEPTOR_TXT, filters));
}
if (noMqttAcceptor) {
filters.put("${mqtt-acceptor}", "");
} else {
filters.put("${mqtt-acceptor}",readTextFile(ETC_MQTT_ACCEPTOR_TXT, filters));
}
if (noStompAcceptor) {
filters.put("${stomp-acceptor}", "");
} else {
filters.put("${stomp-acceptor}", readTextFile(ETC_STOMP_ACCEPTOR_TXT, filters));
}
if (noHornetQAcceptor) {
filters.put("${hornetq-acceptor}", "");
} else {
filters.put("${hornetq-acceptor}", readTextFile(ETC_HORNETQ_ACCEPTOR_TXT, filters));
}
if (paging == null && blocking == null) {
filters.put("${full-policy}", "PAGE");
} else if (paging != null && paging) {
filters.put("${full-policy}", "PAGE");
} else if (blocking != null && blocking) {
filters.put("${full-policy}", "BLOCK");
} else {
filters.put("${full-policy}", "PAGE");
}
filters.put("${auto-create}", isAutoCreate() ? "true" : "false");
filters.put("${auto-delete}", autoDelete ? "true" : "false");
if (jdbc) {
noAutoTune = true;
context.out.println();
printStar("Copy a jar containing the JDBC Driver '" + jdbcClassName + "' into " + directory.getAbsolutePath() + "/lib");
context.out.println();
}
performAutoTune(filters, journalType, dataFolder);
writeEtc(ETC_BROKER_XML, etcFolder, filters, false);
writeEtc(ETC_ARTEMIS_USERS_PROPERTIES, etcFolder, filters, false);
// we want this variable to remain unchanged so that it will use the value set in the profile
if (SecurityManagerType.getType(securityManager) == SecurityManagerType.BASIC) {
filters.put("${security-manager-settings}", readTextFile(ETC_BASIC_SECURITY_MANAGER_TXT, filters));
} else {
filters.put("${security-manager-settings}", readTextFile(ETC_JAAS_SECURITY_MANAGER_TXT, filters));
}
writeEtc(ETC_BOOTSTRAP_XML, etcFolder, filters, false);
writeEtc(ETC_MANAGEMENT_XML, etcFolder, filters, false);
if (relaxJolokia) {
filters.put("${jolokia.options}", "<!-- option relax-jolokia used, so strict-checking will be removed here -->");
} else {
filters.put("${jolokia.options}", "<!-- Check for the proper origin on the server side, too -->\n" +
" <strict-checking/>");
}
writeEtc(ETC_JOLOKIA_ACCESS_XML, etcFolder, filters, false);
context.out.println("");
context.out.println("You can now start the broker by executing: ");
context.out.println("");
context.out.println(String.format(" \"%s\" run", path(new File(directory, "bin/artemis"))));
File service = new File(directory, BIN_ARTEMIS_SERVICE);
context.out.println("");
if (!IS_WINDOWS || IS_CYGWIN) {
context.out.println("Or you can run the broker in the background using:");
context.out.println("");
context.out.println(String.format(" \"%s\" start", path(service)));
context.out.println("");
}
if (IS_WINDOWS) {
service = new File(directory, BIN_ARTEMIS_SERVICE_EXE);
context.out.println("Or you can setup the broker as Windows service and run it in the background:");
context.out.println("");
context.out.println(String.format(" \"%s\" install", path(service)));
context.out.println(String.format(" \"%s\" start", path(service)));
context.out.println("");
context.out.println(" To stop the windows service:");
context.out.println(String.format(" \"%s\" stop", path(service)));
context.out.println("");
context.out.println(" To uninstall the windows service");
context.out.println(String.format(" \"%s\" uninstall", path(service)));
}
return null;
}