/** * Starts up the channel. This can be called multiple times for individual services to start The * svc parameter can be the logical or value of any constants * * @param svc int value of <br> * DEFAULT - will start all services <br> * MBR_RX_SEQ - starts the membership receiver <br> * MBR_TX_SEQ - starts the membership broadcaster <br> * SND_TX_SEQ - starts the replication transmitter<br> * SND_RX_SEQ - starts the replication receiver<br> * @throws ChannelException if a startup error occurs or the service is already started. */ protected synchronized void internalStart(int svc) throws ChannelException { try { boolean valid = false; // make sure we don't pass down any flags that are unrelated to the bottom layer svc = svc & Channel.DEFAULT; if (startLevel == Channel.DEFAULT) return; // we have already started up all components if (svc == 0) return; // nothing to start if (svc == (svc & startLevel)) { throw new ChannelException( sm.getString("channelCoordinator.alreadyStarted", Integer.toString(svc))); } // must start the receiver first so that we can coordinate the port it // listens to with the local membership settings if (Channel.SND_RX_SEQ == (svc & Channel.SND_RX_SEQ)) { clusterReceiver.setMessageListener(this); clusterReceiver.start(); // synchronize, big time FIXME membershipService.setLocalMemberProperties( getClusterReceiver().getHost(), getClusterReceiver().getPort(), getClusterReceiver().getSecurePort(), getClusterReceiver().getUdpPort()); valid = true; } if (Channel.SND_TX_SEQ == (svc & Channel.SND_TX_SEQ)) { clusterSender.start(); valid = true; } if (Channel.MBR_RX_SEQ == (svc & Channel.MBR_RX_SEQ)) { membershipService.setMembershipListener(this); if (membershipService instanceof McastService) { ((McastService) membershipService).setMessageListener(this); } membershipService.start(MembershipService.MBR_RX); valid = true; } if (Channel.MBR_TX_SEQ == (svc & Channel.MBR_TX_SEQ)) { membershipService.start(MembershipService.MBR_TX); valid = true; } if (!valid) { throw new IllegalArgumentException(sm.getString("channelCoordinator.invalid.startLevel")); } startLevel = (startLevel | svc); } catch (ChannelException cx) { throw cx; } catch (Exception x) { throw new ChannelException(x); } }
/** * Send a message to one or more members in the cluster * * @param destination Member[] - the destinations, null or zero length means all * @param msg ClusterMessage - the message to send * @param payload TBA */ @Override public void sendMessage(Member[] destination, ChannelMessage msg, InterceptorPayload payload) throws ChannelException { if (destination == null) destination = membershipService.getMembers(); if ((msg.getOptions() & Channel.SEND_OPTIONS_MULTICAST) == Channel.SEND_OPTIONS_MULTICAST) { membershipService.broadcast(msg); } else { clusterSender.sendMessage(msg, destination); } if (Logs.MESSAGES.isTraceEnabled()) { Logs.MESSAGES.trace( "ChannelCoordinator - Sent msg:" + new UniqueId(msg.getUniqueId()) + " at " + new java.sql.Timestamp(System.currentTimeMillis()) + " to " + Arrays.toNameString(destination)); } }
/** * Shuts down the channel. This can be called multiple times for individual services to shutdown * The svc parameter can be the logical or value of any constants * * @param svc int value of <br> * DEFAULT - will shutdown all services <br> * MBR_RX_SEQ - starts the membership receiver <br> * MBR_TX_SEQ - starts the membership broadcaster <br> * SND_TX_SEQ - starts the replication transmitter<br> * SND_RX_SEQ - starts the replication receiver<br> * @throws ChannelException if a startup error occurs or the service is already started. */ protected synchronized void internalStop(int svc) throws ChannelException { try { // make sure we don't pass down any flags that are unrelated to the bottom layer svc = svc & Channel.DEFAULT; if (startLevel == 0) return; // we have already stopped up all components if (svc == 0) return; // nothing to stop boolean valid = false; if (Channel.SND_RX_SEQ == (svc & Channel.SND_RX_SEQ)) { clusterReceiver.stop(); clusterReceiver.setMessageListener(null); valid = true; } if (Channel.SND_TX_SEQ == (svc & Channel.SND_TX_SEQ)) { clusterSender.stop(); valid = true; } if (Channel.MBR_RX_SEQ == (svc & Channel.MBR_RX_SEQ)) { membershipService.stop(MembershipService.MBR_RX); membershipService.setMembershipListener(null); valid = true; } if (Channel.MBR_TX_SEQ == (svc & Channel.MBR_TX_SEQ)) { valid = true; membershipService.stop(MembershipService.MBR_TX); } if (!valid) { throw new IllegalArgumentException(sm.getString("channelCoordinator.invalid.startLevel")); } startLevel = (startLevel & (~svc)); } catch (Exception x) { throw new ChannelException(x); } }
@Override public void heartbeat() { if (clusterSender != null) clusterSender.heartbeat(); super.heartbeat(); }