/** * 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. */ package org.apache.activemq.artemis.api.core.jgroups; import java.util.HashMap; import java.util.Map; import org.apache.activemq.artemis.api.core.JGroupsBroadcastEndpoint; import org.jboss.logging.Logger; /** * This class maintain a global Map of JChannels wrapped in JChannelWrapper for * the purpose of reference counting. * * Wherever a JChannel is needed it should only get it by calling the getChannel() * method of this class. The real disconnect of channels are also done here only. */ public class JChannelManager { private static final JChannelManager theInstance = new JChannelManager(); public static JChannelManager getInstance() { return theInstance; } private JChannelManager() { } public synchronized JChannelManager clear() { for (JChannelWrapper wrapper : channels.values()) { wrapper.closeChannel(); } channels.clear(); setLoopbackMessages(false); return this; } // if true, messages will be loopbacked // this is useful for testcases using a single channel. private boolean loopbackMessages = false; private final Logger logger = Logger.getLogger(JChannelManager.class); private static final Map<String, JChannelWrapper> channels = new HashMap<>(); public boolean isLoopbackMessages() { return loopbackMessages; } public JChannelManager setLoopbackMessages(boolean loopbackMessages) { this.loopbackMessages = loopbackMessages; return this; } public synchronized JChannelWrapper getJChannel(String channelName, JGroupsBroadcastEndpoint endpoint) throws Exception { JChannelWrapper wrapper = channels.get(channelName); if (wrapper == null) { wrapper = new JChannelWrapper(this, channelName, endpoint.createChannel()); channels.put(channelName, wrapper); if (logger.isTraceEnabled()) logger.trace("Put Channel " + channelName); return wrapper; } if (logger.isTraceEnabled()) logger.trace("Add Ref Count " + channelName); return wrapper.addRef(); } public synchronized void removeChannel(String channelName) { channels.remove(channelName); } }