activemq配置jmx

由于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!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值