Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
This artifact provides a single jar that contains all classes required to use remote Jakarta Enterprise Beans and Jakarta Messaging, including
all dependencies. It is intended for use by those not using maven, maven users should just import the Jakarta Enterprise Beans and
Jakarta Messaging 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).
package org.jgroups.stack;
import org.jgroups.Event;
import org.jgroups.JChannel;
import org.jgroups.Message;
import org.jgroups.annotations.ManagedOperation;
import org.jgroups.annotations.Property;
import org.jgroups.conf.ClassConfigurator;
import org.jgroups.logging.Log;
import org.jgroups.logging.LogFactory;
import org.jgroups.protocols.TP;
import org.jgroups.util.MessageBatch;
import org.jgroups.util.SocketFactory;
import org.jgroups.util.ThreadFactory;
import org.jgroups.util.Util;
import org.w3c.dom.Node;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
* The Protocol class provides a set of common services for protocol layers. Each layer has to
* be a subclass of Protocol and override a number of methods (typically just {@code up()},
* {@code down()} and {@code getName()}. Layers are stacked in a certain order to form
* a protocol stack. Events are passed from lower
* layers to upper ones and vice versa. E.g. a Message received by the UDP layer at the bottom
* will be passed to its higher layer as an Event. That layer will in turn pass the Event to
* its layer and so on, until a layer handles the Message and sends a response or discards it,
* the former resulting in another Event being passed down the stack.
*
* The important thing to bear in mind is that Events have to
* be passed on between layers in FIFO order which is guaranteed by the Protocol implementation
* and must be guaranteed by subclasses implementing their on Event queuing.
* Note that each class implementing interface Protocol MUST provide an empty, public
* constructor !
*
* @author Bela Ban
*/
public abstract class Protocol {
protected Protocol up_prot, down_prot;
protected ProtocolStack stack;
@Property(description="Determines whether to collect statistics (and expose them via JMX). Default is true")
protected boolean stats=true;
@Property(description="Enables ergonomics: dynamically find the best values for properties at runtime")
protected boolean ergonomics=true;
@Property(description="Fully qualified name of a class implementing ProtocolHook, will be called after creation of " +
"the protocol (before init())",writable=false)
protected String after_creation_hook;
@Property(description="Give the protocol a different ID if needed so we can have multiple " +
"instances of it in the same stack",writable=false)
protected short id=ClassConfigurator.getProtocolId(getClass());
protected final Log log=LogFactory.getLog(this.getClass());
/**
* Sets the level of a logger. This method is used to dynamically change the logging level of a running system,
* e.g. via JMX. The appender of a level needs to exist.
* @param level The new level. Valid values are "fatal", "error", "warn", "info", "debug", "trace"
* (capitalization not relevant)
*/
public T setLevel(String level) {log.setLevel(level); return (T)this;}
@Property(name="level", description="logger level (see javadocs)")
public String getLevel() {return log.getLevel();}
public T level(String level) {return setLevel(level);}
public boolean isErgonomics() {return ergonomics;}
public T setErgonomics(boolean ergonomics) {this.ergonomics=ergonomics; return (T)this;}
public ProtocolStack getProtocolStack() {return stack;}
public boolean statsEnabled() {return stats;}
public void enableStats(boolean flag) {stats=flag;}
public String getName() {return getClass().getSimpleName();}
public short getId() {return id;}
public T setId(short id) {this.id=id; return (T)this;}
public T getUpProtocol() {return (T)up_prot;}
public T getDownProtocol() {return (T)down_prot;}
public T setUpProtocol(Protocol prot) {this.up_prot=prot; return (T)this;}
public T setDownProtocol(Protocol prot) {this.down_prot=prot; return (T)this;}
public T setProtocolStack(ProtocolStack s) {this.stack=s; return (T)this;}
public String afterCreationHook() {return after_creation_hook;}
public Log getLog() {return log;}
public Object getValue(String name) {
if(name == null) return null;
Field field=Util.getField(getClass(), name);
if(field == null)
throw new IllegalArgumentException("field \"" + name + "\n not found");
return Util.getField(field, this);
}
public T setValue(String name, Object value) {
if(name == null || value == null)
return (T)this;
Field field=Util.getField(getClass(), name);
if(field == null)
throw new IllegalArgumentException("field " + name + " not found");
Property prop=field.getAnnotation(Property.class);
if(prop != null) {
String deprecated_msg=prop.deprecatedMessage();
if(deprecated_msg != null && !deprecated_msg.isEmpty())
log.warn("Field " + getName() + "." + name + " is deprecated: " + deprecated_msg);
}
Util.setField(field, this, value);
return (T)this;
}
/**
* Resolves and applies the specified properties to this protocol.
* @param properties a map of property string values
* @return this protocol
* @throws Exception if any of the specified properties are unresolvable or unrecognized.
*/
public T setProperties(Map properties) throws Exception {
// These Configurator methods are destructive, so make a defensive copy
Map copy = new HashMap<>(properties);
Configurator.removeDeprecatedProperties(this, copy);
Configurator.resolveAndAssignFields(this, copy);
Configurator.resolveAndInvokePropertyMethods(this, copy);
List