package com.didapinche.service.client; import com.alibaba.rocketmq.client.exception.MQClientException; import com.alibaba.rocketmq.client.impl.MQClientAPIImpl; import com.alibaba.rocketmq.client.impl.factory.MQClientInstance; import com.alibaba.rocketmq.remoting.RemotingClient; import com.alibaba.rocketmq.tools.admin.DefaultMQAdminExt; import com.alibaba.rocketmq.tools.admin.DefaultMQAdminExtImpl; import com.alibaba.rocketmq.tools.admin.MQAdminExt; import com.didapinche.util.joor.Reflect; /** * Created by tangjie on 2016/11/18. */ public class MQAdminInstance { private static final ThreadLocal<DefaultMQAdminExt> mqAdminExtThreadLocal = new ThreadLocal<DefaultMQAdminExt>(); private static final ThreadLocal<Integer> initCounter = new ThreadLocal<Integer>(); public static MQAdminExt threadLocalMQAdminExt() { DefaultMQAdminExt defaultMQAdminExt = mqAdminExtThreadLocal.get(); if (defaultMQAdminExt == null) { throw new IllegalStateException("defaultMQAdminExt should be init before you get this"); } return defaultMQAdminExt; } /** * 使用反射获取到DefaultMQAdminExt中的RemotingCommand * * @return */ public static RemotingClient threadLocalRemotingClient() { DefaultMQAdminExtImpl defaultMQAdminExtImpl = Reflect.on(MQAdminInstance.threadLocalMQAdminExt()).get("defaultMQAdminExtImpl"); MQClientInstance mqClientInstance = Reflect.on(defaultMQAdminExtImpl).get("mqClientInstance"); MQClientAPIImpl mQClientAPIImpl = Reflect.on(mqClientInstance).get("mQClientAPIImpl"); return Reflect.on(mQClientAPIImpl).get("remotingClient"); } public static void initMQAdminInstance() throws MQClientException { Integer nowCount = initCounter.get(); if (nowCount == null) { DefaultMQAdminExt defaultMQAdminExt = new DefaultMQAdminExt(); defaultMQAdminExt.setInstanceName(Long.toString(System.currentTimeMillis())); defaultMQAdminExt.start(); mqAdminExtThreadLocal.set(defaultMQAdminExt); initCounter.set(1); } else { initCounter.set(nowCount + 1); } } public static void destroyMQAdminInstance() { Integer nowCount = initCounter.get() - 1; if (nowCount > 0) { initCounter.set(nowCount); return; } MQAdminExt mqAdminExt = mqAdminExtThreadLocal.get(); if (mqAdminExt != null) { mqAdminExt.shutdown(); mqAdminExtThreadLocal.remove(); initCounter.remove(); } } }