use of org.apache.catalina.tribes.Member in project tomcat by apache.
the class McastServiceImpl method checkExpired.
protected void checkExpired() {
synchronized (expiredMutex) {
Member[] expired = membership.expire(timeToExpiration);
for (final Member member : expired) {
if (log.isDebugEnabled()) {
log.debug("Mcast expire member " + member);
}
try {
Runnable t = () -> {
String name = Thread.currentThread().getName();
try {
Thread.currentThread().setName("Membership-MemberExpired");
service.memberDisappeared(member);
} finally {
Thread.currentThread().setName(name);
}
};
executor.execute(t);
} catch (Exception x) {
log.error(sm.getString("mcastServiceImpl.memberDisappeared.failed"), x);
}
}
}
}
use of org.apache.catalina.tribes.Member in project tomcat by apache.
the class OrderInterceptor method processIncoming.
/**
* @param order MessageOrder
* @return boolean - true if a message expired and was processed
*/
protected boolean processIncoming(MessageOrder order) {
boolean result = false;
Member member = order.getMessage().getAddress();
Counter cnt = getInCounter(member);
MessageOrder tmp = incoming.get(member);
if (tmp != null) {
order = MessageOrder.add(tmp, order);
}
while ((order != null) && (order.getMsgNr() <= cnt.getCounter())) {
// we are right on target. process orders
if (order.getMsgNr() == cnt.getCounter()) {
cnt.inc();
} else if (order.getMsgNr() > cnt.getCounter()) {
cnt.setCounter(order.getMsgNr());
}
super.messageReceived(order.getMessage());
order.setMessage(null);
order = order.next;
}
MessageOrder head = order;
MessageOrder prev = null;
tmp = order;
// flag to empty out the queue when it larger than maxQueue
boolean empty = order != null ? order.getCount() >= maxQueue : false;
while (tmp != null) {
// process expired messages or empty out the queue
if (tmp.isExpired(expire) || empty) {
// reset the head
if (tmp == head) {
head = tmp.next;
}
cnt.setCounter(tmp.getMsgNr() + 1);
if (getForwardExpired()) {
super.messageReceived(tmp.getMessage());
}
tmp.setMessage(null);
tmp = tmp.next;
if (prev != null) {
prev.next = tmp;
}
result = true;
} else {
prev = tmp;
tmp = tmp.next;
}
}
if (head == null) {
incoming.remove(member);
} else {
incoming.put(member, head);
}
return result;
}
use of org.apache.catalina.tribes.Member in project tomcat by apache.
the class CloudMembershipProvider method heartbeat.
@Override
public void heartbeat() {
Member[] announcedMembers = fetchMembers();
// Add new members or refresh the members in the membership
for (Member member : announcedMembers) {
updateMember(member, true);
}
// Remove non refreshed members from the membership
Member[] expired = membership.expire(expirationTime);
for (Member member : expired) {
updateMember(member, false);
}
}
use of org.apache.catalina.tribes.Member in project tomcat by apache.
the class GroupChannel method messageReceived.
/**
* Callback from the interceptor stack. <br>
* When a message is received from a remote node, this method will be
* invoked by the previous interceptor.<br>
* This method can also be used to send a message to other components
* within the same application, but its an extreme case, and you're probably
* better off doing that logic between the applications itself.
* @param msg ChannelMessage
*/
@Override
public void messageReceived(ChannelMessage msg) {
if (msg == null) {
return;
}
try {
if (Logs.MESSAGES.isTraceEnabled()) {
Logs.MESSAGES.trace("GroupChannel - Received msg:" + new UniqueId(msg.getUniqueId()) + " at " + new java.sql.Timestamp(System.currentTimeMillis()) + " from " + msg.getAddress().getName());
}
Serializable fwd = null;
if ((msg.getOptions() & SEND_OPTIONS_BYTE_MESSAGE) == SEND_OPTIONS_BYTE_MESSAGE) {
fwd = new ByteMessage(msg.getMessage().getBytes());
} else {
try {
fwd = XByteBuffer.deserialize(msg.getMessage().getBytesDirect(), 0, msg.getMessage().getLength());
} catch (Exception sx) {
log.error(sm.getString("groupChannel.unable.deserialize", msg), sx);
return;
}
}
if (Logs.MESSAGES.isTraceEnabled()) {
Logs.MESSAGES.trace("GroupChannel - Receive Message:" + new UniqueId(msg.getUniqueId()) + " is " + fwd);
}
// get the actual member with the correct alive time
Member source = msg.getAddress();
boolean rx = false;
boolean delivered = false;
for (ChannelListener channelListener : channelListeners) {
if (channelListener != null && channelListener.accept(fwd, source)) {
channelListener.messageReceived(fwd, source);
delivered = true;
// is responsible for returning the reply, otherwise we send an absence reply
if (channelListener instanceof RpcChannel) {
rx = true;
}
}
}
// for
if ((!rx) && (fwd instanceof RpcMessage)) {
// if we have a message that requires a response,
// but none was given, send back an immediate one
sendNoRpcChannelReply((RpcMessage) fwd, source);
}
if (Logs.MESSAGES.isTraceEnabled()) {
Logs.MESSAGES.trace("GroupChannel delivered[" + delivered + "] id:" + new UniqueId(msg.getUniqueId()));
}
} catch (Exception x) {
// as a warning.
if (log.isWarnEnabled()) {
log.warn(sm.getString("groupChannel.receiving.error"), x);
}
throw new RemoteProcessException(sm.getString("groupChannel.receiving.error"), x);
}
}
use of org.apache.catalina.tribes.Member in project tomcat by apache.
the class RpcChannel method messageReceived.
@Override
public void messageReceived(Serializable msg, Member sender) {
RpcMessage rmsg = (RpcMessage) msg;
RpcCollectorKey key = new RpcCollectorKey(rmsg.uuid);
if (rmsg.reply) {
RpcCollector collector = responseMap.get(key);
if (collector == null) {
if (!(rmsg instanceof RpcMessage.NoRpcChannelReply)) {
callback.leftOver(rmsg.message, sender);
}
} else {
synchronized (collector) {
// make sure it hasn't been removed
if (responseMap.containsKey(key)) {
if ((rmsg instanceof RpcMessage.NoRpcChannelReply)) {
collector.destcnt--;
} else {
collector.addResponse(rmsg.message, sender);
}
if (collector.isComplete()) {
collector.notifyAll();
}
} else {
if (!(rmsg instanceof RpcMessage.NoRpcChannelReply)) {
callback.leftOver(rmsg.message, sender);
}
}
}
// synchronized
}
// end if
} else {
boolean finished = false;
final ExtendedRpcCallback excallback = (callback instanceof ExtendedRpcCallback) ? ((ExtendedRpcCallback) callback) : null;
boolean asyncReply = ((replyMessageOptions & Channel.SEND_OPTIONS_ASYNCHRONOUS) == Channel.SEND_OPTIONS_ASYNCHRONOUS);
Serializable reply = callback.replyRequest(rmsg.message, sender);
ErrorHandler handler = null;
final Serializable request = msg;
final Serializable response = reply;
final Member fsender = sender;
if (excallback != null && asyncReply) {
handler = new ErrorHandler() {
@Override
public void handleError(ChannelException x, UniqueId id) {
excallback.replyFailed(request, response, fsender, x);
}
@Override
public void handleCompletion(UniqueId id) {
excallback.replySucceeded(request, response, fsender);
}
};
}
rmsg.reply = true;
rmsg.message = reply;
try {
if (handler != null) {
channel.send(new Member[] { sender }, rmsg, replyMessageOptions & ~Channel.SEND_OPTIONS_SYNCHRONIZED_ACK, handler);
} else {
channel.send(new Member[] { sender }, rmsg, replyMessageOptions & ~Channel.SEND_OPTIONS_SYNCHRONIZED_ACK);
}
finished = true;
} catch (Exception x) {
if (excallback != null && !asyncReply) {
excallback.replyFailed(rmsg.message, reply, sender, x);
} else {
log.error(sm.getString("rpcChannel.replyFailed"), x);
}
}
if (finished && excallback != null && !asyncReply) {
excallback.replySucceeded(rmsg.message, reply, sender);
}
}
// end if
}
Aggregations