IOExitProperties.java
package com.ibm.wmqfte.exitroutine.api;
/**
* Properties that determine how WMQFTE treats an {@link IOExitPath} for certain
* aspects of I/O. For example, whether to use intermediate files.
*/
public class IOExitProperties {
private boolean rereadSourceOnRestart = true;
private boolean rechecksumSourceOnRestart = true;
private boolean rechecksumDestinationOnRestart = true;
private boolean useIntermediateFileAtDestination = true;
private boolean requiresSingleThreadedChannelIO = false;
/**
* Determines whether the I/O exit implementation expects the resource to be
* re-read from the start if a transfer is restarted.
*
* @return {@code true} if, on restart, the I/O exit expects the source
* resource to be opened at the beginning and re-read from the
* beginning (the {@link IOExitPath#openForRead(long)} method is
* always invoked with 0L as an argument). {@code false} if, on
* restart, the I/O exit expects the source to be opened at the
* offset that the source agent intends to start reading from (the
* {@link IOExitPath#openForRead(long)} method can be invoked with a
* non-zero value as its argument).
*/
public boolean getRereadSourceOnRestart() {
return rereadSourceOnRestart;
}
/**
* Sets the value to determine whether the I/O exit implementation expects
* the resource to be re-read from the beginning if a transfer is restarted.
* <p>
* The default is {@code true}. The I/O exit should call this method when
* required to change this value.
*
* @param rereadSourceOnRestart
* {@code true} if, on restart, the I/O exit expects the source
* resource to be opened at the beginning and re-read from the
* beginning (the {@link IOExitPath#openForRead(long)} method
* is always invoked with 0L as an argument). {@code false}
* if, on restart, the I/O exit expects the source to be opened
* at the offset that the source agent intends to start reading
* from (the {@link IOExitPath#openForRead(long)} method can be
* invoked with a non-zero value as its argument).
*/
public void setRereadSourceOnRestart(boolean rereadSourceOnRestart) {
this.rereadSourceOnRestart = rereadSourceOnRestart;
}
/**
* Determines whether the I/O exit implementation requires the source
* resource to be re-checksummed if the transfer is restarted.
* Re-checksumming takes place only if the
* {@link #getRereadSourceOnRestart()} method returns {@code true}.
*
* @return {@code true} if, on restart, the I/O exit expects the already-
* transferred portion of the source to be re-checksummed for
* inconsistencies. Use this option in environments
* where the source could be changed during a restart. {@code
* false} if, on restart, the I/O exit does not require the
* already-transferred portion of the source to be re-checksummed.
*/
public boolean getRechecksumSourceOnRestart() {
return rechecksumSourceOnRestart;
}
/**
* Sets the value to determine whether the I/O exit implementation requires
* the source resource to be re-checksummed if the transfer is restarted.
* Re-checksumming takes place only if the
* {@link #getRereadSourceOnRestart()} method returns {@code true}.
* <p>
* The default is {@code true}. The I/O exit should call this method when
* required to change this value.
*
* @param rechecksumSourceOnRestart
* {@code true} if, on restart, the I/O exit expects the already
* transferred portion of the source to be re-checksummed
* for inconsistencies. Use this option in environments
* where the source could be changed during a restart.
* {@code false} if, on restart, the I/O exit does not
* require the already-transferred portion of the source to be
* re-checksummed.
*/
public void setRechecksumSourceOnRestart(boolean rechecksumSourceOnRestart) {
this.rechecksumSourceOnRestart = rechecksumSourceOnRestart;
}
/**
* Determines whether the I/O exit implementation requires the destination
* resource to be re-checksummed if the transfer is restarted.
*
* @return {@code true} if, on restart, the I/O exit expects the already
* transferred portion of the destination to be re-checksummed to
* check for inconsistencies. This option should be used in
* environments where the destination could have been changed while
* a restart is occurring. {@code false} if, on restart, the I/O exit
* does not require the already transferred portion of the
* destination to be re-checksummed.
*/
public boolean getRechecksumDestinationOnRestart() {
return rechecksumDestinationOnRestart;
}
/**
* Sets the value to determine whether the I/O exit implementation requires
* the destination resource to be re-checksummed if the transfer is
* restarted.
* <p>
* The default is {@code true}. The I/O exit should call this method when
* required to change this value.
*
* @param rechecksumDestinationOnRestart
* {@code true} if, on restart, the I/O exit expects the already-
* transferred portion of the destination to be re-checksummed
* for inconsistencies. Use this option in environments
* where the destination could have been changed during a
* restart. {@code false} if, on restart, the I/O exit does not
* require the already-transferred portion of the destination
* to be re-checksummed.
*/
public void setRechecksumDestinationOnRestart(
boolean rechecksumDestinationOnRestart) {
this.rechecksumDestinationOnRestart = rechecksumDestinationOnRestart;
}
/**
* Determines whether the I/O exit implementation requires the use of an
* intermediate file when writing the data at the destination. The
* intermediate file mechanism is typically used to prevent an incomplete
* destination resource from being processed.
*
* @return {@code true} if data should be written to an intermediate file at
* the destination and then renamed (to the requested destination
* path name as specified in the transfer request) after the transfer is
* complete. {@code false} if data should be written directly to the
* requested destination path name without the use of an
* intermediate file.
*/
public boolean getUseIntermediateFileAtDestination() {
return useIntermediateFileAtDestination;
}
/**
* Sets the value to determine whether the I/O exit implementation requires
* the use of an intermediate file when writing the data at the destination.
* The intermediate file mechanism is typically used to prevent an
* incomplete destination resource from being processed.
*
* <p>
* The default is {@code true}. The I/O exit should call this method when
* required to change this value.
*
* @param useIntermediateFileAtDestination
* {@code true} if data should be written to an intermediate file
* at the destination and then renamed (to the requested
* destination path name as specified in the transfer request) after
* the transfer is complete. {@code false} if data should be written
* directly to the requested destination path name without the
* use of an intermediate file
*/
public void setUseIntermediateFileAtDestination(
boolean useIntermediateFileAtDestination) {
this.useIntermediateFileAtDestination = useIntermediateFileAtDestination;
}
/**
* Determines whether the I/O exit implementation requires
* {@link IOExitChannel} instances to be accessed by a single thread only.
*
* @return {@code true} if {@link IOExitChannel} instances are to be
* accessed by a single thread only.
*/
public boolean requiresSingleThreadedChannelIO() {
return requiresSingleThreadedChannelIO;
}
/**
* Sets the value to determine whether the I/O exit implementation requires
* channel operations for a particular instance to be accessed by a
* single thread only.
* <p>
* For certain I/O implementations it is necessary that resource path
* operations such as open, read, write, and close are invoked only from a
* single execution {@link Thread}. When set {@code true}, WMQFTE ensures
* that the following are invoked on a single thread:
* <ul>
* <li>{@link IOExitResourcePath#openForRead(long) method and all methods of
* the returned {@link IOExitChannel} instance.</li>
* <li>{@link IOExitResourcePath#openForWrite(boolean)) method and all
* methods of the returned {@link IOExitChannel} instance.</li>
* </ul>
* <p>
* This has a slight performance impact, hence enable single-threaded channel
* I/O only when absolutely necessary.
* <p>
* The default is {@code false}. The I/O exit should call this method when
* required to change this value.
*
* @param requiresSingleThreadedChannelIO
* {@code true} if {@link IOExitChannel} instances are to be
* accessed by a single thread only.
*/
public void setRequiresSingleThreadedChannelIO(boolean requiresSingleThreadedChannelIO) {
this.requiresSingleThreadedChannelIO = requiresSingleThreadedChannelIO;
}
}