Search in sources :

Example 1 with ChannelMessage

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

the class FragmentationInterceptor method frag.

public void frag(Member[] destination, ChannelMessage msg, InterceptorPayload payload) throws ChannelException {
    int size = msg.getMessage().getLength();
    int count = ((size / maxSize) + (size % maxSize == 0 ? 0 : 1));
    ChannelMessage[] messages = new ChannelMessage[count];
    int remaining = size;
    for (int i = 0; i < count; i++) {
        ChannelMessage tmp = (ChannelMessage) msg.clone();
        int offset = (i * maxSize);
        int length = Math.min(remaining, maxSize);
        tmp.getMessage().clear();
        tmp.getMessage().append(msg.getMessage().getBytesDirect(), offset, length);
        //add the msg nr
        //tmp.getMessage().append(XByteBuffer.toBytes(i),0,4);
        tmp.getMessage().append(i);
        //add the total nr of messages
        //tmp.getMessage().append(XByteBuffer.toBytes(count),0,4);
        tmp.getMessage().append(count);
        //add true as the frag flag
        //byte[] flag = XByteBuffer.toBytes(true);
        //tmp.getMessage().append(flag,0,flag.length);
        tmp.getMessage().append(true);
        messages[i] = tmp;
        remaining -= length;
    }
    for (int i = 0; i < messages.length; i++) {
        super.sendMessage(destination, messages[i], payload);
    }
}
Also used : ChannelMessage(org.apache.catalina.tribes.ChannelMessage)

Example 2 with ChannelMessage

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

the class FragmentationInterceptor method defrag.

public void defrag(ChannelMessage msg) {
    FragKey key = new FragKey(msg.getUniqueId());
    FragCollection coll = getFragCollection(key, msg);
    coll.addMessage((ChannelMessage) msg.deepclone());
    if (coll.complete()) {
        removeFragCollection(key);
        ChannelMessage complete = coll.assemble();
        super.messageReceived(complete);
    }
}
Also used : ChannelMessage(org.apache.catalina.tribes.ChannelMessage)

Example 3 with ChannelMessage

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

the class TwoPhaseCommitInterceptor method sendMessage.

@Override
public void sendMessage(Member[] destination, ChannelMessage msg, InterceptorPayload payload) throws ChannelException {
    //and just send one message
    if (okToProcess(msg.getOptions())) {
        super.sendMessage(destination, msg, null);
        ChannelMessage confirmation = null;
        if (deepclone)
            confirmation = (ChannelMessage) msg.deepclone();
        else
            confirmation = (ChannelMessage) msg.clone();
        confirmation.getMessage().reset();
        UUIDGenerator.randomUUID(false, confirmation.getUniqueId(), 0);
        confirmation.getMessage().append(START_DATA, 0, START_DATA.length);
        confirmation.getMessage().append(msg.getUniqueId(), 0, msg.getUniqueId().length);
        confirmation.getMessage().append(END_DATA, 0, END_DATA.length);
        super.sendMessage(destination, confirmation, payload);
    } else {
        //turn off two phase commit
        //this wont work if the interceptor has 0 as a flag
        //since there is no flag to turn off
        //msg.setOptions(msg.getOptions() & (~getOptionFlag()));
        super.sendMessage(destination, msg, payload);
    }
}
Also used : ChannelMessage(org.apache.catalina.tribes.ChannelMessage)

Example 4 with ChannelMessage

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

the class ObjectReader method execute.

/**
     * Send buffer to cluster listener (callback).
     * Is message complete receiver send message to callback?
     *
     * @see org.apache.catalina.tribes.transport.ReceiverBase#messageDataReceived(ChannelMessage)
     * @see XByteBuffer#doesPackageExist()
     * @see XByteBuffer#extractPackage(boolean)
     *
     * @return number of received packages/messages
     */
public ChannelMessage[] execute() {
    int pkgCnt = buffer.countPackages();
    ChannelMessage[] result = new ChannelMessage[pkgCnt];
    for (int i = 0; i < pkgCnt; i++) {
        ChannelMessage data = buffer.extractPackage(true);
        result[i] = data;
    }
    return result;
}
Also used : ChannelMessage(org.apache.catalina.tribes.ChannelMessage)

Example 5 with ChannelMessage

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

the class NioReplicationTask method drainChannel.

/**
     * The actual code which drains the channel associated with
     * the given key.  This method assumes the key has been
     * modified prior to invocation to turn off selection
     * interest in OP_READ.  When this method completes it
     * re-enables OP_READ and calls wakeup() on the selector
     * so the selector will resume watching this channel.
     * @param key The key to process
     * @param reader The reader
     * @throws Exception IO error
     */
protected void drainChannel(final SelectionKey key, ObjectReader reader) throws Exception {
    reader.access();
    ReadableByteChannel channel = (ReadableByteChannel) key.channel();
    int count = -1;
    // make buffer empty
    buffer.clear();
    SocketAddress saddr = null;
    if (channel instanceof SocketChannel) {
        // loop while data available, channel is non-blocking
        while ((count = channel.read(buffer)) > 0) {
            // make buffer readable
            buffer.flip();
            if (buffer.hasArray())
                reader.append(buffer.array(), 0, count, false);
            else
                reader.append(buffer, count, false);
            // make buffer empty
            buffer.clear();
            //do we have at least one package?
            if (reader.hasPackage())
                break;
        }
    } else if (channel instanceof DatagramChannel) {
        DatagramChannel dchannel = (DatagramChannel) channel;
        saddr = dchannel.receive(buffer);
        // make buffer readable
        buffer.flip();
        if (buffer.hasArray())
            reader.append(buffer.array(), 0, buffer.limit() - buffer.position(), false);
        else
            reader.append(buffer, buffer.limit() - buffer.position(), false);
        // make buffer empty
        buffer.clear();
        //did we get a package
        count = reader.hasPackage() ? 1 : -1;
    }
    int pkgcnt = reader.count();
    if (count < 0 && pkgcnt == 0) {
        //end of stream, and no more packages to process
        remoteEof(key);
        return;
    }
    ChannelMessage[] msgs = pkgcnt == 0 ? ChannelData.EMPTY_DATA_ARRAY : reader.execute();
    //register to read new data, before we send it off to avoid dead locks
    registerForRead(key, reader);
    for (int i = 0; i < msgs.length; i++) {
        /**
             * Use send ack here if you want to ack the request to the remote
             * server before completing the request
             * This is considered an asynchronous request
             */
        if (ChannelData.sendAckAsync(msgs[i].getOptions()))
            sendAck(key, (WritableByteChannel) channel, Constants.ACK_COMMAND, saddr);
        try {
            if (Logs.MESSAGES.isTraceEnabled()) {
                try {
                    Logs.MESSAGES.trace("NioReplicationThread - Received msg:" + new UniqueId(msgs[i].getUniqueId()) + " at " + new java.sql.Timestamp(System.currentTimeMillis()));
                } catch (Throwable t) {
                }
            }
            //process the message
            getCallback().messageDataReceived(msgs[i]);
            /**
                 * Use send ack here if you want the request to complete on this
                 * server before sending the ack to the remote server
                 * This is considered a synchronized request
                 */
            if (ChannelData.sendAckSync(msgs[i].getOptions()))
                sendAck(key, (WritableByteChannel) channel, Constants.ACK_COMMAND, saddr);
        } catch (RemoteProcessException e) {
            if (log.isDebugEnabled())
                log.error(sm.getString("nioReplicationTask.process.clusterMsg.failed"), e);
            if (ChannelData.sendAckSync(msgs[i].getOptions()))
                sendAck(key, (WritableByteChannel) channel, Constants.FAIL_ACK_COMMAND, saddr);
        } catch (Exception e) {
            log.error(sm.getString("nioReplicationTask.process.clusterMsg.failed"), e);
            if (ChannelData.sendAckSync(msgs[i].getOptions()))
                sendAck(key, (WritableByteChannel) channel, Constants.FAIL_ACK_COMMAND, saddr);
        }
        if (getUseBufferPool()) {
            BufferPool.getBufferPool().returnBuffer(msgs[i].getMessage());
            msgs[i].setMessage(null);
        }
    }
    if (count < 0) {
        remoteEof(key);
        return;
    }
}
Also used : ReadableByteChannel(java.nio.channels.ReadableByteChannel) SocketChannel(java.nio.channels.SocketChannel) UniqueId(org.apache.catalina.tribes.UniqueId) DatagramChannel(java.nio.channels.DatagramChannel) WritableByteChannel(java.nio.channels.WritableByteChannel) RemoteProcessException(org.apache.catalina.tribes.RemoteProcessException) CancelledKeyException(java.nio.channels.CancelledKeyException) IOException(java.io.IOException) ChannelMessage(org.apache.catalina.tribes.ChannelMessage) RemoteProcessException(org.apache.catalina.tribes.RemoteProcessException) SocketAddress(java.net.SocketAddress)

Aggregations

ChannelMessage (org.apache.catalina.tribes.ChannelMessage)5 IOException (java.io.IOException)1 SocketAddress (java.net.SocketAddress)1 CancelledKeyException (java.nio.channels.CancelledKeyException)1 DatagramChannel (java.nio.channels.DatagramChannel)1 ReadableByteChannel (java.nio.channels.ReadableByteChannel)1 SocketChannel (java.nio.channels.SocketChannel)1 WritableByteChannel (java.nio.channels.WritableByteChannel)1 RemoteProcessException (org.apache.catalina.tribes.RemoteProcessException)1 UniqueId (org.apache.catalina.tribes.UniqueId)1