All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jgroups.util.AckCollector Maven / Gradle / Ivy

Go to download

This artifact provides a single jar that contains all classes required to use remote EJB and JMS, including all dependencies. It is intended for use by those not using maven, maven users should just import the EJB and JMS BOM's instead (shaded JAR's cause lots of problems with maven, as it is very easy to inadvertently end up with different versions on classes on the class path).

There is a newer version: 33.0.2.Final
Show newest version
package org.jgroups.util;

import org.jgroups.Address;
import org.jgroups.TimeoutException;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 * Collects acks from a number of nodes, waits for all acks. Can also be time bounded
 * @author Bela Ban
 */
public class AckCollector {
    /** List of members from whom we haven't received an ACK yet */
    protected final List
missing_acks; protected final Promise all_acks_received=new Promise<>(); protected final List
suspected_mbrs=new ArrayList<>(5); protected int expected_acks; public AckCollector() { missing_acks=new ArrayList<>(); expected_acks=0; } public AckCollector(Collection
members) { missing_acks=new ArrayList<>(members != null? members.size() : 10); addAll(members); } public AckCollector(Address ... members) { missing_acks=new ArrayList<>(members != null? members.length : 10); addAll(members); } public synchronized void reset(Collection
members) { suspected_mbrs.clear(); missing_acks.clear(); addAll(members); all_acks_received.reset(); } public synchronized void destroy() { suspected_mbrs.clear(); missing_acks.clear(); expected_acks=0; all_acks_received.setResult(null); } public synchronized int size() { return missing_acks.size(); } public synchronized int expectedAcks() { return expected_acks; } public synchronized void ack(Address member) { if(member != null && missing_acks.remove(member) && missing_acks.isEmpty()) all_acks_received.setResult(Boolean.TRUE); } public synchronized void suspect(Address member) { if(member == null) return; if(!suspected_mbrs.contains(member)) suspected_mbrs.add(member); ack(member); } public boolean retainAll(Collection
members) { if(members == null) return false; boolean retval=false; synchronized(this) { suspected_mbrs.retainAll(members); if((retval=missing_acks.retainAll(members)) && missing_acks.isEmpty()) all_acks_received.setResult(Boolean.TRUE); } return retval; } public boolean waitForAllAcks() { if(missing_acks.isEmpty()) return true; Boolean result=all_acks_received.getResult(); return result != null && result; } public boolean waitForAllAcks(long timeout) throws TimeoutException { if(missing_acks.isEmpty()) return true; Boolean result=all_acks_received.getResultWithTimeout(timeout); return result != null && result; } public String toString() { return suspected_mbrs.isEmpty() ? printMissing() : printMissing() + " (suspected: " + printSuspected() + ")"; } public synchronized String printMissing() { return Util.printListWithDelimiter(missing_acks, ", "); } public synchronized String printSuspected() { return Util.printListWithDelimiter(suspected_mbrs, ", "); } protected synchronized void addAll(Address ... members) { if(members == null) return; for(Address member: members) if(member != null && !missing_acks.contains(member)) missing_acks.add(member); expected_acks=missing_acks.size(); } protected synchronized void addAll(Collection
members) { if(members == null) return; for(Address member: members) if(member != null && !missing_acks.contains(member)) missing_acks.add(member); expected_acks=missing_acks.size(); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy