package com.revolsys.parallel.process;
import org.apache.log4j.Logger;
import com.revolsys.parallel.channel.Channel;
import com.revolsys.parallel.channel.ClosedException;
import com.revolsys.parallel.channel.store.Buffer;
public abstract class AbstractOutProcess<T> extends AbstractProcess implements OutProcess<T> {
private Channel<T> out;
private int outBufferSize = 0;
public AbstractOutProcess() {
}
public AbstractOutProcess(final Channel<T> out) {
this.out = out;
}
public AbstractOutProcess(final int outBufferSize) {
this.outBufferSize = outBufferSize;
}
protected void destroy() {
}
/**
* @return the out
*/
@Override
public Channel<T> getOut() {
if (this.out == null) {
final String channelName = getBeanName() + ".out";
if (this.outBufferSize == 0) {
final Channel<T> channel = new Channel<>(channelName);
setOut(channel);
} else {
final Buffer<T> buffer = new Buffer<>(this.outBufferSize);
final Channel<T> channel = new Channel<>(channelName, buffer);
setOut(channel);
}
}
return this.out;
}
public int getOutBufferSize() {
return this.outBufferSize;
}
protected void init() {
}
@Override
public final void run() {
final Logger log = Logger.getLogger(getClass());
try {
log.debug("Start");
init();
run(getOut());
} catch (final ClosedException e) {
log.debug("Shutdown");
} catch (final ThreadDeath e) {
log.debug("Shutdown");
} catch (final Throwable e) {
log.error(e.getMessage(), e);
getProcessNetwork().stop();
} finally {
if (this.out != null) {
this.out.writeDisconnect();
}
destroy();
}
}
protected abstract void run(final Channel<T> out);
/**
* @param out the out to set
*/
@Override
public void setOut(final Channel<T> out) {
this.out = out;
out.writeConnect();
}
public void setOutBufferSize(final int outBufferSize) {
this.outBufferSize = outBufferSize;
}
}