Search in sources :

Example 41 with Member

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);
            }
        }
    }
}
Also used : Member(org.apache.catalina.tribes.Member) IOException(java.io.IOException) BindException(java.net.BindException) SocketTimeoutException(java.net.SocketTimeoutException)

Example 42 with Member

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;
}
Also used : Member(org.apache.catalina.tribes.Member)

Example 43 with Member

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);
    }
}
Also used : Member(org.apache.catalina.tribes.Member)

Example 44 with Member

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);
    }
}
Also used : UniqueId(org.apache.catalina.tribes.UniqueId) Serializable(java.io.Serializable) ChannelListener(org.apache.catalina.tribes.ChannelListener) ByteMessage(org.apache.catalina.tribes.ByteMessage) Member(org.apache.catalina.tribes.Member) RemoteProcessException(org.apache.catalina.tribes.RemoteProcessException) IOException(java.io.IOException) ExecutionException(java.util.concurrent.ExecutionException) ChannelException(org.apache.catalina.tribes.ChannelException) RemoteProcessException(org.apache.catalina.tribes.RemoteProcessException)

Example 45 with Member

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
}
Also used : ErrorHandler(org.apache.catalina.tribes.ErrorHandler) UniqueId(org.apache.catalina.tribes.UniqueId) Serializable(java.io.Serializable) ChannelException(org.apache.catalina.tribes.ChannelException) Member(org.apache.catalina.tribes.Member) ChannelException(org.apache.catalina.tribes.ChannelException)

Aggregations

Member (org.apache.catalina.tribes.Member)93 ChannelException (org.apache.catalina.tribes.ChannelException)28 FaultyMember (org.apache.catalina.tribes.ChannelException.FaultyMember)17 Test (org.junit.Test)17 IOException (java.io.IOException)16 MemberImpl (org.apache.catalina.tribes.membership.MemberImpl)15 ReceiverBase (org.apache.catalina.tribes.transport.ReceiverBase)11 ArrayList (java.util.ArrayList)10 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)10 UniqueId (org.apache.catalina.tribes.UniqueId)9 Serializable (java.io.Serializable)6 BigDecimal (java.math.BigDecimal)6 DecimalFormat (java.text.DecimalFormat)6 Response (org.apache.catalina.tribes.group.Response)6 ChannelData (org.apache.catalina.tribes.io.ChannelData)6 XByteBuffer (org.apache.catalina.tribes.io.XByteBuffer)6 SelectionKey (java.nio.channels.SelectionKey)4 Selector (java.nio.channels.Selector)4 Membership (org.apache.catalina.tribes.membership.Membership)4 StaticMember (org.apache.catalina.tribes.membership.StaticMember)4