You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by re...@apache.org on 2020/04/29 15:03:58 UTC
[tomcat] branch master updated: Remove java.io based sender and
receiver
This is an automated email from the ASF dual-hosted git repository.
remm pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/master by this push:
new c1bbb10 Remove java.io based sender and receiver
c1bbb10 is described below
commit c1bbb10e73a110bafbf311017540dcdb4f53ec58
Author: remm <re...@apache.org>
AuthorDate: Wed Apr 29 17:03:41 2020 +0200
Remove java.io based sender and receiver
It's unlikely they are still used as they were not the default
configuration.
---
.../catalina/tribes/transport/bio/BioReceiver.java | 154 -----------
.../tribes/transport/bio/BioReplicationTask.java | 189 --------------
.../catalina/tribes/transport/bio/BioSender.java | 281 ---------------------
.../tribes/transport/bio/LocalStrings.properties | 40 ---
.../transport/bio/LocalStrings_cs.properties | 22 --
.../transport/bio/LocalStrings_de.properties | 18 --
.../transport/bio/LocalStrings_es.properties | 27 --
.../transport/bio/LocalStrings_fr.properties | 40 ---
.../transport/bio/LocalStrings_ja.properties | 40 ---
.../transport/bio/LocalStrings_ko.properties | 40 ---
.../transport/bio/LocalStrings_pt_BR.properties | 18 --
.../transport/bio/LocalStrings_ru.properties | 16 --
.../tribes/transport/bio/MultipointBioSender.java | 156 ------------
.../tribes/transport/bio/PooledMultiSender.java | 62 -----
webapps/docs/changelog.xml | 4 +
webapps/docs/config/cluster-receiver.xml | 14 +-
webapps/docs/config/cluster-sender.xml | 11 +-
17 files changed, 12 insertions(+), 1120 deletions(-)
diff --git a/java/org/apache/catalina/tribes/transport/bio/BioReceiver.java b/java/org/apache/catalina/tribes/transport/bio/BioReceiver.java
deleted file mode 100644
index 3214ab5..0000000
--- a/java/org/apache/catalina/tribes/transport/bio/BioReceiver.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.catalina.tribes.transport.bio;
-
-import java.io.IOException;
-import java.net.ServerSocket;
-import java.net.Socket;
-
-import org.apache.catalina.tribes.io.ObjectReader;
-import org.apache.catalina.tribes.transport.AbstractRxTask;
-import org.apache.catalina.tribes.transport.ReceiverBase;
-import org.apache.catalina.tribes.transport.RxTaskPool;
-import org.apache.catalina.tribes.util.StringManager;
-import org.apache.juli.logging.Log;
-import org.apache.juli.logging.LogFactory;
-
-public class BioReceiver extends ReceiverBase implements Runnable {
-
- private static final Log log = LogFactory.getLog(BioReceiver.class);
-
- protected static final StringManager sm = StringManager.getManager(BioReceiver.class);
-
- protected ServerSocket serverSocket;
-
- public BioReceiver() {
- // NO-OP
- }
-
- @Override
- public void start() throws IOException {
- super.start();
- try {
- setPool(new RxTaskPool(getMaxThreads(),getMinThreads(),this));
- } catch (Exception x) {
- log.fatal(sm.getString("bioReceiver.threadpool.fail"), x);
- if ( x instanceof IOException ) throw (IOException)x;
- else throw new IOException(x.getMessage());
- }
- try {
- getBind();
- bind();
- String channelName = "";
- if (getChannel().getName() != null) channelName = "[" + getChannel().getName() + "]";
- Thread t = new Thread(this, "BioReceiver" + channelName);
- t.setDaemon(true);
- t.start();
- } catch (Exception x) {
- log.fatal(sm.getString("bioReceiver.start.fail"), x);
- if ( x instanceof IOException ) throw (IOException)x;
- else throw new IOException(x.getMessage());
- }
- }
-
- @Override
- public AbstractRxTask createRxTask() {
- return getReplicationThread();
- }
-
- protected BioReplicationTask getReplicationThread() {
- BioReplicationTask result = new BioReplicationTask(this);
- result.setOptions(getWorkerThreadOptions());
- result.setUseBufferPool(this.getUseBufferPool());
- return result;
- }
-
- @Override
- public void stop() {
- setListen(false);
- try {
- this.serverSocket.close();
- } catch (Exception x) {
- if (log.isDebugEnabled()) {
- log.debug(sm.getString("bioReceiver.socket.closeFailed"), x);
- }
- }
- super.stop();
- }
-
-
- protected void bind() throws IOException {
- // allocate an unbound server socket channel
- serverSocket = new ServerSocket();
- // set the port the server channel will listen to
- //serverSocket.bind(new InetSocketAddress(getBind(), getTcpListenPort()));
- bind(serverSocket,getPort(),getAutoBind());
- }
-
-
- @Override
- public void run() {
- try {
- listen();
- } catch (Exception x) {
- log.error(sm.getString("bioReceiver.run.fail"), x);
- }
- }
-
- public void listen() throws Exception {
- if (doListen()) {
- log.warn(sm.getString("bioReceiver.already.started"));
- return;
- }
- setListen(true);
-
- while ( doListen() ) {
- Socket socket = null;
- if ( getTaskPool().available() < 1 ) {
- if ( log.isWarnEnabled() )
- log.warn(sm.getString("bioReceiver.threads.busy"));
- }
- BioReplicationTask task = (BioReplicationTask)getTaskPool().getRxTask();
- if ( task == null ) continue; //should never happen
- try {
- socket = serverSocket.accept();
- }catch ( Exception x ) {
- if ( doListen() ) throw x;
- }
- if ( !doListen() ) {
- task.serviceSocket(null,null);
- getExecutor().execute(task);
- task.close();
- break; //regular shutdown
- }
- if ( socket == null ) continue;
- socket.setReceiveBufferSize(getRxBufSize());
- socket.setSendBufferSize(getTxBufSize());
- socket.setTcpNoDelay(getTcpNoDelay());
- socket.setKeepAlive(getSoKeepAlive());
- socket.setOOBInline(getOoBInline());
- socket.setReuseAddress(getSoReuseAddress());
- socket.setSoLinger(getSoLingerOn(),getSoLingerTime());
- socket.setSoTimeout(getTimeout());
- ObjectReader reader = new ObjectReader(socket);
- task.serviceSocket(socket,reader);
- getExecutor().execute(task);
- }//while
- }
-
-
-}
\ No newline at end of file
diff --git a/java/org/apache/catalina/tribes/transport/bio/BioReplicationTask.java b/java/org/apache/catalina/tribes/transport/bio/BioReplicationTask.java
deleted file mode 100644
index d35ee65..0000000
--- a/java/org/apache/catalina/tribes/transport/bio/BioReplicationTask.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.catalina.tribes.transport.bio;
-
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.Socket;
-
-import org.apache.catalina.tribes.ChannelMessage;
-import org.apache.catalina.tribes.io.BufferPool;
-import org.apache.catalina.tribes.io.ChannelData;
-import org.apache.catalina.tribes.io.ListenCallback;
-import org.apache.catalina.tribes.io.ObjectReader;
-import org.apache.catalina.tribes.transport.AbstractRxTask;
-import org.apache.catalina.tribes.transport.Constants;
-import org.apache.catalina.tribes.util.StringManager;
-import org.apache.juli.logging.Log;
-import org.apache.juli.logging.LogFactory;
-
-/**
- * A worker thread class which can drain channels and echo-back the input. Each
- * instance is constructed with a reference to the owning thread pool object.
- * When started, the thread loops forever waiting to be awakened to service the
- * channel associated with a SelectionKey object. The worker is tasked by
- * calling its serviceChannel() method with a SelectionKey object. The
- * serviceChannel() method stores the key reference in the thread object then
- * calls notify() to wake it up. When the channel has been drained, the worker
- * thread returns itself to its parent pool.
- */
-public class BioReplicationTask extends AbstractRxTask {
-
- private static final Log log = LogFactory.getLog(BioReplicationTask.class);
-
- protected static final StringManager sm = StringManager.getManager(BioReplicationTask.class);
-
- protected Socket socket;
- protected ObjectReader reader;
-
- public BioReplicationTask (ListenCallback callback) {
- super(callback);
- }
-
- // loop forever waiting for work to do
- @Override
- public synchronized void run()
- {
- if ( socket == null ) return;
- try {
- drainSocket();
- } catch ( Exception x ) {
- log.error(sm.getString("bioReplicationTask.unable.service"), x);
- }finally {
- try {
- socket.close();
- }catch (Exception e) {
- if (log.isDebugEnabled()) {
- log.debug(sm.getString("bioReplicationTask.socket.closeFailed"), e);
- }
- }
- try {
- reader.close();
- }catch (Exception e) {
- if (log.isDebugEnabled()) {
- log.debug(sm.getString("bioReplicationTask.reader.closeFailed"), e);
- }
- }
- reader = null;
- socket = null;
- }
- // done, ready for more, return to pool
- if ( getTaskPool() != null ) getTaskPool().returnWorker (this);
- }
-
-
- public synchronized void serviceSocket(Socket socket, ObjectReader reader) {
- this.socket = socket;
- this.reader = reader;
- }
-
- protected void execute(ObjectReader reader) throws Exception{
- int pkgcnt = reader.count();
-
- if ( pkgcnt > 0 ) {
- ChannelMessage[] msgs = reader.execute();
- 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(Constants.ACK_COMMAND);
- try {
- //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(Constants.ACK_COMMAND);
- }catch ( Exception x ) {
- if (ChannelData.sendAckSync(msgs[i].getOptions())) sendAck(Constants.FAIL_ACK_COMMAND);
- log.error(sm.getString("bioReplicationTask.messageDataReceived.error"),x);
- }
- if ( getUseBufferPool() ) {
- BufferPool.getBufferPool().returnBuffer(msgs[i].getMessage());
- msgs[i].setMessage(null);
- }
- }
- }
-
-
- }
-
- /**
- * 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.
- * @throws Exception IO exception or execute exception
- */
- protected void drainSocket() throws Exception {
- InputStream in = socket.getInputStream();
- // loop while data available, channel is non-blocking
- byte[] buf = new byte[1024];
- int length = in.read(buf);
- while ( length >= 0 ) {
- int count = reader.append(buf,0,length,true);
- if ( count > 0 ) execute(reader);
- length = in.read(buf);
- }
- }
-
-
- /**
- * Send a reply-acknowledgment (6,2,3)
- * @param command The command to write
- */
- protected void sendAck(byte[] command) {
- try {
- OutputStream out = socket.getOutputStream();
- out.write(command);
- out.flush();
- if (log.isTraceEnabled()) {
- log.trace("ACK sent to " + socket.getPort());
- }
- } catch ( java.io.IOException x ) {
- log.warn(sm.getString("bioReplicationTask.unable.sendAck", x.getMessage()));
- }
- }
-
- @Override
- public void close() {
- try {
- socket.close();
- }catch (Exception e) {
- if (log.isDebugEnabled()) {
- log.debug(sm.getString("bioReplicationTask.socket.closeFailed"), e);
- }
- }
- try {
- reader.close();
- }catch (Exception e) {
- if (log.isDebugEnabled()) {
- log.debug(sm.getString("bioReplicationTask.reader.closeFailed"), e);
- }
- }
- reader = null;
- socket = null;
- super.close();
- }
-}
diff --git a/java/org/apache/catalina/tribes/transport/bio/BioSender.java b/java/org/apache/catalina/tribes/transport/bio/BioSender.java
deleted file mode 100644
index 756e1eb..0000000
--- a/java/org/apache/catalina/tribes/transport/bio/BioSender.java
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.catalina.tribes.transport.bio;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.InetSocketAddress;
-import java.net.Socket;
-import java.util.Arrays;
-
-import org.apache.catalina.tribes.RemoteProcessException;
-import org.apache.catalina.tribes.io.XByteBuffer;
-import org.apache.catalina.tribes.transport.AbstractSender;
-import org.apache.catalina.tribes.transport.Constants;
-import org.apache.catalina.tribes.transport.SenderState;
-import org.apache.catalina.tribes.util.StringManager;
-import org.apache.juli.logging.Log;
-import org.apache.juli.logging.LogFactory;
-
-/**
- * Send cluster messages with only one socket. Ack and keep Alive Handling is
- * supported
- *
- * @author Peter Rossbach
- * @since 5.5.16
- */
-public class BioSender extends AbstractSender {
-
- private static final Log log = LogFactory.getLog(BioSender.class);
-
- /**
- * The string manager for this package.
- */
- protected static final StringManager sm = StringManager.getManager(BioSender.class);
-
- // ----------------------------------------------------- Instance Variables
-
- /**
- * current sender socket
- */
- private Socket socket = null;
- private OutputStream soOut = null;
- private InputStream soIn = null;
-
- protected final XByteBuffer ackbuf =
- new XByteBuffer(Constants.ACK_COMMAND.length, true);
-
-
- // ------------------------------------------------------------- Constructor
-
- public BioSender() {
- // NO-OP
- }
-
-
- // --------------------------------------------------------- Public Methods
-
- /**
- * Connect other cluster member receiver
- * @see org.apache.catalina.tribes.transport.DataSender#connect()
- */
- @Override
- public void connect() throws IOException {
- openSocket();
- }
-
-
- /**
- * disconnect and close socket
- *
- * @see org.apache.catalina.tribes.transport.DataSender#disconnect()
- */
- @Override
- public void disconnect() {
- boolean connect = isConnected();
- closeSocket();
- if (connect) {
- if (log.isDebugEnabled())
- log.debug(sm.getString("bioSender.disconnect", getAddress().getHostAddress(), Integer.valueOf(getPort()), Long.valueOf(0)));
- }
-
- }
-
- /**
- * Send message.
- * @param data The data to send
- * @param waitForAck Wait for an ack
- * @throws IOException An IO error occurred sending the message
- */
- public void sendMessage(byte[] data, boolean waitForAck) throws IOException {
- IOException exception = null;
- setAttempt(0);
- try {
- // first try with existing connection
- pushMessage(data,false,waitForAck);
- } catch (IOException x) {
- SenderState.getSenderState(getDestination()).setSuspect();
- exception = x;
- if (log.isTraceEnabled()) log.trace(sm.getString("bioSender.send.again", getAddress().getHostAddress(),Integer.valueOf(getPort())),x);
- while ( getAttempt()<getMaxRetryAttempts() ) {
- try {
- setAttempt(getAttempt()+1);
- // second try with fresh connection
- pushMessage(data, true,waitForAck);
- exception = null;
- } catch (IOException xx) {
- exception = xx;
- closeSocket();
- }
- }
- } finally {
- setRequestCount(getRequestCount()+1);
- keepalive();
- if ( exception != null ) throw exception;
- }
- }
-
-
- @Override
- public String toString() {
- StringBuilder buf = new StringBuilder("DataSender[(");
- buf.append(super.toString()).append(")");
- buf.append(getAddress()).append(":").append(getPort()).append("]");
- return buf.toString();
- }
-
- // --------------------------------------------------------- Protected Methods
-
- /**
- * Open real socket and set time out when waitForAck is enabled
- * is socket open return directly.
- * @throws IOException Error opening socket
- */
- protected void openSocket() throws IOException {
- if(isConnected()) return ;
- try {
- socket = new Socket();
- InetSocketAddress sockaddr = new InetSocketAddress(getAddress(), getPort());
- socket.connect(sockaddr,(int)getTimeout());
- socket.setSendBufferSize(getTxBufSize());
- socket.setReceiveBufferSize(getRxBufSize());
- socket.setSoTimeout( (int) getTimeout());
- socket.setTcpNoDelay(getTcpNoDelay());
- socket.setKeepAlive(getSoKeepAlive());
- socket.setReuseAddress(getSoReuseAddress());
- socket.setOOBInline(getOoBInline());
- socket.setSoLinger(getSoLingerOn(),getSoLingerTime());
- socket.setTrafficClass(getSoTrafficClass());
- setConnected(true);
- soOut = socket.getOutputStream();
- soIn = socket.getInputStream();
- setRequestCount(0);
- setConnectTime(System.currentTimeMillis());
- if (log.isDebugEnabled())
- log.debug(sm.getString("bioSender.openSocket", getAddress().getHostAddress(), Integer.valueOf(getPort()), Long.valueOf(0)));
- } catch (IOException ex1) {
- SenderState.getSenderState(getDestination()).setSuspect();
- if (log.isDebugEnabled())
- log.debug(sm.getString("bioSender.openSocket.failure",getAddress().getHostAddress(), Integer.valueOf(getPort()), Long.valueOf(0)), ex1);
- throw ex1;
- }
-
- }
-
- /**
- * Close socket.
- *
- * @see #disconnect()
- */
- protected void closeSocket() {
- if(isConnected()) {
- if (socket != null) {
- try {
- socket.close();
- } catch (IOException x) {
- // Ignore
- } finally {
- socket = null;
- soOut = null;
- soIn = null;
- }
- }
- setRequestCount(0);
- setConnected(false);
- if (log.isDebugEnabled())
- log.debug(sm.getString("bioSender.closeSocket",getAddress().getHostAddress(), Integer.valueOf(getPort()), Long.valueOf(0)));
- }
- }
-
- /**
- * Push messages with only one socket at a time
- * Wait for ack is needed and make auto retry when write message is failed.
- * After sending error close and reopen socket again.
- *
- * After successful sending update stats
- *
- * WARNING: Subclasses must be very careful that only one thread call this pushMessage at once!!!
- *
- * @see #closeSocket()
- * @see #openSocket()
- * @see #sendMessage(byte[], boolean)
- *
- * @param data Data to send
- * @param reconnect Do a reconnect (close socket then reopen)
- * @param waitForAck Wait for an acknowledgement
- * @throws IOException IO error writing data
- * @since 5.5.10
- */
-
- protected void pushMessage(byte[] data, boolean reconnect, boolean waitForAck) throws IOException {
- keepalive();
- if ( reconnect ) closeSocket();
- if (!isConnected()) openSocket();
- soOut.write(data);
- soOut.flush();
- if (waitForAck) waitForAck();
- SenderState.getSenderState(getDestination()).setReady();
-
- }
-
- /**
- * Wait for Acknowledgement from other server.
- * FIXME Please, not wait only for three characters, better control that the wait ack message is correct.
- * @throws IOException An IO error occurred
- */
- protected void waitForAck() throws java.io.IOException {
- try {
- boolean ackReceived = false;
- boolean failAckReceived = false;
- ackbuf.clear();
- int bytesRead = 0;
- int i = soIn.read();
- while ((i != -1) && (bytesRead < Constants.ACK_COMMAND.length)) {
- bytesRead++;
- byte d = (byte)i;
- ackbuf.append(d);
- if (ackbuf.doesPackageExist() ) {
- byte[] ackcmd = ackbuf.extractDataPackage(true).getBytes();
- ackReceived = Arrays.equals(ackcmd,org.apache.catalina.tribes.transport.Constants.ACK_DATA);
- failAckReceived = Arrays.equals(ackcmd,org.apache.catalina.tribes.transport.Constants.FAIL_ACK_DATA);
- ackReceived = ackReceived || failAckReceived;
- break;
- }
- i = soIn.read();
- }
- if (!ackReceived) {
- if (i == -1) throw new IOException(sm.getString("bioSender.ack.eof",getAddress(), Integer.valueOf(socket.getLocalPort())));
- else throw new IOException(sm.getString("bioSender.ack.wrong",getAddress(), Integer.valueOf(socket.getLocalPort())));
- } else if ( failAckReceived && getThrowOnFailedAck()) {
- throw new RemoteProcessException(sm.getString("bioSender.fail.AckReceived"));
- }
- } catch (IOException x) {
- String errmsg = sm.getString("bioSender.ack.missing", getAddress(), Integer.valueOf(socket.getLocalPort()), Long.valueOf(getTimeout()));
- if ( SenderState.getSenderState(getDestination()).isReady() ) {
- SenderState.getSenderState(getDestination()).setSuspect();
- if ( log.isWarnEnabled() ) log.warn(errmsg, x);
- } else {
- if ( log.isDebugEnabled() )log.debug(errmsg, x);
- }
- throw x;
- } finally {
- ackbuf.clear();
- }
- }
-}
diff --git a/java/org/apache/catalina/tribes/transport/bio/LocalStrings.properties b/java/org/apache/catalina/tribes/transport/bio/LocalStrings.properties
deleted file mode 100644
index 089e44a..0000000
--- a/java/org/apache/catalina/tribes/transport/bio/LocalStrings.properties
+++ /dev/null
@@ -1,40 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-bioReceiver.already.started=ServerSocket already started
-bioReceiver.run.fail=Unable to run replication listener.
-bioReceiver.socket.closeFailed=Failed to close socket
-bioReceiver.start.fail=Unable to start cluster receiver
-bioReceiver.threadpool.fail=ThreadPool cannot be initialized. Listener not started
-bioReceiver.threads.busy=All BIO server replication threads are busy, unable to handle more requests until a thread is freed up.
-
-bioReplicationTask.messageDataReceived.error=Error thrown from messageDataReceived.
-bioReplicationTask.reader.closeFailed=Failed to close reader
-bioReplicationTask.socket.closeFailed=Failed to close socket
-bioReplicationTask.unable.sendAck=Unable to send ACK back through channel, channel disconnected?: [{0}]
-bioReplicationTask.unable.service=Unable to service bio socket
-
-bioSender.ack.eof=EOF reached at local port [{0}:{1,number,integer}]
-bioSender.ack.missing=Unable to read acknowledgement from [{0}:{1,number,integer}] in {2,number,integer} ms. Disconnecting socket, and trying again.
-bioSender.ack.wrong=Missing correct ACK after 10 bytes read at local port [{0}:{1,number,integer}]
-bioSender.closeSocket=Sender close socket to [{0}:{1,number,integer}] (close count {2,number,integer})
-bioSender.disconnect=Sender disconnect from [{0}:{1,number,integer}] (disconnect count {2,number,integer})
-bioSender.fail.AckReceived=Received a failed ack:org.apache.catalina.tribes.transport.Constants.FAIL_ACK_DATA
-bioSender.openSocket=Sender open socket to [{0}:{1,number,integer}] (open count {2,number,integer})
-bioSender.openSocket.failure=Open sender socket [{0}:{1,number,integer}] failure! (open failure count {2,number,integer})
-bioSender.send.again=Send data again to [{0}:{1,number,integer}]
-
-pooledMultiSender.retrieve.fail=Unable to retrieve a sender from the sender pool
-pooledMultiSender.unable.retrieve.sender=Unable to retrieve a data sender, time out([{0}] ms) error.
diff --git a/java/org/apache/catalina/tribes/transport/bio/LocalStrings_cs.properties b/java/org/apache/catalina/tribes/transport/bio/LocalStrings_cs.properties
deleted file mode 100644
index 9e6f09c..0000000
--- a/java/org/apache/catalina/tribes/transport/bio/LocalStrings_cs.properties
+++ /dev/null
@@ -1,22 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-bioReceiver.socket.closeFailed=Uzavření socketu selhalo
-
-bioReplicationTask.socket.closeFailed=Uzavření socketu selhalo
-
-bioSender.ack.wrong=Chybí správné ACK po čtení 10 bytů na portu [{0}:{1,number,integer}]
-bioSender.openSocket=Odesílatel otevřel socket na [{0}:{1,number,integer}] (počet otevřených {2,number,integer})
-bioSender.send.again=Poslat data znovu na [{0}:{1,number,integer}]
diff --git a/java/org/apache/catalina/tribes/transport/bio/LocalStrings_de.properties b/java/org/apache/catalina/tribes/transport/bio/LocalStrings_de.properties
deleted file mode 100644
index 891f863..0000000
--- a/java/org/apache/catalina/tribes/transport/bio/LocalStrings_de.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-bioReceiver.socket.closeFailed=Socket konnte nicht geschlossen werden
-
-bioSender.send.again=Sende Daten erneut an [{0}:{1,number,integer}]
diff --git a/java/org/apache/catalina/tribes/transport/bio/LocalStrings_es.properties b/java/org/apache/catalina/tribes/transport/bio/LocalStrings_es.properties
deleted file mode 100644
index 7a92ed6..0000000
--- a/java/org/apache/catalina/tribes/transport/bio/LocalStrings_es.properties
+++ /dev/null
@@ -1,27 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-bioReceiver.socket.closeFailed=Fallo al cerrar el socket
-
-bioReplicationTask.reader.closeFailed=Fallo al cerrar el lector
-
-bioSender.ack.eof=EOF alcanzado en puerto local [{0}:{1,number,integer}]
-bioSender.ack.missing=No puedo leer reconocimiento desde [{0}:{1,number,integer}] en {2,number,integer} ms. Desconectando conector e intentando otra vez.
-bioSender.ack.wrong=Falta ACK correcto tras 10 bytes leídos en puerto local [{0}:{1,number,integer}]
-bioSender.closeSocket=El remitente cerró el conector con [{0}:{1,number,integer}] (contador de cierre {2,number,integer})
-bioSender.disconnect=Remitente desconectado de [{0}:{1,number,integer}] (contador de desconexión {2,number,integer})
-bioSender.openSocket=Remitente abrió conector con [{0}:{1,number,integer}] (contador de apertura {2,number,integer})
-bioSender.openSocket.failure=¡No pude abrir conector de remitente [{0}:{1,number,integer}]! (contador de fallo de apertura {2,number,integer})
-bioSender.send.again=Enviar datos de nuevo a [{0}:{1,number,integer}]
diff --git a/java/org/apache/catalina/tribes/transport/bio/LocalStrings_fr.properties b/java/org/apache/catalina/tribes/transport/bio/LocalStrings_fr.properties
deleted file mode 100644
index a746bf8..0000000
--- a/java/org/apache/catalina/tribes/transport/bio/LocalStrings_fr.properties
+++ /dev/null
@@ -1,40 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-bioReceiver.already.started=Le ServerSocket a déjà démarré
-bioReceiver.run.fail=Impossible d'exécuter l’écouteur de réplication
-bioReceiver.socket.closeFailed=Echec de fermeture de la connection
-bioReceiver.start.fail=Impossible de démarrer le receveur du cluster
-bioReceiver.threadpool.fail=Le ThreadPool n'a pas pu être initialisé, l'écouteur n'a pas démarré
-bioReceiver.threads.busy=Tous les fils d'exécution du serveur de réplication sont occupés, impossible de traiter plus de requêtes avant qu'un ne se libère
-
-bioReplicationTask.messageDataReceived.error=Erreur lors de messageDataReceived
-bioReplicationTask.reader.closeFailed=Echec de fermeture du lecteur
-bioReplicationTask.socket.closeFailed=Ecech de la fermeture du socket
-bioReplicationTask.unable.sendAck=Impossible de renvoyer une confirmation par le canal, il peut être déconnecté : [{0}]
-bioReplicationTask.unable.service=Incapable de traiter un socket BIO
-
-bioSender.ack.eof=EOF recontré sur le port local [{0}:{1,number,integer}]
-bioSender.ack.missing=Incapable de lire l'accusé de réception de [{0}:{1,number,integer}] en {2,number,integer] ms. Déconnexion de la socket et nouvel tentative.
-bioSender.ack.wrong=Il manque un ACK correct après la lecture de 10 octets sur le port local [{0}:{1,number,integer}]
-bioSender.closeSocket=Sender fermeture du socket vers [{0}:{1,number,integer}] (nombre de fermetures {2,number,integer})
-bioSender.disconnect=L'envoyeur s'est déconnecté de [{0}:{1,number,integer}] (nombre de déconnections {2,number,integer})
-bioSender.fail.AckReceived=Reçu une confirmation en échec : org.apache.catalina.tribes.transport.Constants.FAIL_ACK_DATA
-bioSender.openSocket=L''expéditeur ouvre une socket vers [{0}:{1,number,integer}] ({2,number,integer} sockets ouvertes})
-bioSender.openSocket.failure=Echec d'ouverture du socket d'envoi [{0}:{1,number,integer} (nombre d'écecs d'ouverture {2,number,integer})
-bioSender.send.again=Envoyer les données à nouveau à [{0}:{1,number,integer}]
-
-pooledMultiSender.retrieve.fail=Impossible d'obtenir un envoyeur à partir du pool
-pooledMultiSender.unable.retrieve.sender=Impossible de récupéré un expéditeur de données. délai d''attente ([{0}] ms) dépassé
diff --git a/java/org/apache/catalina/tribes/transport/bio/LocalStrings_ja.properties b/java/org/apache/catalina/tribes/transport/bio/LocalStrings_ja.properties
deleted file mode 100644
index 2fde08e..0000000
--- a/java/org/apache/catalina/tribes/transport/bio/LocalStrings_ja.properties
+++ /dev/null
@@ -1,40 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-bioReceiver.already.started=サーバーソケットはすでに開始しています。
-bioReceiver.run.fail=レプリケーションリスナーを実行できません。
-bioReceiver.socket.closeFailed=ソケットを切断できませんでした。
-bioReceiver.start.fail=クラスタレシーバを起動できません
-bioReceiver.threadpool.fail=スレッドプールを初期化できません。リスナーを開始しませんでした。
-bioReceiver.threads.busy=全ての BIO サーバーレプリケーションスレッドがビジー状態です。スレッドが解放されるまで新しいリクエストは処理できません。
-
-bioReplicationTask.messageDataReceived.error=messageDataReceivedから送出されたエラー
-bioReplicationTask.reader.closeFailed=Readerを閉じることに失敗しました。
-bioReplicationTask.socket.closeFailed=ソケットクロースに失敗
-bioReplicationTask.unable.sendAck=チャンネルへACKを送信できません。チャンネルが切断されているかもしれません: [{0}]
-bioReplicationTask.unable.service=bio ソケットを開始できません。
-
-bioSender.ack.eof=ローカルポート[{0}:{1、number、integer}]でEOF
-bioSender.ack.missing=[{0}:{1,number,integer}] から [{2,number,integer}] ms 以内に確認応答(ACK)を読み取ることができませんでした。ソケットを切断して再試行してください。
-bioSender.ack.wrong=ローカルポート [{0}:{1,number,integer}] から 10 バイト読み込んだ後に正しい ACK が見つかりません。
-bioSender.closeSocket=[{0}:{1、number、integer}](close count {2、number、integer})に送信側のクローズソケット
-bioSender.disconnect=[{0}:{1,number,integer}](切断カウント{2,number,integer})からのSender切断
-bioSender.fail.AckReceived=失敗したACK:org.apache.catalina.tribes.transport.Constants.FAIL_ACK_DATAの受信
-bioSender.openSocket=Sender オブジェクトが [{0}:{1,number,integer}] (接続数 {2,number,integer}) へソケット接続を開始しました。
-bioSender.openSocket.failure=開いているSender側ソケット[{0}:{1,number,integer}]失敗! (オープン失敗カウント{2,number,integer}))
-bioSender.send.again=[{0}:{1,number,integer}] へデータを再送します。
-
-pooledMultiSender.retrieve.fail=SenderプールからSenderを取得できません。
-pooledMultiSender.unable.retrieve.sender=データSenderを取得できません。タイムアウト([{0}] ms)エラー。
diff --git a/java/org/apache/catalina/tribes/transport/bio/LocalStrings_ko.properties b/java/org/apache/catalina/tribes/transport/bio/LocalStrings_ko.properties
deleted file mode 100644
index 37bc523..0000000
--- a/java/org/apache/catalina/tribes/transport/bio/LocalStrings_ko.properties
+++ /dev/null
@@ -1,40 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-bioReceiver.already.started=ServerSocket이 이미 시작되었습니다.
-bioReceiver.run.fail=복제 리스너를 실행할 수 없습니다.
-bioReceiver.socket.closeFailed=소켓을 닫지 못했습니다.
-bioReceiver.start.fail=클러스터 Receiver를 시작할 수 없습니다.
-bioReceiver.threadpool.fail=쓰레드풀이 초기화될 수 없습니다. 리스너가 시작되지 않았습니다.
-bioReceiver.threads.busy=모든 BIO 서버 복제 쓰레드들이 작업 중입니다. 유휴 쓰레드가 하나라도 생기기 전에는, 더 이상 요청을 처리할 수 없습니다.
-
-bioReplicationTask.messageDataReceived.error=messageDataReceived로부터 오류 발생
-bioReplicationTask.reader.closeFailed=Reader를 닫지 못했습니다.
-bioReplicationTask.socket.closeFailed=소켓을 닫지 못했습니다.
-bioReplicationTask.unable.sendAck=채널을 통해 ACK을 되돌려 보낼 수 없습니다. 채널의 연결이 끊겼나요?: [{0}]
-bioReplicationTask.unable.service=BIO 소켓을 서비스할 수 없습니다.
-
-bioSender.ack.eof=로컬 포트 [{0}:{1,number,integer}]에서 EOF에 도달했습니다.
-bioSender.ack.missing=[{0}:{1,number,integer}](으)로부터 ACK을 {2,number,integer} 밀리초 내에 읽을 수 없습니다. 소켓 연결을 끊고, 다시 시도합니다.
-bioSender.ack.wrong=10 바이트들을 로컬 포트 [{0}]에서 읽고 난 후 올바른 ACK를 받지 못했습니다: {1,number,integer}]
-bioSender.closeSocket=Sender가 소켓 닫기 메시지를 [{0}:{1,number,integer}]에 전송합니다. (전송 회수: {2,number,integer})
-bioSender.disconnect=Sender가 [{0}:{1,number,integer}](으)로부터 연결을 끊습니다. (연결 끊기 회수: {2,number,integer})
-bioSender.fail.AckReceived=실패한 ACK을 받았습니다: org.apache.catalina.tribes.transport.Constants.FAIL_ACK_DATA
-bioSender.openSocket=Sender가 [{0}:{1,number,integer}]을(를) 향해 소켓을 엽니다. (연 소켓 개수: {2,number,integer})
-bioSender.openSocket.failure=Sender 소켓 [{0}:{1,number,integer}]을(를) 열지 못했습니다! (열기 실패 회수: {2,number,integer})
-bioSender.send.again=데이터를 [{0}:{1,number,integer}](으)로 다시 전송합니다.
-
-pooledMultiSender.retrieve.fail=Sender 풀로부터 sender를 검색할 수 없습니다.
-pooledMultiSender.unable.retrieve.sender=데이터 sender를 조회할 수 없습니다. 제한 시간 초과 ([{0}] 밀리초) 오류 발생.
diff --git a/java/org/apache/catalina/tribes/transport/bio/LocalStrings_pt_BR.properties b/java/org/apache/catalina/tribes/transport/bio/LocalStrings_pt_BR.properties
deleted file mode 100644
index a56f384..0000000
--- a/java/org/apache/catalina/tribes/transport/bio/LocalStrings_pt_BR.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-bioReceiver.socket.closeFailed=Falha ao encerrar a conexão do socket
-
-bioSender.send.again=Enviar dados novamente para [{0}:{1,number,integer}]
diff --git a/java/org/apache/catalina/tribes/transport/bio/LocalStrings_ru.properties b/java/org/apache/catalina/tribes/transport/bio/LocalStrings_ru.properties
deleted file mode 100644
index 1d40449..0000000
--- a/java/org/apache/catalina/tribes/transport/bio/LocalStrings_ru.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-bioSender.send.again=Послать данные ещё раз в [{0}:{1,number,integer}]
diff --git a/java/org/apache/catalina/tribes/transport/bio/MultipointBioSender.java b/java/org/apache/catalina/tribes/transport/bio/MultipointBioSender.java
deleted file mode 100644
index 5edd1e1..0000000
--- a/java/org/apache/catalina/tribes/transport/bio/MultipointBioSender.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.catalina.tribes.transport.bio;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.catalina.tribes.Channel;
-import org.apache.catalina.tribes.ChannelException;
-import org.apache.catalina.tribes.ChannelMessage;
-import org.apache.catalina.tribes.Member;
-import org.apache.catalina.tribes.io.ChannelData;
-import org.apache.catalina.tribes.io.XByteBuffer;
-import org.apache.catalina.tribes.transport.AbstractSender;
-import org.apache.catalina.tribes.transport.MultiPointSender;
-
-public class MultipointBioSender extends AbstractSender implements MultiPointSender {
- public MultipointBioSender() {
- // NO-OP
- }
-
- protected final HashMap<Member, BioSender> bioSenders = new HashMap<>();
-
- @Override
- public synchronized void sendMessage(Member[] destination, ChannelMessage msg) throws ChannelException {
- byte[] data = XByteBuffer.createDataPackage((ChannelData)msg);
- BioSender[] senders = setupForSend(destination);
- ChannelException cx = null;
- for ( int i=0; i<senders.length; i++ ) {
- try {
- senders[i].sendMessage(data,(msg.getOptions()&Channel.SEND_OPTIONS_USE_ACK)==Channel.SEND_OPTIONS_USE_ACK);
- } catch (Exception x) {
- if (cx == null) cx = new ChannelException(x);
- cx.addFaultyMember(destination[i],x);
- }
- }
- if (cx!=null ) throw cx;
- }
-
-
-
- protected BioSender[] setupForSend(Member[] destination) throws ChannelException {
- ChannelException cx = null;
- BioSender[] result = new BioSender[destination.length];
- for ( int i=0; i<destination.length; i++ ) {
- try {
- BioSender sender = bioSenders.get(destination[i]);
- if (sender == null) {
- sender = new BioSender();
- AbstractSender.transferProperties(this,sender);
- sender.setDestination(destination[i]);
- bioSenders.put(destination[i], sender);
- }
- result[i] = sender;
- if (!result[i].isConnected() ) result[i].connect();
- result[i].keepalive();
- }catch (Exception x ) {
- if ( cx== null ) cx = new ChannelException(x);
- cx.addFaultyMember(destination[i],x);
- }
- }
- if ( cx!=null ) throw cx;
- else return result;
- }
-
- @Override
- public void connect() throws IOException {
- //do nothing, we connect on demand
- setConnected(true);
- }
-
-
- private synchronized void close() throws ChannelException {
- ChannelException x = null;
- Object[] members = bioSenders.keySet().toArray();
- for (int i=0; i<members.length; i++ ) {
- Member mbr = (Member)members[i];
- try {
- BioSender sender = bioSenders.get(mbr);
- sender.disconnect();
- }catch ( Exception e ) {
- if ( x == null ) x = new ChannelException(e);
- x.addFaultyMember(mbr,e);
- }
- bioSenders.remove(mbr);
- }
- if ( x != null ) throw x;
- }
-
- @Override
- public void add(Member member) {
- // NO-OP
- // Members are defined by the array of members specified in the call to
- // sendMessage()
- }
-
- @Override
- public void remove(Member member) {
- //disconnect senders
- BioSender sender = bioSenders.remove(member);
- if ( sender != null ) sender.disconnect();
- }
-
-
- @Override
- public synchronized void disconnect() {
- try {
- close();
- } catch (Exception x) {
- // Ignore
- }
- setConnected(false);
- }
-
- @Override
- protected void finalize() throws Throwable {
- try {
- disconnect();
- } catch (Exception e) {
- // Ignore
- }
- super.finalize();
- }
-
-
- @Override
- public boolean keepalive() {
- boolean result = false;
- @SuppressWarnings("unchecked")
- Map.Entry<Member,BioSender>[] entries = bioSenders.entrySet().toArray(new Map.Entry[0]);
- for ( int i=0; i<entries.length; i++ ) {
- BioSender sender = entries[i].getValue();
- if ( sender.keepalive() ) {
- bioSenders.remove(entries[i].getKey());
- }
- }
- return result;
- }
-
-}
\ No newline at end of file
diff --git a/java/org/apache/catalina/tribes/transport/bio/PooledMultiSender.java b/java/org/apache/catalina/tribes/transport/bio/PooledMultiSender.java
deleted file mode 100644
index 8c92311..0000000
--- a/java/org/apache/catalina/tribes/transport/bio/PooledMultiSender.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.catalina.tribes.transport.bio;
-
-import org.apache.catalina.tribes.ChannelException;
-import org.apache.catalina.tribes.ChannelMessage;
-import org.apache.catalina.tribes.Member;
-import org.apache.catalina.tribes.transport.AbstractSender;
-import org.apache.catalina.tribes.transport.DataSender;
-import org.apache.catalina.tribes.transport.MultiPointSender;
-import org.apache.catalina.tribes.transport.PooledSender;
-import org.apache.catalina.tribes.util.StringManager;
-
-public class PooledMultiSender extends PooledSender {
-
- protected static final StringManager sm = StringManager.getManager(PooledMultiSender.class);
-
- public PooledMultiSender() {
- // NO-OP
- }
-
- @Override
- public void sendMessage(Member[] destination, ChannelMessage msg) throws ChannelException {
- MultiPointSender sender = null;
- try {
- sender = (MultiPointSender)getSender();
- if (sender == null) {
- ChannelException cx = new ChannelException(sm.getString(
- "pooledMultiSender.unable.retrieve.sender", Long.toString(getMaxWait())));
- for (int i = 0; i < destination.length; i++)
- cx.addFaultyMember(destination[i], new NullPointerException(sm.getString("pooledMultiSender.retrieve.fail")));
- throw cx;
- } else {
- sender.sendMessage(destination, msg);
- }
- sender.keepalive();
- }finally {
- if ( sender != null ) returnSender(sender);
- }
- }
-
- @Override
- public DataSender getNewDataSender() {
- MultipointBioSender sender = new MultipointBioSender();
- AbstractSender.transferProperties(this,sender);
- return sender;
- }
-}
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index eb7c435..61129f8 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -157,6 +157,10 @@
<code>org.apache.catalina.tribes.io.BufferPool.DEFAULT_POOL_SIZE</code>
system property to configure its size. (remm)
</update>
+ <update>
+ Remove java.io based Tribes receiver and sender, in favor of NIO which
+ was the default. (remm)
+ </update>
</changelog>
</subsection>
<subsection name="Web applications">
diff --git a/webapps/docs/config/cluster-receiver.xml b/webapps/docs/config/cluster-receiver.xml
index 9bc1b53..7edf9e7 100644
--- a/webapps/docs/config/cluster-receiver.xml
+++ b/webapps/docs/config/cluster-receiver.xml
@@ -46,11 +46,9 @@
</p>
</section>
-<section name="Blocking vs Non-Blocking Receiver">
+<section name="Receiver">
<p>
- The receiver supports both a non blocking, <code>org.apache.catalina.tribes.transport.nio.NioReceiver</code>, and a
- blocking, <code>org.apache.catalina.tribes.transport.bio.BioReceiver</code>. It is preferred to use the non blocking receiver
- to be able to grow your cluster without running into thread starvation.<br/>
+ The receiver supports a non blocking <code>org.apache.catalina.tribes.transport.nio.NioReceiver</code> reciever.<br/>
Using the non blocking receiver allows you to with a very limited thread count to serve a large number of messages.
Usually the rule is to use 1 thread per node in the cluster for small clusters, and then depending on your message frequency
and your hardware, you'll find an optimal number of threads peak out at a certain number.
@@ -61,11 +59,9 @@
<subsection name="Common Attributes">
<attributes>
<attribute name="className" required="true">
- The implementation of the receiver component. Two implementations available,
- <code>org.apache.catalina.tribes.transport.nio.NioReceiver</code> and
- <code>org.apache.catalina.tribes.transport.bio.BioReceiver</code>.<br/>
- The <code>org.apache.catalina.tribes.transport.nio.NioReceiver</code> is the
- preferred implementation
+ The implementation of the receiver component.
+ <code>org.apache.catalina.tribes.transport.nio.NioReceiver</code>
+ is provided by Tomcat.
</attribute>
<attribute name="address" required="false">
The address (network interface) to listen for incoming traffic.
diff --git a/webapps/docs/config/cluster-sender.xml b/webapps/docs/config/cluster-sender.xml
index 66f9707..a539647 100644
--- a/webapps/docs/config/cluster-sender.xml
+++ b/webapps/docs/config/cluster-sender.xml
@@ -62,11 +62,6 @@
<p>
The nested element <code><Transport></code> is not required, but encouraged, as this is where
you would set all the socket options for the outgoing messages. Please see its attributes below.
- There are two implementations, in a similar manner to the <a href="cluster-receiver.html">receiver</a>, one is non-blocking
- based and the other is built using blocking IO. <br/>
- <code>org.apache.catalina.tribes.transport.bio.PooledMultiSender</code> is the blocking implementation and
- <code>org.apache.catalina.tribes.transport.nio.PooledParallelSender</code>.
- Parallel delivery is not available for the blocking implementation due to the fact that it is blocking a thread on sending data.
</p>
</section>
@@ -81,9 +76,9 @@
<subsection name="Common Transport Attributes">
<attributes>
<attribute name="className" required="true">
- Required, an implementation of the <code>org.apache.catalina.tribes.transport.MultiPointSender</code>.<br/>
- Non-blocking implementation is <code>org.apache.catalina.tribes.transport.nio.PooledParallelSender</code><br/>
- Blocking implementation is <code>org.apache.catalina.tribes.transport.bio.PooledMultiSender</code>
+ The implementation of the sender component.
+ <code>org.apache.catalina.tribes.transport.nio.PooledParallelSender</code>
+ is provided by Tomcat.
</attribute>
<attribute name="rxBufSize" required="false">
The receive buffer size on the socket.
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org
Re: [tomcat] branch master updated: Remove java.io based sender and receiver
Posted by Martin Grigorov <mg...@apache.org>.
Hi Remy,
On Wed, Apr 29, 2020 at 6:04 PM <re...@apache.org> wrote:
> This is an automated email from the ASF dual-hosted git repository.
>
> remm pushed a commit to branch master
> in repository https://gitbox.apache.org/repos/asf/tomcat.git
>
>
> The following commit(s) were added to refs/heads/master by this push:
> new c1bbb10 Remove java.io based sender and receiver
> c1bbb10 is described below
>
> commit c1bbb10e73a110bafbf311017540dcdb4f53ec58
> Author: remm <re...@apache.org>
> AuthorDate: Wed Apr 29 17:03:41 2020 +0200
>
> Remove java.io based sender and receiver
>
> It's unlikely they are still used as they were not the default
> configuration.
>
IMO it would be a good idea to mark the removed classes as @Deprecated in
9.0.x
This way users will know what to expect before migrating to 10.
Martin
> ---
> .../catalina/tribes/transport/bio/BioReceiver.java | 154 -----------
> .../tribes/transport/bio/BioReplicationTask.java | 189 --------------
> .../catalina/tribes/transport/bio/BioSender.java | 281
> ---------------------
> .../tribes/transport/bio/LocalStrings.properties | 40 ---
> .../transport/bio/LocalStrings_cs.properties | 22 --
> .../transport/bio/LocalStrings_de.properties | 18 --
> .../transport/bio/LocalStrings_es.properties | 27 --
> .../transport/bio/LocalStrings_fr.properties | 40 ---
> .../transport/bio/LocalStrings_ja.properties | 40 ---
> .../transport/bio/LocalStrings_ko.properties | 40 ---
> .../transport/bio/LocalStrings_pt_BR.properties | 18 --
> .../transport/bio/LocalStrings_ru.properties | 16 --
> .../tribes/transport/bio/MultipointBioSender.java | 156 ------------
> .../tribes/transport/bio/PooledMultiSender.java | 62 -----
> webapps/docs/changelog.xml | 4 +
> webapps/docs/config/cluster-receiver.xml | 14 +-
> webapps/docs/config/cluster-sender.xml | 11 +-
> 17 files changed, 12 insertions(+), 1120 deletions(-)
>
> diff --git
> a/java/org/apache/catalina/tribes/transport/bio/BioReceiver.java
> b/java/org/apache/catalina/tribes/transport/bio/BioReceiver.java
> deleted file mode 100644
> index 3214ab5..0000000
> --- a/java/org/apache/catalina/tribes/transport/bio/BioReceiver.java
> +++ /dev/null
> @@ -1,154 +0,0 @@
> -/*
> - * Licensed to the Apache Software Foundation (ASF) under one or more
> - * contributor license agreements. See the NOTICE file distributed with
> - * this work for additional information regarding copyright ownership.
> - * The ASF licenses this file to You under the Apache License, Version 2.0
> - * (the "License"); you may not use this file except in compliance with
> - * the License. You may obtain a copy of the License at
> - *
> - * http://www.apache.org/licenses/LICENSE-2.0
> - *
> - * Unless required by applicable law or agreed to in writing, software
> - * distributed under the License is distributed on an "AS IS" BASIS,
> - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> - * See the License for the specific language governing permissions and
> - * limitations under the License.
> - */
> -package org.apache.catalina.tribes.transport.bio;
> -
> -import java.io.IOException;
> -import java.net.ServerSocket;
> -import java.net.Socket;
> -
> -import org.apache.catalina.tribes.io.ObjectReader;
> -import org.apache.catalina.tribes.transport.AbstractRxTask;
> -import org.apache.catalina.tribes.transport.ReceiverBase;
> -import org.apache.catalina.tribes.transport.RxTaskPool;
> -import org.apache.catalina.tribes.util.StringManager;
> -import org.apache.juli.logging.Log;
> -import org.apache.juli.logging.LogFactory;
> -
> -public class BioReceiver extends ReceiverBase implements Runnable {
> -
> - private static final Log log = LogFactory.getLog(BioReceiver.class);
> -
> - protected static final StringManager sm =
> StringManager.getManager(BioReceiver.class);
> -
> - protected ServerSocket serverSocket;
> -
> - public BioReceiver() {
> - // NO-OP
> - }
> -
> - @Override
> - public void start() throws IOException {
> - super.start();
> - try {
> - setPool(new RxTaskPool(getMaxThreads(),getMinThreads(),this));
> - } catch (Exception x) {
> - log.fatal(sm.getString("bioReceiver.threadpool.fail"), x);
> - if ( x instanceof IOException ) throw (IOException)x;
> - else throw new IOException(x.getMessage());
> - }
> - try {
> - getBind();
> - bind();
> - String channelName = "";
> - if (getChannel().getName() != null) channelName = "[" +
> getChannel().getName() + "]";
> - Thread t = new Thread(this, "BioReceiver" + channelName);
> - t.setDaemon(true);
> - t.start();
> - } catch (Exception x) {
> - log.fatal(sm.getString("bioReceiver.start.fail"), x);
> - if ( x instanceof IOException ) throw (IOException)x;
> - else throw new IOException(x.getMessage());
> - }
> - }
> -
> - @Override
> - public AbstractRxTask createRxTask() {
> - return getReplicationThread();
> - }
> -
> - protected BioReplicationTask getReplicationThread() {
> - BioReplicationTask result = new BioReplicationTask(this);
> - result.setOptions(getWorkerThreadOptions());
> - result.setUseBufferPool(this.getUseBufferPool());
> - return result;
> - }
> -
> - @Override
> - public void stop() {
> - setListen(false);
> - try {
> - this.serverSocket.close();
> - } catch (Exception x) {
> - if (log.isDebugEnabled()) {
> - log.debug(sm.getString("bioReceiver.socket.closeFailed"),
> x);
> - }
> - }
> - super.stop();
> - }
> -
> -
> - protected void bind() throws IOException {
> - // allocate an unbound server socket channel
> - serverSocket = new ServerSocket();
> - // set the port the server channel will listen to
> - //serverSocket.bind(new InetSocketAddress(getBind(),
> getTcpListenPort()));
> - bind(serverSocket,getPort(),getAutoBind());
> - }
> -
> -
> - @Override
> - public void run() {
> - try {
> - listen();
> - } catch (Exception x) {
> - log.error(sm.getString("bioReceiver.run.fail"), x);
> - }
> - }
> -
> - public void listen() throws Exception {
> - if (doListen()) {
> - log.warn(sm.getString("bioReceiver.already.started"));
> - return;
> - }
> - setListen(true);
> -
> - while ( doListen() ) {
> - Socket socket = null;
> - if ( getTaskPool().available() < 1 ) {
> - if ( log.isWarnEnabled() )
> - log.warn(sm.getString("bioReceiver.threads.busy"));
> - }
> - BioReplicationTask task =
> (BioReplicationTask)getTaskPool().getRxTask();
> - if ( task == null ) continue; //should never happen
> - try {
> - socket = serverSocket.accept();
> - }catch ( Exception x ) {
> - if ( doListen() ) throw x;
> - }
> - if ( !doListen() ) {
> - task.serviceSocket(null,null);
> - getExecutor().execute(task);
> - task.close();
> - break; //regular shutdown
> - }
> - if ( socket == null ) continue;
> - socket.setReceiveBufferSize(getRxBufSize());
> - socket.setSendBufferSize(getTxBufSize());
> - socket.setTcpNoDelay(getTcpNoDelay());
> - socket.setKeepAlive(getSoKeepAlive());
> - socket.setOOBInline(getOoBInline());
> - socket.setReuseAddress(getSoReuseAddress());
> - socket.setSoLinger(getSoLingerOn(),getSoLingerTime());
> - socket.setSoTimeout(getTimeout());
> - ObjectReader reader = new ObjectReader(socket);
> - task.serviceSocket(socket,reader);
> - getExecutor().execute(task);
> - }//while
> - }
> -
> -
> -}
> \ No newline at end of file
> diff --git
> a/java/org/apache/catalina/tribes/transport/bio/BioReplicationTask.java
> b/java/org/apache/catalina/tribes/transport/bio/BioReplicationTask.java
> deleted file mode 100644
> index d35ee65..0000000
> --- a/java/org/apache/catalina/tribes/transport/bio/BioReplicationTask.java
> +++ /dev/null
> @@ -1,189 +0,0 @@
> -/*
> - * Licensed to the Apache Software Foundation (ASF) under one or more
> - * contributor license agreements. See the NOTICE file distributed with
> - * this work for additional information regarding copyright ownership.
> - * The ASF licenses this file to You under the Apache License, Version 2.0
> - * (the "License"); you may not use this file except in compliance with
> - * the License. You may obtain a copy of the License at
> - *
> - * http://www.apache.org/licenses/LICENSE-2.0
> - *
> - * Unless required by applicable law or agreed to in writing, software
> - * distributed under the License is distributed on an "AS IS" BASIS,
> - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> - * See the License for the specific language governing permissions and
> - * limitations under the License.
> - */
> -
> -package org.apache.catalina.tribes.transport.bio;
> -
> -import java.io.InputStream;
> -import java.io.OutputStream;
> -import java.net.Socket;
> -
> -import org.apache.catalina.tribes.ChannelMessage;
> -import org.apache.catalina.tribes.io.BufferPool;
> -import org.apache.catalina.tribes.io.ChannelData;
> -import org.apache.catalina.tribes.io.ListenCallback;
> -import org.apache.catalina.tribes.io.ObjectReader;
> -import org.apache.catalina.tribes.transport.AbstractRxTask;
> -import org.apache.catalina.tribes.transport.Constants;
> -import org.apache.catalina.tribes.util.StringManager;
> -import org.apache.juli.logging.Log;
> -import org.apache.juli.logging.LogFactory;
> -
> -/**
> - * A worker thread class which can drain channels and echo-back the
> input. Each
> - * instance is constructed with a reference to the owning thread pool
> object.
> - * When started, the thread loops forever waiting to be awakened to
> service the
> - * channel associated with a SelectionKey object. The worker is tasked by
> - * calling its serviceChannel() method with a SelectionKey object. The
> - * serviceChannel() method stores the key reference in the thread object
> then
> - * calls notify() to wake it up. When the channel has been drained, the
> worker
> - * thread returns itself to its parent pool.
> - */
> -public class BioReplicationTask extends AbstractRxTask {
> -
> - private static final Log log =
> LogFactory.getLog(BioReplicationTask.class);
> -
> - protected static final StringManager sm =
> StringManager.getManager(BioReplicationTask.class);
> -
> - protected Socket socket;
> - protected ObjectReader reader;
> -
> - public BioReplicationTask (ListenCallback callback) {
> - super(callback);
> - }
> -
> - // loop forever waiting for work to do
> - @Override
> - public synchronized void run()
> - {
> - if ( socket == null ) return;
> - try {
> - drainSocket();
> - } catch ( Exception x ) {
> - log.error(sm.getString("bioReplicationTask.unable.service"),
> x);
> - }finally {
> - try {
> - socket.close();
> - }catch (Exception e) {
> - if (log.isDebugEnabled()) {
> -
> log.debug(sm.getString("bioReplicationTask.socket.closeFailed"), e);
> - }
> - }
> - try {
> - reader.close();
> - }catch (Exception e) {
> - if (log.isDebugEnabled()) {
> -
> log.debug(sm.getString("bioReplicationTask.reader.closeFailed"), e);
> - }
> - }
> - reader = null;
> - socket = null;
> - }
> - // done, ready for more, return to pool
> - if ( getTaskPool() != null ) getTaskPool().returnWorker (this);
> - }
> -
> -
> - public synchronized void serviceSocket(Socket socket, ObjectReader
> reader) {
> - this.socket = socket;
> - this.reader = reader;
> - }
> -
> - protected void execute(ObjectReader reader) throws Exception{
> - int pkgcnt = reader.count();
> -
> - if ( pkgcnt > 0 ) {
> - ChannelMessage[] msgs = reader.execute();
> - 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(Constants.ACK_COMMAND);
> - try {
> - //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(Constants.ACK_COMMAND);
> - }catch ( Exception x ) {
> - if (ChannelData.sendAckSync(msgs[i].getOptions()))
> sendAck(Constants.FAIL_ACK_COMMAND);
> -
> log.error(sm.getString("bioReplicationTask.messageDataReceived.error"),x);
> - }
> - if ( getUseBufferPool() ) {
> -
> BufferPool.getBufferPool().returnBuffer(msgs[i].getMessage());
> - msgs[i].setMessage(null);
> - }
> - }
> - }
> -
> -
> - }
> -
> - /**
> - * 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.
> - * @throws Exception IO exception or execute exception
> - */
> - protected void drainSocket() throws Exception {
> - InputStream in = socket.getInputStream();
> - // loop while data available, channel is non-blocking
> - byte[] buf = new byte[1024];
> - int length = in.read(buf);
> - while ( length >= 0 ) {
> - int count = reader.append(buf,0,length,true);
> - if ( count > 0 ) execute(reader);
> - length = in.read(buf);
> - }
> - }
> -
> -
> - /**
> - * Send a reply-acknowledgment (6,2,3)
> - * @param command The command to write
> - */
> - protected void sendAck(byte[] command) {
> - try {
> - OutputStream out = socket.getOutputStream();
> - out.write(command);
> - out.flush();
> - if (log.isTraceEnabled()) {
> - log.trace("ACK sent to " + socket.getPort());
> - }
> - } catch ( java.io.IOException x ) {
> - log.warn(sm.getString("bioReplicationTask.unable.sendAck",
> x.getMessage()));
> - }
> - }
> -
> - @Override
> - public void close() {
> - try {
> - socket.close();
> - }catch (Exception e) {
> - if (log.isDebugEnabled()) {
> -
> log.debug(sm.getString("bioReplicationTask.socket.closeFailed"), e);
> - }
> - }
> - try {
> - reader.close();
> - }catch (Exception e) {
> - if (log.isDebugEnabled()) {
> -
> log.debug(sm.getString("bioReplicationTask.reader.closeFailed"), e);
> - }
> - }
> - reader = null;
> - socket = null;
> - super.close();
> - }
> -}
> diff --git a/java/org/apache/catalina/tribes/transport/bio/BioSender.java
> b/java/org/apache/catalina/tribes/transport/bio/BioSender.java
> deleted file mode 100644
> index 756e1eb..0000000
> --- a/java/org/apache/catalina/tribes/transport/bio/BioSender.java
> +++ /dev/null
> @@ -1,281 +0,0 @@
> -/*
> - * Licensed to the Apache Software Foundation (ASF) under one or more
> - * contributor license agreements. See the NOTICE file distributed with
> - * this work for additional information regarding copyright ownership.
> - * The ASF licenses this file to You under the Apache License, Version 2.0
> - * (the "License"); you may not use this file except in compliance with
> - * the License. You may obtain a copy of the License at
> - *
> - * http://www.apache.org/licenses/LICENSE-2.0
> - *
> - * Unless required by applicable law or agreed to in writing, software
> - * distributed under the License is distributed on an "AS IS" BASIS,
> - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> - * See the License for the specific language governing permissions and
> - * limitations under the License.
> - */
> -
> -package org.apache.catalina.tribes.transport.bio;
> -
> -import java.io.IOException;
> -import java.io.InputStream;
> -import java.io.OutputStream;
> -import java.net.InetSocketAddress;
> -import java.net.Socket;
> -import java.util.Arrays;
> -
> -import org.apache.catalina.tribes.RemoteProcessException;
> -import org.apache.catalina.tribes.io.XByteBuffer;
> -import org.apache.catalina.tribes.transport.AbstractSender;
> -import org.apache.catalina.tribes.transport.Constants;
> -import org.apache.catalina.tribes.transport.SenderState;
> -import org.apache.catalina.tribes.util.StringManager;
> -import org.apache.juli.logging.Log;
> -import org.apache.juli.logging.LogFactory;
> -
> -/**
> - * Send cluster messages with only one socket. Ack and keep Alive
> Handling is
> - * supported
> - *
> - * @author Peter Rossbach
> - * @since 5.5.16
> - */
> -public class BioSender extends AbstractSender {
> -
> - private static final Log log = LogFactory.getLog(BioSender.class);
> -
> - /**
> - * The string manager for this package.
> - */
> - protected static final StringManager sm =
> StringManager.getManager(BioSender.class);
> -
> - // ----------------------------------------------------- Instance
> Variables
> -
> - /**
> - * current sender socket
> - */
> - private Socket socket = null;
> - private OutputStream soOut = null;
> - private InputStream soIn = null;
> -
> - protected final XByteBuffer ackbuf =
> - new XByteBuffer(Constants.ACK_COMMAND.length, true);
> -
> -
> - // -------------------------------------------------------------
> Constructor
> -
> - public BioSender() {
> - // NO-OP
> - }
> -
> -
> - // --------------------------------------------------------- Public
> Methods
> -
> - /**
> - * Connect other cluster member receiver
> - * @see org.apache.catalina.tribes.transport.DataSender#connect()
> - */
> - @Override
> - public void connect() throws IOException {
> - openSocket();
> - }
> -
> -
> - /**
> - * disconnect and close socket
> - *
> - * @see org.apache.catalina.tribes.transport.DataSender#disconnect()
> - */
> - @Override
> - public void disconnect() {
> - boolean connect = isConnected();
> - closeSocket();
> - if (connect) {
> - if (log.isDebugEnabled())
> - log.debug(sm.getString("bioSender.disconnect",
> getAddress().getHostAddress(), Integer.valueOf(getPort()),
> Long.valueOf(0)));
> - }
> -
> - }
> -
> - /**
> - * Send message.
> - * @param data The data to send
> - * @param waitForAck Wait for an ack
> - * @throws IOException An IO error occurred sending the message
> - */
> - public void sendMessage(byte[] data, boolean waitForAck) throws
> IOException {
> - IOException exception = null;
> - setAttempt(0);
> - try {
> - // first try with existing connection
> - pushMessage(data,false,waitForAck);
> - } catch (IOException x) {
> - SenderState.getSenderState(getDestination()).setSuspect();
> - exception = x;
> - if (log.isTraceEnabled())
> log.trace(sm.getString("bioSender.send.again",
> getAddress().getHostAddress(),Integer.valueOf(getPort())),x);
> - while ( getAttempt()<getMaxRetryAttempts() ) {
> - try {
> - setAttempt(getAttempt()+1);
> - // second try with fresh connection
> - pushMessage(data, true,waitForAck);
> - exception = null;
> - } catch (IOException xx) {
> - exception = xx;
> - closeSocket();
> - }
> - }
> - } finally {
> - setRequestCount(getRequestCount()+1);
> - keepalive();
> - if ( exception != null ) throw exception;
> - }
> - }
> -
> -
> - @Override
> - public String toString() {
> - StringBuilder buf = new StringBuilder("DataSender[(");
> - buf.append(super.toString()).append(")");
> -
> buf.append(getAddress()).append(":").append(getPort()).append("]");
> - return buf.toString();
> - }
> -
> - // ---------------------------------------------------------
> Protected Methods
> -
> - /**
> - * Open real socket and set time out when waitForAck is enabled
> - * is socket open return directly.
> - * @throws IOException Error opening socket
> - */
> - protected void openSocket() throws IOException {
> - if(isConnected()) return ;
> - try {
> - socket = new Socket();
> - InetSocketAddress sockaddr = new
> InetSocketAddress(getAddress(), getPort());
> - socket.connect(sockaddr,(int)getTimeout());
> - socket.setSendBufferSize(getTxBufSize());
> - socket.setReceiveBufferSize(getRxBufSize());
> - socket.setSoTimeout( (int) getTimeout());
> - socket.setTcpNoDelay(getTcpNoDelay());
> - socket.setKeepAlive(getSoKeepAlive());
> - socket.setReuseAddress(getSoReuseAddress());
> - socket.setOOBInline(getOoBInline());
> - socket.setSoLinger(getSoLingerOn(),getSoLingerTime());
> - socket.setTrafficClass(getSoTrafficClass());
> - setConnected(true);
> - soOut = socket.getOutputStream();
> - soIn = socket.getInputStream();
> - setRequestCount(0);
> - setConnectTime(System.currentTimeMillis());
> - if (log.isDebugEnabled())
> - log.debug(sm.getString("bioSender.openSocket",
> getAddress().getHostAddress(), Integer.valueOf(getPort()),
> Long.valueOf(0)));
> - } catch (IOException ex1) {
> - SenderState.getSenderState(getDestination()).setSuspect();
> - if (log.isDebugEnabled())
> -
> log.debug(sm.getString("bioSender.openSocket.failure",getAddress().getHostAddress(),
> Integer.valueOf(getPort()), Long.valueOf(0)), ex1);
> - throw ex1;
> - }
> -
> - }
> -
> - /**
> - * Close socket.
> - *
> - * @see #disconnect()
> - */
> - protected void closeSocket() {
> - if(isConnected()) {
> - if (socket != null) {
> - try {
> - socket.close();
> - } catch (IOException x) {
> - // Ignore
> - } finally {
> - socket = null;
> - soOut = null;
> - soIn = null;
> - }
> - }
> - setRequestCount(0);
> - setConnected(false);
> - if (log.isDebugEnabled())
> -
> log.debug(sm.getString("bioSender.closeSocket",getAddress().getHostAddress(),
> Integer.valueOf(getPort()), Long.valueOf(0)));
> - }
> - }
> -
> - /**
> - * Push messages with only one socket at a time
> - * Wait for ack is needed and make auto retry when write message is
> failed.
> - * After sending error close and reopen socket again.
> - *
> - * After successful sending update stats
> - *
> - * WARNING: Subclasses must be very careful that only one thread call
> this pushMessage at once!!!
> - *
> - * @see #closeSocket()
> - * @see #openSocket()
> - * @see #sendMessage(byte[], boolean)
> - *
> - * @param data Data to send
> - * @param reconnect Do a reconnect (close socket then reopen)
> - * @param waitForAck Wait for an acknowledgement
> - * @throws IOException IO error writing data
> - * @since 5.5.10
> - */
> -
> - protected void pushMessage(byte[] data, boolean reconnect, boolean
> waitForAck) throws IOException {
> - keepalive();
> - if ( reconnect ) closeSocket();
> - if (!isConnected()) openSocket();
> - soOut.write(data);
> - soOut.flush();
> - if (waitForAck) waitForAck();
> - SenderState.getSenderState(getDestination()).setReady();
> -
> - }
> -
> - /**
> - * Wait for Acknowledgement from other server.
> - * FIXME Please, not wait only for three characters, better control
> that the wait ack message is correct.
> - * @throws IOException An IO error occurred
> - */
> - protected void waitForAck() throws java.io.IOException {
> - try {
> - boolean ackReceived = false;
> - boolean failAckReceived = false;
> - ackbuf.clear();
> - int bytesRead = 0;
> - int i = soIn.read();
> - while ((i != -1) && (bytesRead <
> Constants.ACK_COMMAND.length)) {
> - bytesRead++;
> - byte d = (byte)i;
> - ackbuf.append(d);
> - if (ackbuf.doesPackageExist() ) {
> - byte[] ackcmd =
> ackbuf.extractDataPackage(true).getBytes();
> - ackReceived =
> Arrays.equals(ackcmd,org.apache.catalina.tribes.transport.Constants.ACK_DATA);
> - failAckReceived =
> Arrays.equals(ackcmd,org.apache.catalina.tribes.transport.Constants.FAIL_ACK_DATA);
> - ackReceived = ackReceived || failAckReceived;
> - break;
> - }
> - i = soIn.read();
> - }
> - if (!ackReceived) {
> - if (i == -1) throw new
> IOException(sm.getString("bioSender.ack.eof",getAddress(),
> Integer.valueOf(socket.getLocalPort())));
> - else throw new
> IOException(sm.getString("bioSender.ack.wrong",getAddress(),
> Integer.valueOf(socket.getLocalPort())));
> - } else if ( failAckReceived && getThrowOnFailedAck()) {
> - throw new
> RemoteProcessException(sm.getString("bioSender.fail.AckReceived"));
> - }
> - } catch (IOException x) {
> - String errmsg = sm.getString("bioSender.ack.missing",
> getAddress(), Integer.valueOf(socket.getLocalPort()),
> Long.valueOf(getTimeout()));
> - if ( SenderState.getSenderState(getDestination()).isReady() )
> {
> - SenderState.getSenderState(getDestination()).setSuspect();
> - if ( log.isWarnEnabled() ) log.warn(errmsg, x);
> - } else {
> - if ( log.isDebugEnabled() )log.debug(errmsg, x);
> - }
> - throw x;
> - } finally {
> - ackbuf.clear();
> - }
> - }
> -}
> diff --git
> a/java/org/apache/catalina/tribes/transport/bio/LocalStrings.properties
> b/java/org/apache/catalina/tribes/transport/bio/LocalStrings.properties
> deleted file mode 100644
> index 089e44a..0000000
> --- a/java/org/apache/catalina/tribes/transport/bio/LocalStrings.properties
> +++ /dev/null
> @@ -1,40 +0,0 @@
> -# Licensed to the Apache Software Foundation (ASF) under one or more
> -# contributor license agreements. See the NOTICE file distributed with
> -# this work for additional information regarding copyright ownership.
> -# The ASF licenses this file to You under the Apache License, Version 2.0
> -# (the "License"); you may not use this file except in compliance with
> -# the License. You may obtain a copy of the License at
> -#
> -# http://www.apache.org/licenses/LICENSE-2.0
> -#
> -# Unless required by applicable law or agreed to in writing, software
> -# distributed under the License is distributed on an "AS IS" BASIS,
> -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> -# See the License for the specific language governing permissions and
> -# limitations under the License.
> -
> -bioReceiver.already.started=ServerSocket already started
> -bioReceiver.run.fail=Unable to run replication listener.
> -bioReceiver.socket.closeFailed=Failed to close socket
> -bioReceiver.start.fail=Unable to start cluster receiver
> -bioReceiver.threadpool.fail=ThreadPool cannot be initialized. Listener
> not started
> -bioReceiver.threads.busy=All BIO server replication threads are busy,
> unable to handle more requests until a thread is freed up.
> -
> -bioReplicationTask.messageDataReceived.error=Error thrown from
> messageDataReceived.
> -bioReplicationTask.reader.closeFailed=Failed to close reader
> -bioReplicationTask.socket.closeFailed=Failed to close socket
> -bioReplicationTask.unable.sendAck=Unable to send ACK back through
> channel, channel disconnected?: [{0}]
> -bioReplicationTask.unable.service=Unable to service bio socket
> -
> -bioSender.ack.eof=EOF reached at local port [{0}:{1,number,integer}]
> -bioSender.ack.missing=Unable to read acknowledgement from
> [{0}:{1,number,integer}] in {2,number,integer} ms. Disconnecting socket,
> and trying again.
> -bioSender.ack.wrong=Missing correct ACK after 10 bytes read at local port
> [{0}:{1,number,integer}]
> -bioSender.closeSocket=Sender close socket to [{0}:{1,number,integer}]
> (close count {2,number,integer})
> -bioSender.disconnect=Sender disconnect from [{0}:{1,number,integer}]
> (disconnect count {2,number,integer})
> -bioSender.fail.AckReceived=Received a failed
> ack:org.apache.catalina.tribes.transport.Constants.FAIL_ACK_DATA
> -bioSender.openSocket=Sender open socket to [{0}:{1,number,integer}] (open
> count {2,number,integer})
> -bioSender.openSocket.failure=Open sender socket [{0}:{1,number,integer}]
> failure! (open failure count {2,number,integer})
> -bioSender.send.again=Send data again to [{0}:{1,number,integer}]
> -
> -pooledMultiSender.retrieve.fail=Unable to retrieve a sender from the
> sender pool
> -pooledMultiSender.unable.retrieve.sender=Unable to retrieve a data
> sender, time out([{0}] ms) error.
> diff --git
> a/java/org/apache/catalina/tribes/transport/bio/LocalStrings_cs.properties
> b/java/org/apache/catalina/tribes/transport/bio/LocalStrings_cs.properties
> deleted file mode 100644
> index 9e6f09c..0000000
> ---
> a/java/org/apache/catalina/tribes/transport/bio/LocalStrings_cs.properties
> +++ /dev/null
> @@ -1,22 +0,0 @@
> -# Licensed to the Apache Software Foundation (ASF) under one or more
> -# contributor license agreements. See the NOTICE file distributed with
> -# this work for additional information regarding copyright ownership.
> -# The ASF licenses this file to You under the Apache License, Version 2.0
> -# (the "License"); you may not use this file except in compliance with
> -# the License. You may obtain a copy of the License at
> -#
> -# http://www.apache.org/licenses/LICENSE-2.0
> -#
> -# Unless required by applicable law or agreed to in writing, software
> -# distributed under the License is distributed on an "AS IS" BASIS,
> -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> -# See the License for the specific language governing permissions and
> -# limitations under the License.
> -
> -bioReceiver.socket.closeFailed=Uzavření socketu selhalo
> -
> -bioReplicationTask.socket.closeFailed=Uzavření socketu selhalo
> -
> -bioSender.ack.wrong=Chybí správné ACK po čtení 10 bytů na portu
> [{0}:{1,number,integer}]
> -bioSender.openSocket=Odesílatel otevřel socket na
> [{0}:{1,number,integer}] (počet otevřených {2,number,integer})
> -bioSender.send.again=Poslat data znovu na [{0}:{1,number,integer}]
> diff --git
> a/java/org/apache/catalina/tribes/transport/bio/LocalStrings_de.properties
> b/java/org/apache/catalina/tribes/transport/bio/LocalStrings_de.properties
> deleted file mode 100644
> index 891f863..0000000
> ---
> a/java/org/apache/catalina/tribes/transport/bio/LocalStrings_de.properties
> +++ /dev/null
> @@ -1,18 +0,0 @@
> -# Licensed to the Apache Software Foundation (ASF) under one or more
> -# contributor license agreements. See the NOTICE file distributed with
> -# this work for additional information regarding copyright ownership.
> -# The ASF licenses this file to You under the Apache License, Version 2.0
> -# (the "License"); you may not use this file except in compliance with
> -# the License. You may obtain a copy of the License at
> -#
> -# http://www.apache.org/licenses/LICENSE-2.0
> -#
> -# Unless required by applicable law or agreed to in writing, software
> -# distributed under the License is distributed on an "AS IS" BASIS,
> -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> -# See the License for the specific language governing permissions and
> -# limitations under the License.
> -
> -bioReceiver.socket.closeFailed=Socket konnte nicht geschlossen werden
> -
> -bioSender.send.again=Sende Daten erneut an [{0}:{1,number,integer}]
> diff --git
> a/java/org/apache/catalina/tribes/transport/bio/LocalStrings_es.properties
> b/java/org/apache/catalina/tribes/transport/bio/LocalStrings_es.properties
> deleted file mode 100644
> index 7a92ed6..0000000
> ---
> a/java/org/apache/catalina/tribes/transport/bio/LocalStrings_es.properties
> +++ /dev/null
> @@ -1,27 +0,0 @@
> -# Licensed to the Apache Software Foundation (ASF) under one or more
> -# contributor license agreements. See the NOTICE file distributed with
> -# this work for additional information regarding copyright ownership.
> -# The ASF licenses this file to You under the Apache License, Version 2.0
> -# (the "License"); you may not use this file except in compliance with
> -# the License. You may obtain a copy of the License at
> -#
> -# http://www.apache.org/licenses/LICENSE-2.0
> -#
> -# Unless required by applicable law or agreed to in writing, software
> -# distributed under the License is distributed on an "AS IS" BASIS,
> -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> -# See the License for the specific language governing permissions and
> -# limitations under the License.
> -
> -bioReceiver.socket.closeFailed=Fallo al cerrar el socket
> -
> -bioReplicationTask.reader.closeFailed=Fallo al cerrar el lector
> -
> -bioSender.ack.eof=EOF alcanzado en puerto local [{0}:{1,number,integer}]
> -bioSender.ack.missing=No puedo leer reconocimiento desde
> [{0}:{1,number,integer}] en {2,number,integer} ms. Desconectando conector e
> intentando otra vez.
> -bioSender.ack.wrong=Falta ACK correcto tras 10 bytes leídos en puerto
> local [{0}:{1,number,integer}]
> -bioSender.closeSocket=El remitente cerró el conector con
> [{0}:{1,number,integer}] (contador de cierre {2,number,integer})
> -bioSender.disconnect=Remitente desconectado de [{0}:{1,number,integer}]
> (contador de desconexión {2,number,integer})
> -bioSender.openSocket=Remitente abrió conector con
> [{0}:{1,number,integer}] (contador de apertura {2,number,integer})
> -bioSender.openSocket.failure=¡No pude abrir conector de remitente
> [{0}:{1,number,integer}]! (contador de fallo de apertura {2,number,integer})
> -bioSender.send.again=Enviar datos de nuevo a [{0}:{1,number,integer}]
> diff --git
> a/java/org/apache/catalina/tribes/transport/bio/LocalStrings_fr.properties
> b/java/org/apache/catalina/tribes/transport/bio/LocalStrings_fr.properties
> deleted file mode 100644
> index a746bf8..0000000
> ---
> a/java/org/apache/catalina/tribes/transport/bio/LocalStrings_fr.properties
> +++ /dev/null
> @@ -1,40 +0,0 @@
> -# Licensed to the Apache Software Foundation (ASF) under one or more
> -# contributor license agreements. See the NOTICE file distributed with
> -# this work for additional information regarding copyright ownership.
> -# The ASF licenses this file to You under the Apache License, Version 2.0
> -# (the "License"); you may not use this file except in compliance with
> -# the License. You may obtain a copy of the License at
> -#
> -# http://www.apache.org/licenses/LICENSE-2.0
> -#
> -# Unless required by applicable law or agreed to in writing, software
> -# distributed under the License is distributed on an "AS IS" BASIS,
> -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> -# See the License for the specific language governing permissions and
> -# limitations under the License.
> -
> -bioReceiver.already.started=Le ServerSocket a déjà démarré
> -bioReceiver.run.fail=Impossible d'exécuter l’écouteur de réplication
> -bioReceiver.socket.closeFailed=Echec de fermeture de la connection
> -bioReceiver.start.fail=Impossible de démarrer le receveur du cluster
> -bioReceiver.threadpool.fail=Le ThreadPool n'a pas pu être initialisé,
> l'écouteur n'a pas démarré
> -bioReceiver.threads.busy=Tous les fils d'exécution du serveur de
> réplication sont occupés, impossible de traiter plus de requêtes avant
> qu'un ne se libère
> -
> -bioReplicationTask.messageDataReceived.error=Erreur lors de
> messageDataReceived
> -bioReplicationTask.reader.closeFailed=Echec de fermeture du lecteur
> -bioReplicationTask.socket.closeFailed=Ecech de la fermeture du socket
> -bioReplicationTask.unable.sendAck=Impossible de renvoyer une confirmation
> par le canal, il peut être déconnecté : [{0}]
> -bioReplicationTask.unable.service=Incapable de traiter un socket BIO
> -
> -bioSender.ack.eof=EOF recontré sur le port local [{0}:{1,number,integer}]
> -bioSender.ack.missing=Incapable de lire l'accusé de réception de
> [{0}:{1,number,integer}] en {2,number,integer] ms. Déconnexion de la socket
> et nouvel tentative.
> -bioSender.ack.wrong=Il manque un ACK correct après la lecture de 10
> octets sur le port local [{0}:{1,number,integer}]
> -bioSender.closeSocket=Sender fermeture du socket vers
> [{0}:{1,number,integer}] (nombre de fermetures {2,number,integer})
> -bioSender.disconnect=L'envoyeur s'est déconnecté de
> [{0}:{1,number,integer}] (nombre de déconnections {2,number,integer})
> -bioSender.fail.AckReceived=Reçu une confirmation en échec :
> org.apache.catalina.tribes.transport.Constants.FAIL_ACK_DATA
> -bioSender.openSocket=L''expéditeur ouvre une socket vers
> [{0}:{1,number,integer}] ({2,number,integer} sockets ouvertes})
> -bioSender.openSocket.failure=Echec d'ouverture du socket d'envoi
> [{0}:{1,number,integer} (nombre d'écecs d'ouverture {2,number,integer})
> -bioSender.send.again=Envoyer les données à nouveau à
> [{0}:{1,number,integer}]
> -
> -pooledMultiSender.retrieve.fail=Impossible d'obtenir un envoyeur à partir
> du pool
> -pooledMultiSender.unable.retrieve.sender=Impossible de récupéré un
> expéditeur de données. délai d''attente ([{0}] ms) dépassé
> diff --git
> a/java/org/apache/catalina/tribes/transport/bio/LocalStrings_ja.properties
> b/java/org/apache/catalina/tribes/transport/bio/LocalStrings_ja.properties
> deleted file mode 100644
> index 2fde08e..0000000
> ---
> a/java/org/apache/catalina/tribes/transport/bio/LocalStrings_ja.properties
> +++ /dev/null
> @@ -1,40 +0,0 @@
> -# Licensed to the Apache Software Foundation (ASF) under one or more
> -# contributor license agreements. See the NOTICE file distributed with
> -# this work for additional information regarding copyright ownership.
> -# The ASF licenses this file to You under the Apache License, Version 2.0
> -# (the "License"); you may not use this file except in compliance with
> -# the License. You may obtain a copy of the License at
> -#
> -# http://www.apache.org/licenses/LICENSE-2.0
> -#
> -# Unless required by applicable law or agreed to in writing, software
> -# distributed under the License is distributed on an "AS IS" BASIS,
> -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> -# See the License for the specific language governing permissions and
> -# limitations under the License.
> -
> -bioReceiver.already.started=サーバーソケットはすでに開始しています。
> -bioReceiver.run.fail=レプリケーションリスナーを実行できません。
> -bioReceiver.socket.closeFailed=ソケットを切断できませんでした。
> -bioReceiver.start.fail=クラスタレシーバを起動できません
> -bioReceiver.threadpool.fail=スレッドプールを初期化できません。リスナーを開始しませんでした。
> -bioReceiver.threads.busy=全ての BIO
> サーバーレプリケーションスレッドがビジー状態です。スレッドが解放されるまで新しいリクエストは処理できません。
> -
> -bioReplicationTask.messageDataReceived.error=messageDataReceivedから送出されたエラー
> -bioReplicationTask.reader.closeFailed=Readerを閉じることに失敗しました。
> -bioReplicationTask.socket.closeFailed=ソケットクロースに失敗
> -bioReplicationTask.unable.sendAck=チャンネルへACKを送信できません。チャンネルが切断されているかもしれません:
> [{0}]
> -bioReplicationTask.unable.service=bio ソケットを開始できません。
> -
> -bioSender.ack.eof=ローカルポート[{0}:{1、number、integer}]でEOF
> -bioSender.ack.missing=[{0}:{1,number,integer}] から [{2,number,integer}] ms
> 以内に確認応答(ACK)を読み取ることができませんでした。ソケットを切断して再試行してください。
> -bioSender.ack.wrong=ローカルポート [{0}:{1,number,integer}] から 10 バイト読み込んだ後に正しい
> ACK が見つかりません。
> -bioSender.closeSocket=[{0}:{1、number、integer}](close count
> {2、number、integer})に送信側のクローズソケット
>
> -bioSender.disconnect=[{0}:{1,number,integer}](切断カウント{2,number,integer})からのSender切断
>
> -bioSender.fail.AckReceived=失敗したACK:org.apache.catalina.tribes.transport.Constants.FAIL_ACK_DATAの受信
> -bioSender.openSocket=Sender オブジェクトが [{0}:{1,number,integer}] (接続数
> {2,number,integer}) へソケット接続を開始しました。
> -bioSender.openSocket.failure=開いているSender側ソケット[{0}:{1,number,integer}]失敗!
> (オープン失敗カウント{2,number,integer}))
> -bioSender.send.again=[{0}:{1,number,integer}] へデータを再送します。
> -
> -pooledMultiSender.retrieve.fail=SenderプールからSenderを取得できません。
> -pooledMultiSender.unable.retrieve.sender=データSenderを取得できません。タイムアウト([{0}]
> ms)エラー。
> diff --git
> a/java/org/apache/catalina/tribes/transport/bio/LocalStrings_ko.properties
> b/java/org/apache/catalina/tribes/transport/bio/LocalStrings_ko.properties
> deleted file mode 100644
> index 37bc523..0000000
> ---
> a/java/org/apache/catalina/tribes/transport/bio/LocalStrings_ko.properties
> +++ /dev/null
> @@ -1,40 +0,0 @@
> -# Licensed to the Apache Software Foundation (ASF) under one or more
> -# contributor license agreements. See the NOTICE file distributed with
> -# this work for additional information regarding copyright ownership.
> -# The ASF licenses this file to You under the Apache License, Version 2.0
> -# (the "License"); you may not use this file except in compliance with
> -# the License. You may obtain a copy of the License at
> -#
> -# http://www.apache.org/licenses/LICENSE-2.0
> -#
> -# Unless required by applicable law or agreed to in writing, software
> -# distributed under the License is distributed on an "AS IS" BASIS,
> -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> -# See the License for the specific language governing permissions and
> -# limitations under the License.
> -
> -bioReceiver.already.started=ServerSocket이 이미 시작되었습니다.
> -bioReceiver.run.fail=복제 리스너를 실행할 수 없습니다.
> -bioReceiver.socket.closeFailed=소켓을 닫지 못했습니다.
> -bioReceiver.start.fail=클러스터 Receiver를 시작할 수 없습니다.
> -bioReceiver.threadpool.fail=쓰레드풀이 초기화될 수 없습니다. 리스너가 시작되지 않았습니다.
> -bioReceiver.threads.busy=모든 BIO 서버 복제 쓰레드들이 작업 중입니다. 유휴 쓰레드가 하나라도 생기기
> 전에는, 더 이상 요청을 처리할 수 없습니다.
> -
> -bioReplicationTask.messageDataReceived.error=messageDataReceived로부터 오류 발생
> -bioReplicationTask.reader.closeFailed=Reader를 닫지 못했습니다.
> -bioReplicationTask.socket.closeFailed=소켓을 닫지 못했습니다.
> -bioReplicationTask.unable.sendAck=채널을 통해 ACK을 되돌려 보낼 수 없습니다. 채널의 연결이
> 끊겼나요?: [{0}]
> -bioReplicationTask.unable.service=BIO 소켓을 서비스할 수 없습니다.
> -
> -bioSender.ack.eof=로컬 포트 [{0}:{1,number,integer}]에서 EOF에 도달했습니다.
> -bioSender.ack.missing=[{0}:{1,number,integer}](으)로부터 ACK을
> {2,number,integer} 밀리초 내에 읽을 수 없습니다. 소켓 연결을 끊고, 다시 시도합니다.
> -bioSender.ack.wrong=10 바이트들을 로컬 포트 [{0}]에서 읽고 난 후 올바른 ACK를 받지 못했습니다:
> {1,number,integer}]
> -bioSender.closeSocket=Sender가 소켓 닫기 메시지를 [{0}:{1,number,integer}]에 전송합니다.
> (전송 회수: {2,number,integer})
> -bioSender.disconnect=Sender가 [{0}:{1,number,integer}](으)로부터 연결을 끊습니다. (연결
> 끊기 회수: {2,number,integer})
> -bioSender.fail.AckReceived=실패한 ACK을 받았습니다:
> org.apache.catalina.tribes.transport.Constants.FAIL_ACK_DATA
> -bioSender.openSocket=Sender가 [{0}:{1,number,integer}]을(를) 향해 소켓을 엽니다. (연
> 소켓 개수: {2,number,integer})
> -bioSender.openSocket.failure=Sender 소켓 [{0}:{1,number,integer}]을(를) 열지
> 못했습니다! (열기 실패 회수: {2,number,integer})
> -bioSender.send.again=데이터를 [{0}:{1,number,integer}](으)로 다시 전송합니다.
> -
> -pooledMultiSender.retrieve.fail=Sender 풀로부터 sender를 검색할 수 없습니다.
> -pooledMultiSender.unable.retrieve.sender=데이터 sender를 조회할 수 없습니다. 제한 시간 초과
> ([{0}] 밀리초) 오류 발생.
> diff --git
> a/java/org/apache/catalina/tribes/transport/bio/LocalStrings_pt_BR.properties
> b/java/org/apache/catalina/tribes/transport/bio/LocalStrings_pt_BR.properties
> deleted file mode 100644
> index a56f384..0000000
> ---
> a/java/org/apache/catalina/tribes/transport/bio/LocalStrings_pt_BR.properties
> +++ /dev/null
> @@ -1,18 +0,0 @@
> -# Licensed to the Apache Software Foundation (ASF) under one or more
> -# contributor license agreements. See the NOTICE file distributed with
> -# this work for additional information regarding copyright ownership.
> -# The ASF licenses this file to You under the Apache License, Version 2.0
> -# (the "License"); you may not use this file except in compliance with
> -# the License. You may obtain a copy of the License at
> -#
> -# http://www.apache.org/licenses/LICENSE-2.0
> -#
> -# Unless required by applicable law or agreed to in writing, software
> -# distributed under the License is distributed on an "AS IS" BASIS,
> -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> -# See the License for the specific language governing permissions and
> -# limitations under the License.
> -
> -bioReceiver.socket.closeFailed=Falha ao encerrar a conexão do socket
> -
> -bioSender.send.again=Enviar dados novamente para [{0}:{1,number,integer}]
> diff --git
> a/java/org/apache/catalina/tribes/transport/bio/LocalStrings_ru.properties
> b/java/org/apache/catalina/tribes/transport/bio/LocalStrings_ru.properties
> deleted file mode 100644
> index 1d40449..0000000
> ---
> a/java/org/apache/catalina/tribes/transport/bio/LocalStrings_ru.properties
> +++ /dev/null
> @@ -1,16 +0,0 @@
> -# Licensed to the Apache Software Foundation (ASF) under one or more
> -# contributor license agreements. See the NOTICE file distributed with
> -# this work for additional information regarding copyright ownership.
> -# The ASF licenses this file to You under the Apache License, Version 2.0
> -# (the "License"); you may not use this file except in compliance with
> -# the License. You may obtain a copy of the License at
> -#
> -# http://www.apache.org/licenses/LICENSE-2.0
> -#
> -# Unless required by applicable law or agreed to in writing, software
> -# distributed under the License is distributed on an "AS IS" BASIS,
> -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> -# See the License for the specific language governing permissions and
> -# limitations under the License.
> -
> -bioSender.send.again=Послать данные ещё раз в [{0}:{1,number,integer}]
> diff --git
> a/java/org/apache/catalina/tribes/transport/bio/MultipointBioSender.java
> b/java/org/apache/catalina/tribes/transport/bio/MultipointBioSender.java
> deleted file mode 100644
> index 5edd1e1..0000000
> ---
> a/java/org/apache/catalina/tribes/transport/bio/MultipointBioSender.java
> +++ /dev/null
> @@ -1,156 +0,0 @@
> -/*
> - * Licensed to the Apache Software Foundation (ASF) under one or more
> - * contributor license agreements. See the NOTICE file distributed with
> - * this work for additional information regarding copyright ownership.
> - * The ASF licenses this file to You under the Apache License, Version 2.0
> - * (the "License"); you may not use this file except in compliance with
> - * the License. You may obtain a copy of the License at
> - *
> - * http://www.apache.org/licenses/LICENSE-2.0
> - *
> - * Unless required by applicable law or agreed to in writing, software
> - * distributed under the License is distributed on an "AS IS" BASIS,
> - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> - * See the License for the specific language governing permissions and
> - * limitations under the License.
> - */
> -
> -package org.apache.catalina.tribes.transport.bio;
> -
> -import java.io.IOException;
> -import java.util.HashMap;
> -import java.util.Map;
> -
> -import org.apache.catalina.tribes.Channel;
> -import org.apache.catalina.tribes.ChannelException;
> -import org.apache.catalina.tribes.ChannelMessage;
> -import org.apache.catalina.tribes.Member;
> -import org.apache.catalina.tribes.io.ChannelData;
> -import org.apache.catalina.tribes.io.XByteBuffer;
> -import org.apache.catalina.tribes.transport.AbstractSender;
> -import org.apache.catalina.tribes.transport.MultiPointSender;
> -
> -public class MultipointBioSender extends AbstractSender implements
> MultiPointSender {
> - public MultipointBioSender() {
> - // NO-OP
> - }
> -
> - protected final HashMap<Member, BioSender> bioSenders = new
> HashMap<>();
> -
> - @Override
> - public synchronized void sendMessage(Member[] destination,
> ChannelMessage msg) throws ChannelException {
> - byte[] data = XByteBuffer.createDataPackage((ChannelData)msg);
> - BioSender[] senders = setupForSend(destination);
> - ChannelException cx = null;
> - for ( int i=0; i<senders.length; i++ ) {
> - try {
> -
> senders[i].sendMessage(data,(msg.getOptions()&Channel.SEND_OPTIONS_USE_ACK)==Channel.SEND_OPTIONS_USE_ACK);
> - } catch (Exception x) {
> - if (cx == null) cx = new ChannelException(x);
> - cx.addFaultyMember(destination[i],x);
> - }
> - }
> - if (cx!=null ) throw cx;
> - }
> -
> -
> -
> - protected BioSender[] setupForSend(Member[] destination) throws
> ChannelException {
> - ChannelException cx = null;
> - BioSender[] result = new BioSender[destination.length];
> - for ( int i=0; i<destination.length; i++ ) {
> - try {
> - BioSender sender = bioSenders.get(destination[i]);
> - if (sender == null) {
> - sender = new BioSender();
> - AbstractSender.transferProperties(this,sender);
> - sender.setDestination(destination[i]);
> - bioSenders.put(destination[i], sender);
> - }
> - result[i] = sender;
> - if (!result[i].isConnected() ) result[i].connect();
> - result[i].keepalive();
> - }catch (Exception x ) {
> - if ( cx== null ) cx = new ChannelException(x);
> - cx.addFaultyMember(destination[i],x);
> - }
> - }
> - if ( cx!=null ) throw cx;
> - else return result;
> - }
> -
> - @Override
> - public void connect() throws IOException {
> - //do nothing, we connect on demand
> - setConnected(true);
> - }
> -
> -
> - private synchronized void close() throws ChannelException {
> - ChannelException x = null;
> - Object[] members = bioSenders.keySet().toArray();
> - for (int i=0; i<members.length; i++ ) {
> - Member mbr = (Member)members[i];
> - try {
> - BioSender sender = bioSenders.get(mbr);
> - sender.disconnect();
> - }catch ( Exception e ) {
> - if ( x == null ) x = new ChannelException(e);
> - x.addFaultyMember(mbr,e);
> - }
> - bioSenders.remove(mbr);
> - }
> - if ( x != null ) throw x;
> - }
> -
> - @Override
> - public void add(Member member) {
> - // NO-OP
> - // Members are defined by the array of members specified in the
> call to
> - // sendMessage()
> - }
> -
> - @Override
> - public void remove(Member member) {
> - //disconnect senders
> - BioSender sender = bioSenders.remove(member);
> - if ( sender != null ) sender.disconnect();
> - }
> -
> -
> - @Override
> - public synchronized void disconnect() {
> - try {
> - close();
> - } catch (Exception x) {
> - // Ignore
> - }
> - setConnected(false);
> - }
> -
> - @Override
> - protected void finalize() throws Throwable {
> - try {
> - disconnect();
> - } catch (Exception e) {
> - // Ignore
> - }
> - super.finalize();
> - }
> -
> -
> - @Override
> - public boolean keepalive() {
> - boolean result = false;
> - @SuppressWarnings("unchecked")
> - Map.Entry<Member,BioSender>[] entries =
> bioSenders.entrySet().toArray(new Map.Entry[0]);
> - for ( int i=0; i<entries.length; i++ ) {
> - BioSender sender = entries[i].getValue();
> - if ( sender.keepalive() ) {
> - bioSenders.remove(entries[i].getKey());
> - }
> - }
> - return result;
> - }
> -
> -}
> \ No newline at end of file
> diff --git
> a/java/org/apache/catalina/tribes/transport/bio/PooledMultiSender.java
> b/java/org/apache/catalina/tribes/transport/bio/PooledMultiSender.java
> deleted file mode 100644
> index 8c92311..0000000
> --- a/java/org/apache/catalina/tribes/transport/bio/PooledMultiSender.java
> +++ /dev/null
> @@ -1,62 +0,0 @@
> -/*
> - * Licensed to the Apache Software Foundation (ASF) under one or more
> - * contributor license agreements. See the NOTICE file distributed with
> - * this work for additional information regarding copyright ownership.
> - * The ASF licenses this file to You under the Apache License, Version 2.0
> - * (the "License"); you may not use this file except in compliance with
> - * the License. You may obtain a copy of the License at
> - *
> - * http://www.apache.org/licenses/LICENSE-2.0
> - *
> - * Unless required by applicable law or agreed to in writing, software
> - * distributed under the License is distributed on an "AS IS" BASIS,
> - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> - * See the License for the specific language governing permissions and
> - * limitations under the License.
> - */
> -package org.apache.catalina.tribes.transport.bio;
> -
> -import org.apache.catalina.tribes.ChannelException;
> -import org.apache.catalina.tribes.ChannelMessage;
> -import org.apache.catalina.tribes.Member;
> -import org.apache.catalina.tribes.transport.AbstractSender;
> -import org.apache.catalina.tribes.transport.DataSender;
> -import org.apache.catalina.tribes.transport.MultiPointSender;
> -import org.apache.catalina.tribes.transport.PooledSender;
> -import org.apache.catalina.tribes.util.StringManager;
> -
> -public class PooledMultiSender extends PooledSender {
> -
> - protected static final StringManager sm =
> StringManager.getManager(PooledMultiSender.class);
> -
> - public PooledMultiSender() {
> - // NO-OP
> - }
> -
> - @Override
> - public void sendMessage(Member[] destination, ChannelMessage msg)
> throws ChannelException {
> - MultiPointSender sender = null;
> - try {
> - sender = (MultiPointSender)getSender();
> - if (sender == null) {
> - ChannelException cx = new ChannelException(sm.getString(
> - "pooledMultiSender.unable.retrieve.sender",
> Long.toString(getMaxWait())));
> - for (int i = 0; i < destination.length; i++)
> - cx.addFaultyMember(destination[i], new
> NullPointerException(sm.getString("pooledMultiSender.retrieve.fail")));
> - throw cx;
> - } else {
> - sender.sendMessage(destination, msg);
> - }
> - sender.keepalive();
> - }finally {
> - if ( sender != null ) returnSender(sender);
> - }
> - }
> -
> - @Override
> - public DataSender getNewDataSender() {
> - MultipointBioSender sender = new MultipointBioSender();
> - AbstractSender.transferProperties(this,sender);
> - return sender;
> - }
> -}
> diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
> index eb7c435..61129f8 100644
> --- a/webapps/docs/changelog.xml
> +++ b/webapps/docs/changelog.xml
> @@ -157,6 +157,10 @@
>
> <code>org.apache.catalina.tribes.io.BufferPool.DEFAULT_POOL_SIZE</code>
> system property to configure its size. (remm)
> </update>
> + <update>
> + Remove java.io based Tribes receiver and sender, in favor of NIO
> which
> + was the default. (remm)
> + </update>
> </changelog>
> </subsection>
> <subsection name="Web applications">
> diff --git a/webapps/docs/config/cluster-receiver.xml
> b/webapps/docs/config/cluster-receiver.xml
> index 9bc1b53..7edf9e7 100644
> --- a/webapps/docs/config/cluster-receiver.xml
> +++ b/webapps/docs/config/cluster-receiver.xml
> @@ -46,11 +46,9 @@
> </p>
> </section>
>
> -<section name="Blocking vs Non-Blocking Receiver">
> +<section name="Receiver">
> <p>
> - The receiver supports both a non blocking,
> <code>org.apache.catalina.tribes.transport.nio.NioReceiver</code>, and a
> - blocking,
> <code>org.apache.catalina.tribes.transport.bio.BioReceiver</code>. It is
> preferred to use the non blocking receiver
> - to be able to grow your cluster without running into thread
> starvation.<br/>
> + The receiver supports a non blocking
> <code>org.apache.catalina.tribes.transport.nio.NioReceiver</code>
> reciever.<br/>
> Using the non blocking receiver allows you to with a very limited
> thread count to serve a large number of messages.
> Usually the rule is to use 1 thread per node in the cluster for small
> clusters, and then depending on your message frequency
> and your hardware, you'll find an optimal number of threads peak out at
> a certain number.
> @@ -61,11 +59,9 @@
> <subsection name="Common Attributes">
> <attributes>
> <attribute name="className" required="true">
> - The implementation of the receiver component. Two implementations
> available,
> - <code>org.apache.catalina.tribes.transport.nio.NioReceiver</code>
> and
> -
> <code>org.apache.catalina.tribes.transport.bio.BioReceiver</code>.<br/>
> - The
> <code>org.apache.catalina.tribes.transport.nio.NioReceiver</code> is the
> - preferred implementation
> + The implementation of the receiver component.
> + <code>org.apache.catalina.tribes.transport.nio.NioReceiver</code>
> + is provided by Tomcat.
> </attribute>
> <attribute name="address" required="false">
> The address (network interface) to listen for incoming traffic.
> diff --git a/webapps/docs/config/cluster-sender.xml
> b/webapps/docs/config/cluster-sender.xml
> index 66f9707..a539647 100644
> --- a/webapps/docs/config/cluster-sender.xml
> +++ b/webapps/docs/config/cluster-sender.xml
> @@ -62,11 +62,6 @@
> <p>
> The nested element <code><Transport></code> is not required, but
> encouraged, as this is where
> you would set all the socket options for the outgoing messages. Please
> see its attributes below.
> - There are two implementations, in a similar manner to the <a
> href="cluster-receiver.html">receiver</a>, one is non-blocking
> - based and the other is built using blocking IO. <br/>
> -
> <code>org.apache.catalina.tribes.transport.bio.PooledMultiSender</code> is
> the blocking implementation and
> -
> <code>org.apache.catalina.tribes.transport.nio.PooledParallelSender</code>.
> - Parallel delivery is not available for the blocking implementation due
> to the fact that it is blocking a thread on sending data.
> </p>
> </section>
>
> @@ -81,9 +76,9 @@
> <subsection name="Common Transport Attributes">
> <attributes>
> <attribute name="className" required="true">
> - Required, an implementation of the
> <code>org.apache.catalina.tribes.transport.MultiPointSender</code>.<br/>
> - Non-blocking implementation is
> <code>org.apache.catalina.tribes.transport.nio.PooledParallelSender</code><br/>
> - Blocking implementation is
> <code>org.apache.catalina.tribes.transport.bio.PooledMultiSender</code>
> + The implementation of the sender component.
> +
> <code>org.apache.catalina.tribes.transport.nio.PooledParallelSender</code>
> + is provided by Tomcat.
> </attribute>
> <attribute name="rxBufSize" required="false">
> The receive buffer size on the socket.
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: dev-help@tomcat.apache.org
>
>