由于activemq版本不同,因此配置方式也是多种,下面以activemq5.13+为例说明配置步骤及java连接broker
1、修改bin的env配置文件,此文件是全局变量的配置文件。配置JAVA_HOME及开启Jmx需可以在此处进行配置,更新如下配置
# ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.port=11099"
# ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.password.file=${ACTIVEMQ_CONF}/jmx.password"
# ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.access.file=${ACTIVEMQ_CONF}/jmx.access"
# ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.ssl=false"
ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote"
替换为如下配置
ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.port=11099"
ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.password.file=${ACTIVEMQ_CONF}/jmx.password"
ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.access.file=${ACTIVEMQ_CONF}/jmx.access"
ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.ssl=false"
ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Djava.rmi.server.hostname=本机IP"
注意-Djava.rmi.server.hostname=本地ip,如果不加此配置,那么在通过jmx连接,会出现类似localhost连接拒绝的异常。例如 java.lang.RuntimeException: java.rmi.ConnectException: Connection refused to host: 127.0.1.1。可以尝试不添加此属性,通过java连接看看是什么样子的提示。
2、如果使用指定路径的jdk,那么同样修改env文件,将如下配置
JAVACMD="auto"
替换为
JAVACMD="/xxx/jdk1.8.0_60/bin/java"
即可。
3、修改confi/activemq.xml,开启jmx支持,在broker节点上添加useJmx="true",配置如下
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}" useJmx="true">
4、对jmx.access、jmx.password文件进行权限更新,执行如下命令
chmod 600 conf/jmx.*
如果不执行权限更新,那通过activemq restart启动,通过 ps -ef | grep activemq 是查询不到运行的activemq服务,而且也没有任何提示信息,因为activemq restart是后台启动程序,如果想要查看启动过程中的日志信息只能执行
activemq console
如果文件未授权,那么会出现如下提示
Error: Password file read access must be restricted: /opt/activemq/conf/jmx.password
通过上面4步,activemq的jmx已经开启,通过jconsole可以直接连接使用,但是灵活性比较局限,下面通过java连接,主要逻辑是查询所有queue并删除没有消费者的队列,代码如下:
import org.apache.activemq.broker.jmx.BrokerViewMBean;
import org.apache.activemq.broker.jmx.QueueViewMBean;
import org.junit.Test;
import javax.management.MBeanServerConnection;
import javax.management.MBeanServerInvocationHandler;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import java.util.*;
/**
* jmx操作activemq队列
* @author zc.ding
* @create 2018/11/12
*/
public class TestJmx {
@Test
public void delQueue() throws Exception{
Map<String, String[]> env = new HashMap<>();
String url = "service:jmx:rmi:///jndi/rmi://192.168.1.248:1616/jmxrmi";
String[] credentials = new String[] {"admin", "activemq"};
env.put(JMXConnector.CREDENTIALS, credentials);
JMXServiceURL urls = new JMXServiceURL(url);
JMXConnector connector = JMXConnectorFactory.connect(urls,env);
connector.connect();
MBeanServerConnection conn = connector.getMBeanServerConnection();
//这里brokerName的b要小写,大写会报错
ObjectName name = new ObjectName("org.apache.activemq:brokerName=localhost,type=Broker");
BrokerViewMBean mBean = (BrokerViewMBean) MBeanServerInvocationHandler.newProxyInstance(conn, name, BrokerViewMBean.class, true);
//获取点对点的队列mBean.getTopics() 获取订阅模式的队列
List<String> delList = new ArrayList<>();
for(ObjectName na : mBean.getQueues()){
QueueViewMBean queueBean = (QueueViewMBean)
MBeanServerInvocationHandler.newProxyInstance(conn, na, QueueViewMBean.class, true);
System.out.println("******************************");
System.out.println("队列的名称:"+queueBean.getName());
System.out.println("\t队列中消息数:"+queueBean.getQueueSize());
System.out.println("\t消费者数:"+queueBean.getConsumerCount());
System.out.println("\t出队列的数量:"+queueBean.getDequeueCount());
//删除没有消费者的队列
if(queueBean.getConsumerCount() == 0){
System.out.println("删除队列:" + queueBean.getName());
mBean.removeQueue(queueBean.getName());
}
}
}
}
至此,activemq开始jmx配置结束。good luck!