
org.jgroups.protocols.DROP Maven / Gradle / Ivy
package org.jgroups.protocols;
import org.jgroups.Message;
import org.jgroups.annotations.MBean;
import org.jgroups.stack.Protocol;
import org.jgroups.util.MessageBatch;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
/**
* Protocol which drops up or down messages according to user-defined filters
* @author Bela Ban
* @since 4.0.1
*/
@MBean(description="Drops up or down messages according to user-defined filters")
public class DROP extends Protocol {
protected final List> down_filters=new ArrayList<>(), up_filters=new ArrayList<>();
public DROP addDownFilter(Predicate filter) {
down_filters.add(filter);
return this;
}
public DROP addUpFilter(Predicate filter) {
up_filters.add(filter);
return this;
}
public DROP removeDownFilter(Predicate filter) {
down_filters.remove(filter);
return this;
}
public DROP removeUpFilter(Predicate filter) {
up_filters.remove(filter);
return this;
}
public DROP clearUpFilters() {up_filters.clear(); return this;}
public DROP clearDownFilters() {down_filters.clear(); return this;}
public Object down(Message msg) {
for(Predicate pred: down_filters)
if(pred.test(msg)) {
dropped(msg, true);
return null;
}
return down_prot.down(msg);
}
public Object up(Message msg) {
for(Predicate pred: up_filters)
if(pred.test(msg)) {
dropped(msg, false);
return null;
}
return up_prot.up(msg);
}
public void up(MessageBatch batch) {
for(Message msg: batch) {
for(Predicate pred: up_filters) {
if(pred.test(msg)) {
dropped(msg, false);
batch.remove(msg);
break;
}
}
}
if(!batch.isEmpty())
up_prot.up(batch);
}
protected void dropped(Message msg, boolean down) {
log.trace("dropped msg %s hdrs: %s\n", down? "to " + msg.dest() : "from " + msg.src(), msg.printHeaders());
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy