This procedure describes how to install ActiveMQ and configure it for use with the meshIQ Platform.
- Recommended to download the ActiveMQ 6.2.28 component from https://activemq.apache.org/components/classic/download/ and copy the package to the following directory:
$APIN_HOME/actmq
or
Use the ActiveMQ setup provided with the Deployment Pack. -
Extract the downloaded package using the following command
tar -zxvf apache-activemq-6.2.28.tar.gz
-
A new directory
apache-activemq-6.2.28folder is created. - Open the extracted directory and edit the
activemq.xmlproperties located in the$APIN_HOME/actmq/actmq-xxx/conf/ Click here to view ActiveMQ configuration settings.
Add or verify the following properties:
<!-- 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. --> <!-- START SNIPPET: example --> <beans xmlns="http://www.springframework.org/schema/beans" 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.xsd http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd"> <!-- Allows us to use system properties as variables in this configuration file --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <value>file:${activemq.conf}/credentials.properties</value> </property> </bean> <!-- The <broker> element is used to configure the ActiveMQ broker. --> <broker xmlns="http://activemq.apache.org/schema/core" brokerName="JKMessageBus" dataDirectory="${activemq.data}" schedulePeriodForDestinationPurge="300000"> <destinationPolicy> <policyMap> <policyEntries> <policyEntry topic=">" > <!-- The constantPendingMessageLimitStrategy is used to prevent slow topic consumers to block producers and affect other consumers by limiting the number of messages that are retained For more information, see: http://activemq.apache.org/slow-consumer-handling.html --> <pendingMessageLimitStrategy> <constantPendingMessageLimitStrategy limit="1000"/> </pendingMessageLimitStrategy> </policyEntry> <!-- Delete client result queues that are no longer used (inactive for 2 minutes) --> <policyEntry queue="jkool.client.>" gcInactiveDestinations="true" inactiveTimoutBeforeGC="120000" sendAdvisoryIfNoConsumers="true"/> </policyEntries> </policyMap> </destinationPolicy> <!-- The managementContext is used to configure how ActiveMQ is exposed in JMX. By default, ActiveMQ uses the MBean server that is started by the JVM. For more information, see: http://activemq.apache.org/jmx.html --> <managementContext> <managementContext createConnector="false"/> </managementContext> <!-- Configure message persistence for the broker. The default persistence mechanism is the KahaDB store (identified by the kahaDB tag). For more information, see: http://activemq.apache.org/persistence.html --> <persistenceAdapter> <kahaDB directory="${activemq.data}/kahadb"/> </persistenceAdapter> <!-- The systemUsage controls the maximum amount of space the broker will use before disabling caching and/or slowing down producers. For more information, see: http://activemq.apache.org/producer-flow-control.html --> <systemUsage> <systemUsage> <memoryUsage> <memoryUsage percentOfJvmHeap="70" /> </memoryUsage> <storeUsage> <storeUsage limit="100 gb"/> </storeUsage> <tempUsage> <tempUsage limit="50 gb"/> </tempUsage> </systemUsage> </systemUsage> <!-- The transport connectors expose ActiveMQ over a given protocol to clients and other brokers. For more information, see: http://activemq.apache.org/configuring-transports.html --> <transportConnectors> <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB --> <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> </transportConnectors> <!-- destroy the spring context on shutdown to stop jetty --> <shutdownHooks> <bean xmlns="http://www.springframework.org/schema/beans" class="org.apache.activemq.hooks.SpringContextHook" /> </shutdownHooks> </broker> <!-- Enable web consoles, REST and Ajax APIs and demos The web consoles requires by default login, you can disable this in the jetty.xml file Take a look at ${ACTIVEMQ_HOME}/conf/jetty.xml for more details --> <import resource="jetty.xml"/> </beans> <!-- END SNIPPET: example -->
- Verify that the
<broker>element includes the following property:schedulePeriodForDestinationPurge="300000"
-
Within the
<destinationPolicy>section, verify that the following policy entry exists:<policyEntry queue="jkool.client.>" gcInactiveDestinations="true" inactiveTimoutBeforeGC="120000" sendAdvisoryIfNoConsumers="true"/>
-
To enable remote access to the ActiveMQ Web Console, edit the following file. It must run on a local machine. Restore the "host" value for bean "jettyPort" from "127.0.0.1" back to "0.0.0.0" in the
jetty.xmlfile found in the following path$APIN_HOME/actmq/current/conf/jetty.xml:Click here to view jetty configuration settings
Add or verify the following properties:
<!-- 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. --> <!-- An embedded servlet engine for serving up the Admin consoles, REST and Ajax APIs and some demos Include this file in your configuration to enable ActiveMQ web components e.g. <import resource="jetty.xml"/> --> <beans xmlns="http://www.springframework.org/schema/beans" 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.xsd"> <bean id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration"> <property name="sendServerVersion" value="false"/> </bean> <bean id="jaasLoginService" class="org.eclipse.jetty.jaas.JAASLoginService"> <property name="name" value="ActiveMQRealm"/> <property name="loginModuleName" value="activemq"/> <property name="roleClassNames"> <list> <value>org.apache.activemq.jaas.GroupPrincipal</value> </list> </property> </bean> <bean id="identityService" class="org.eclipse.jetty.security.DefaultIdentityService"/> <bean id="securityConstraint" class="org.eclipse.jetty.util.security.Constraint"> <property name="name" value="BASIC"/> <property name="roles" value="users,admins"/> <!-- set authenticate=false to disable login --> <property name="authenticate" value="true"/> </bean> <bean id="adminSecurityConstraint" class="org.eclipse.jetty.util.security.Constraint"> <property name="name" value="BASIC"/> <property name="roles" value="admins"/> <!-- set authenticate=false to disable login --> <property name="authenticate" value="true"/> </bean> <bean id="securityConstraintMapping" class="org.eclipse.jetty.security.ConstraintMapping"> <property name="constraint" ref="securityConstraint"/> <property name="pathSpec" value="/"/> </bean> <bean id="adminSecurityConstraintMapping" class="org.eclipse.jetty.security.ConstraintMapping"> <property name="constraint" ref="adminSecurityConstraint"/> <property name="pathSpec" value="*.action"/> </bean> <bean id="rewriteHandler" class="org.eclipse.jetty.rewrite.handler.RewriteHandler"> <property name="rules"> <list> <bean id="header" class="org.eclipse.jetty.rewrite.handler.HeaderPatternRule"> <property name="pattern" value="*"/> <property name="name" value="X-FRAME-OPTIONS"/> <property name="value" value="SAMEORIGIN"/> </bean> <bean id="header" class="org.eclipse.jetty.rewrite.handler.HeaderPatternRule"> <property name="pattern" value="*"/> <property name="name" value="X-XSS-Protection"/> <property name="value" value="1; mode=block"/> </bean> <bean id="header" class="org.eclipse.jetty.rewrite.handler.HeaderPatternRule"> <property name="pattern" value="*"/> <property name="name" value="X-Content-Type-Options"/> <property name="value" value="nosniff"/> </bean> <bean id="header" class="org.eclipse.jetty.rewrite.handler.HeaderPatternRule"> <property name="pattern" value="*"/> <property name="name" value="Cache-Control"/> <property name="value" value="no-store"/> </bean> <bean id="header" class="org.eclipse.jetty.rewrite.handler.HeaderPatternRule"> <property name="pattern" value="*"/> <property name="name" value="Content-Security-Policy"/> <property name="value" value="style-src-elem 'self'; style-src 'self'; img-src 'self'; script-src-elem 'self'; default-src 'none'; object-src 'none'; frame-ancestors 'none'; base-uri 'none';"/> </bean> <!-- More relaxed rules to allow browsers to properly render XML --> <bean id="header" class="org.eclipse.jetty.rewrite.handler.HeaderPatternRule"> <property name="pattern" value="/admin/xml/*"/> <property name="name" value="Content-Security-Policy"/> <property name="value" value="style-src-elem 'self' 'unsafe-inline'; style-src 'self'; img-src 'self' data:; script-src-elem 'self'; default-src 'none'; object-src 'none'; frame-ancestors 'none'; base-uri 'none';"/> </bean> </list> </property> </bean> <bean id="secHandlerCollection" class="org.eclipse.jetty.server.handler.HandlerCollection"> <property name="handlers"> <list> <ref bean="rewriteHandler"/> <bean class="org.eclipse.jetty.webapp.WebAppContext"> <property name="contextPath" value="/admin"/> <property name="resourceBase" value="${activemq.home}/webapps/admin"/> <property name="logUrlOnStart" value="true"/> </bean> <bean class="org.eclipse.jetty.webapp.WebAppContext"> <property name="contextPath" value="/api"/> <property name="resourceBase" value="${activemq.home}/webapps/api"/> <property name="logUrlOnStart" value="true"/> </bean> <bean class="org.eclipse.jetty.server.handler.ResourceHandler"> <property name="directoriesListed" value="false"/> <property name="welcomeFiles"> <list> <value>index.html</value> </list> </property> <property name="resourceBase" value="${activemq.home}/webapps/"/> </bean> <bean id="defaultHandler" class="org.eclipse.jetty.server.handler.DefaultHandler"> <property name="serveIcon" value="false"/> </bean> </list> </property> </bean> <bean id="securityHandler" class="org.eclipse.jetty.security.ConstraintSecurityHandler"> <property name="identityService" ref="identityService"/> <property name="loginService" ref="jaasLoginService"/> <property name="authenticator"> <bean class="org.eclipse.jetty.security.authentication.BasicAuthenticator"/> </property> <property name="constraintMappings"> <list> <ref bean="adminSecurityConstraintMapping"/> <ref bean="securityConstraintMapping"/> </list> </property> <property name="handler" ref="secHandlerCollection"/> </bean> <bean id="contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection"> </bean> <bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start"> <!-- the default port number for the web console --> <property name="host" value="0.0.0.0"/> <property name="port" value="8161"/> </bean> <bean id="Server" depends-on="jettyPort" class="org.eclipse.jetty.server.Server" destroy-method="stop"> <property name="handler"> <bean id="handlers" class="org.eclipse.jetty.server.handler.HandlerCollection"> <property name="handlers"> <list> <ref bean="contexts"/> <ref bean="securityHandler"/> </list> </property> </bean> </property> </bean> <bean id="invokeConnectors" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="targetObject" ref="Server"/> <property name="targetMethod" value="setConnectors"/> <property name="arguments"> <list> <bean id="Connector" class="org.eclipse.jetty.server.ServerConnector"> <constructor-arg ref="Server"/> <constructor-arg> <list> <bean id="httpConnectionFactory" class="org.eclipse.jetty.server.HttpConnectionFactory"> <constructor-arg ref="httpConfig"/> </bean> </list> </constructor-arg> <!-- see the jettyPort bean --> <property name="host" value="#{systemProperties['jetty.host']}"/> <property name="port" value="#{systemProperties['jetty.port']}"/> </bean> <!-- Enable this connector if you wish to use https with web console --> <!-- bean id="SecureConnector" class="org.eclipse.jetty.server.ServerConnector"> <constructor-arg ref="Server" /> <constructor-arg> <bean id="handlers" class="org.eclipse.jetty.util.ssl.SslContextFactory$Server"> <property name="keyStorePath" value="${activemq.conf}/broker.ks" /> <property name="keyStorePassword" value="password" /> </bean> </constructor-arg> <property name="port" value="8162" /> </bean --> </list> </property> </bean> <bean id="configureJetty" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="staticMethod" value="org.apache.activemq.web.config.JspConfigurer.configureJetty"/> <property name="arguments"> <list> <ref bean="Server"/> <ref bean="secHandlerCollection"/> </list> </property> </bean> <bean id="invokeStart" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" depends-on="configureJetty, invokeConnectors"> <property name="targetObject" ref="Server"/> <property name="targetMethod" value="start"/> </bean> </beans> -
Link the current version using the command:
ln -s apache-activemq-6.2.28 current
-
Update the ActiveMQ path in
$APIN_HOME/sbin/apin_env.shas follows:export ACTIVEMQ_HOME=`realpath $APIN_HOME/actmq/current`
- After the installation, restart the ActiveMQ service in
$APIN_HOME/actmqusing the command./start.sh mq.