|
Axis 2 example source code file (AckManager.java)
The Axis 2 AckManager.java source code/* * 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.axis2.clustering.tribes; import org.apache.axis2.clustering.ClusteringFault; import org.apache.axis2.clustering.context.ContextClusteringCommand; import org.apache.catalina.tribes.Member; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.util.ArrayList; import java.util.Hashtable; import java.util.List; import java.util.Map; import java.util.Vector; /** * */ public final class AckManager { private static Log log = LogFactory.getLog(AckManager.class); private static Map messageAckTable = new Hashtable(); public static void addInitialAcknowledgement(ContextClusteringCommand command) { messageAckTable.put(command.getUniqueId(), new MessageACK(command)); } public static void addAcknowledgement(String messageUniqueId, String memberId) { MessageACK ack = (MessageACK) messageAckTable.get(messageUniqueId); if (ack != null) { if (!ack.hasACKed(memberId)) { // If the member has not already ACKed ack.addACK(memberId); } } } public static boolean isMessageAcknowledged(String messageUniqueId, ChannelSender sender) throws ClusteringFault { boolean isAcknowledged = false; MessageACK ack = (MessageACK) messageAckTable.get(messageUniqueId); // Check that all members in the memberList are same as the total member list, // which will indicate that all members have ACKed the message Member[] members = sender.getChannel().getMembers(); if (members.length == 0) { isAcknowledged = true; } else { for (int i = 0; i < members.length; i++) { Member member = members[i]; String memberHost = TribesUtil.getHost(member); if (member.isReady() && !ack.hasACKed(memberHost)) { log.debug("[NO ACK] from member " + memberHost); // If a new member joined the cluster recently, // we need to retransmit the message to this member, if an ACK has not been // received from this member. We retransmit only once. if (member.getMemberAliveTime() < 5000 && !ack.isRestransmittedToMember(memberHost)) { // TODO: Check sender.sendToMember(ack.getCommand(), member); log.debug("Retransimitting msg " + ack.getCommand().getUniqueId() + " to member " + memberHost); } isAcknowledged = false; break; } else { isAcknowledged = true; } } } // If a message is ACKed, we don't have to keep track of it in our ackTbl anymore if (isAcknowledged) { messageAckTable.remove(messageUniqueId); } return isAcknowledged; } private static class MessageACK { private ContextClusteringCommand command; private List memberList = new Vector(); private List retransmittedList = new ArrayList(); public MessageACK(ContextClusteringCommand command) { this.command = command; } public void addACK(String memberId) { memberList.add(memberId); } public ContextClusteringCommand getCommand() { return command; } public boolean hasACKed(String memberId) { return memberList.contains(memberId); } public void addToRestransmittedList(String memberId) { retransmittedList.add(memberId); } public boolean isRestransmittedToMember(String memberId) { return retransmittedList.contains(memberId); } } } Other Axis 2 examples (source code examples)Here is a short list of links related to this Axis 2 AckManager.java source code file: |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.