/* * 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.geode.distributed.internal; import java.io.NotSerializableException; import java.util.HashSet; import java.util.Set; import org.apache.logging.log4j.Logger; import org.apache.geode.distributed.DistributedSystemDisconnectedException; import org.apache.geode.distributed.internal.membership.InternalDistributedMember; import org.apache.geode.distributed.internal.membership.MembershipManager; import org.apache.geode.internal.i18n.LocalizedStrings; import org.apache.geode.internal.logging.LogService; import org.apache.geode.internal.logging.log4j.LocalizedMessage; import org.apache.geode.internal.logging.log4j.LogMarker; /** * To change this generated comment edit the template variable "typecomment": * Window>Preferences>Java>Templates. To enable and disable the creation of type comments go to * Window>Preferences>Java>Code Generation. */ public class DistributionChannel { private static final Logger logger = LogService.getLogger(); private MembershipManager membershipManager; /** * Constructor DistributionChannel for JGroups. * * @param channel jgroups channel */ public DistributionChannel(MembershipManager channel) { membershipManager = channel; } public InternalDistributedMember getLocalAddress() { return membershipManager.getLocalMember(); } /** * @return the MembershipManager */ public MembershipManager getMembershipManager() { return membershipManager; } /** * @return list of recipients who did not receive the message because they left the view (null if * all received it or it was sent to {@link DistributionMessage#ALL_RECIPIENTS}). * @throws NotSerializableException If content cannot be serialized */ public Set send(InternalDistributedMember[] destinations, DistributionMessage content, DistributionManager dm, DistributionStats stats) throws NotSerializableException { if (membershipManager == null) { logger.warn(LocalizedMessage.create( LocalizedStrings.DistributionChannel_ATTEMPTING_A_SEND_TO_A_DISCONNECTED_DISTRIBUTIONMANAGER)); if (destinations.length == 1 && destinations[0] == DistributionMessage.ALL_RECIPIENTS) return null; HashSet result = new HashSet(); for (int i = 0; i < destinations.length; i++) result.add(destinations[i]); return result; } return membershipManager.send(destinations, content, stats); } public void disconnect(boolean duringStartup) { StringBuffer sb = new StringBuffer(); sb.append("Disconnected from distribution channel "); long start = System.currentTimeMillis(); logger.debug("DistributionChannel disconnecting with " + membershipManager + "; duringStartup=" + duringStartup); if (membershipManager != null) { sb.append(membershipManager.getLocalMember()); sb.append(" (took "); long begin = System.currentTimeMillis(); if (duringStartup) { membershipManager.uncleanShutdown("Failed to start distribution", null); } else { membershipManager.shutdown(); } long delta = System.currentTimeMillis() - begin; sb.append(delta); sb.append("/"); } membershipManager = null; if (logger.isTraceEnabled(LogMarker.DM)) { long delta = System.currentTimeMillis() - start; sb.append(delta); sb.append(" ms)"); logger.trace(LogMarker.DM, sb); } } /** * Returns the id of this distribution channel. If this channel uses JavaGroups and the conduit to * communicate with others, then the port of the JavaGroups channel's * {@link InternalDistributedMember address} is returned. * * @since GemFire 3.0 */ public long getId() { MembershipManager mgr = this.membershipManager; if (mgr == null) { throw new DistributedSystemDisconnectedException( LocalizedStrings.DistributionChannel_I_NO_LONGER_HAVE_A_MEMBERSHIP_ID .toLocalizedString()); } InternalDistributedMember moi = mgr.getLocalMember(); if (moi == null) { throw new DistributedSystemDisconnectedException( LocalizedStrings.DistributionChannel_I_NO_LONGER_HAVE_A_MEMBERSHIP_ID.toLocalizedString(), membershipManager.getShutdownCause()); } return moi.getPort(); } public void setShutDown() { // this.shuttingDown = shuttingDown; if (membershipManager != null) membershipManager.setShutdown(); } // private void sendViaJGroups(Serializable[] destinations,Address source,Serializable content, // boolean deliverToSender, int processorType, // DistributionManager dm) // throws ChannelNotConnectedException, ChannelClosedException { // Message msg = new Message(null, source, content); // msg.setDeliverToSender(deliverToSender); // msg.setProcessorType(processorType); // for (int i=0; i < destinations.length; i++) { // Address destination = (Address) destinations[i]; // msg.setDest(destination); // jgroupsChannel.send(msg); // if (destination == null) // break; // } // } }