Search in sources :

Example 1 with ByteMessage

use of org.apache.catalina.tribes.ByteMessage in project tomcat by apache.

the class GroupChannel method send.

/**
     *
     * @param destination Member[] - destination.length > 0
     * @param msg Serializable - the message to send
     * @param options sender options, options can trigger guarantee levels and different
     *                interceptors to react to the message see class documentation for the
     *                <code>Channel</code> object.<br>
     * @param handler - callback object for error handling and completion notification,
     *                  used when a message is sent asynchronously using the
     *                  <code>Channel.SEND_OPTIONS_ASYNCHRONOUS</code> flag enabled.
     * @return UniqueId - the unique Id that was assigned to this message
     * @throws ChannelException - if an error occurs processing the message
     * @see org.apache.catalina.tribes.Channel
     */
@Override
public UniqueId send(Member[] destination, Serializable msg, int options, ErrorHandler handler) throws ChannelException {
    if (msg == null)
        throw new ChannelException(sm.getString("groupChannel.nullMessage"));
    XByteBuffer buffer = null;
    try {
        if (destination == null || destination.length == 0) {
            throw new ChannelException(sm.getString("groupChannel.noDestination"));
        }
        //generates a unique Id
        ChannelData data = new ChannelData(true);
        data.setAddress(getLocalMember(false));
        data.setTimestamp(System.currentTimeMillis());
        byte[] b = null;
        if (msg instanceof ByteMessage) {
            b = ((ByteMessage) msg).getMessage();
            options = options | SEND_OPTIONS_BYTE_MESSAGE;
        } else {
            b = XByteBuffer.serialize(msg);
            options = options & (~SEND_OPTIONS_BYTE_MESSAGE);
        }
        data.setOptions(options);
        //XByteBuffer buffer = new XByteBuffer(b.length+128,false);
        buffer = BufferPool.getBufferPool().getBuffer(b.length + 128, false);
        buffer.append(b, 0, b.length);
        data.setMessage(buffer);
        InterceptorPayload payload = null;
        if (handler != null) {
            payload = new InterceptorPayload();
            payload.setErrorHandler(handler);
        }
        getFirstInterceptor().sendMessage(destination, data, payload);
        if (Logs.MESSAGES.isTraceEnabled()) {
            Logs.MESSAGES.trace("GroupChannel - Sent msg:" + new UniqueId(data.getUniqueId()) + " at " + new java.sql.Timestamp(System.currentTimeMillis()) + " to " + Arrays.toNameString(destination));
            Logs.MESSAGES.trace("GroupChannel - Send Message:" + new UniqueId(data.getUniqueId()) + " is " + msg);
        }
        return new UniqueId(data.getUniqueId());
    } catch (Exception x) {
        if (x instanceof ChannelException)
            throw (ChannelException) x;
        throw new ChannelException(x);
    } finally {
        if (buffer != null)
            BufferPool.getBufferPool().returnBuffer(buffer);
    }
}
Also used : UniqueId(org.apache.catalina.tribes.UniqueId) XByteBuffer(org.apache.catalina.tribes.io.XByteBuffer) ChannelData(org.apache.catalina.tribes.io.ChannelData) ByteMessage(org.apache.catalina.tribes.ByteMessage) RemoteProcessException(org.apache.catalina.tribes.RemoteProcessException) ChannelException(org.apache.catalina.tribes.ChannelException) ChannelException(org.apache.catalina.tribes.ChannelException)

Example 2 with ByteMessage

use of org.apache.catalina.tribes.ByteMessage 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 (int i = 0; i < channelListeners.size(); i++) {
            ChannelListener channelListener = channelListeners.get(i);
            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("Exception:" + x.getMessage(), x);
    }
}
Also used : UniqueId(org.apache.catalina.tribes.UniqueId) Serializable(java.io.Serializable) ChannelListener(org.apache.catalina.tribes.ChannelListener) RemoteProcessException(org.apache.catalina.tribes.RemoteProcessException) ChannelException(org.apache.catalina.tribes.ChannelException) RemoteProcessException(org.apache.catalina.tribes.RemoteProcessException) ByteMessage(org.apache.catalina.tribes.ByteMessage) Member(org.apache.catalina.tribes.Member)

Example 3 with ByteMessage

use of org.apache.catalina.tribes.ByteMessage in project tomcat by apache.

the class TestTcpFailureDetector method testTcpMcastFail.

@Test
public void testTcpMcastFail() throws Exception {
    System.out.println("testTcpMcastFail()");
    clear();
    channel1.start(Channel.DEFAULT);
    channel2.start(Channel.DEFAULT);
    //Thread.sleep(1000);
    assertEquals("Expecting member count to be equal", mbrlist1.members.size(), mbrlist2.members.size());
    channel2.stop(Channel.MBR_TX_SEQ);
    ByteMessage msg = new ByteMessage(new byte[1024]);
    try {
        Thread.sleep(5000);
        assertEquals("Expecting member count to be equal", mbrlist1.members.size(), mbrlist2.members.size());
        channel1.send(channel1.getMembers(), msg, 0);
    } catch (ChannelException x) {
        fail("Message send should have succeeded.");
    }
    channel1.stop(Channel.DEFAULT);
    channel2.stop(Channel.DEFAULT);
}
Also used : ByteMessage(org.apache.catalina.tribes.ByteMessage) ChannelException(org.apache.catalina.tribes.ChannelException) Test(org.junit.Test)

Example 4 with ByteMessage

use of org.apache.catalina.tribes.ByteMessage in project tomcat by apache.

the class TestTcpFailureDetector method testTcpSendFailureMemberDrop.

@Test
public void testTcpSendFailureMemberDrop() throws Exception {
    System.out.println("testTcpSendFailureMemberDrop()");
    clear();
    channel1.start(Channel.DEFAULT);
    channel2.start(Channel.DEFAULT);
    //Thread.sleep(1000);
    assertEquals("Expecting member count to be equal", mbrlist1.members.size(), mbrlist2.members.size());
    channel2.stop(Channel.SND_RX_SEQ);
    ByteMessage msg = new ByteMessage(new byte[1024]);
    try {
        channel1.send(channel1.getMembers(), msg, 0);
        fail("Message send should have failed.");
    } catch (ChannelException x) {
    // Ignore
    }
    assertEquals("Expecting member count to not be equal", mbrlist1.members.size() + 1, mbrlist2.members.size());
    channel1.stop(Channel.DEFAULT);
    channel2.stop(Channel.DEFAULT);
}
Also used : ByteMessage(org.apache.catalina.tribes.ByteMessage) ChannelException(org.apache.catalina.tribes.ChannelException) Test(org.junit.Test)

Aggregations

ByteMessage (org.apache.catalina.tribes.ByteMessage)4 ChannelException (org.apache.catalina.tribes.ChannelException)4 RemoteProcessException (org.apache.catalina.tribes.RemoteProcessException)2 UniqueId (org.apache.catalina.tribes.UniqueId)2 Test (org.junit.Test)2 Serializable (java.io.Serializable)1 ChannelListener (org.apache.catalina.tribes.ChannelListener)1 Member (org.apache.catalina.tribes.Member)1 ChannelData (org.apache.catalina.tribes.io.ChannelData)1 XByteBuffer (org.apache.catalina.tribes.io.XByteBuffer)1