public class HTTPReaderMirror extends Thread implements IMirror
IMirror interface specializes the
mirroring procedure that needs to be performed from the reader side of the
mirroring procedure. The technology employed is communication over HTTP
connections. The communication protocol is coupled with the one implemented by
the HTTPWriterMirror which is the writer side counterpart of this
class.Thread.State, Thread.UncaughtExceptionHandlerIMirror.MirroringState| Modifier and Type | Field and Description |
|---|---|
static long |
LongMirrorPeriod
The default max period of communication inactivity time span.
|
static int |
ReaderTimout |
static long |
ShortMirrorPeriod
The default min period of communication inactivity time span.
|
MAX_PRIORITY, MIN_PRIORITY, NORM_PRIORITY| Constructor and Description |
|---|
HTTPReaderMirror() |
| Modifier and Type | Method and Description |
|---|---|
void |
dispose()
Dispose the resources employed by the mirroring implementations
|
void |
dispose(boolean purge)
This method disposes the resources that are used by the instance but does
so in two phases.
|
IBuffer |
getBuffer()
|
GRS2ProxyMirrorProtocolErrorException |
getInitializationError()
In case the initialization was not successful, and the call to
waitInitialization() returned false, this method
will return the error that was recorded during the initialization. |
void |
handle()
This invocation of this method starts a new execution thread where the
mirroring procedure is executed.
|
void |
overrideBufferCapacity(int capacity)
Instructs the mirror to use a different buffer capacity than that
transmitted by the respective
HTTPWriterMirror. |
boolean |
pollPartial(long recordIndex,
int fieldIndex) |
long |
requestPartial(long recordIndex,
int fieldIndex,
IBuffer.TransportOverride override,
Object notify)
This method is used by the reader side mirror to request payload that belongs to an
IBuffer
item that has been transfered only partially and more data is requested by the reader client |
void |
run() |
void |
setHostname(String hostname)
Sets the name of the host where the respective
HTTPWriterMirror
instance is running |
void |
setKey(String key)
Sets the key on the remote registry that holds the
IBuffer this
mirror is interested in consuming |
void |
setPort(int port)
Sets the port in the remote host where the respective
HTTPWriterMirror is listening |
boolean |
waitInitialization()
This method can be used by
HTTPReaderMirror clients, that want to
be sure that the initialization procedure of the protocol is completed
before they continue their operation. |
activeCount, checkAccess, clone, countStackFrames, currentThread, destroy, dumpStack, enumerate, getAllStackTraces, getContextClassLoader, getDefaultUncaughtExceptionHandler, getId, getName, getPriority, getStackTrace, getState, getThreadGroup, getUncaughtExceptionHandler, holdsLock, interrupt, interrupted, isAlive, isDaemon, isInterrupted, join, join, join, resume, setContextClassLoader, setDaemon, setDefaultUncaughtExceptionHandler, setName, setPriority, setUncaughtExceptionHandler, sleep, sleep, start, stop, stop, suspend, toString, yieldpublic static final long LongMirrorPeriod
ShortMirrorPeriod is used. Currently this value
is set to 100 millisecondspublic static final long ShortMirrorPeriod
LongMirrorPeriod is used. Currently this value
is set to 50 millisecondspublic static final int ReaderTimout
public void setHostname(String hostname)
HTTPWriterMirror
instance is runninghostname - the name of the hostpublic void setPort(int port)
HTTPWriterMirror is listeningport - the port numberpublic void setKey(String key)
IBuffer this
mirror is interested in consumingkey - the registry key of the IBuffer to consumepublic void overrideBufferCapacity(int capacity)
HTTPWriterMirror. Capacity
overriding only takes place if the requested capacity is smaller than the
one specified by the respective HTTPWriterMirror, otherwise the
latter is usedcapacity - The buffer capacitypublic IBuffer getBuffer()
IBuffer that is managed by the IMirror implementation. Depending
on the mirror side, this instance is either the one the writer is authoring, or the one the reader
is accessing.getBuffer in interface IMirrorIBuffer that is managed by the IMirror implementationIMirror.getBuffer()public void handle()
throws GRS2ProxyMirrorInvalidOperationException
GRS2ProxyMirrorInvalidOperationException - if the mirroring state does not allow the operation to be
executedpublic void dispose()
This method actually invokes the respective
dispose(boolean) with an argument of false. This
is because the actual disposing needs to take place when the mirroring
thread is prepared to gracefully exit its execution
dispose in interface IMirrorIMirror.dispose()public void dispose(boolean purge)
false which puts the mirroring thread in a state where the
needed actions are taken to gracefully exit this part of the protocol but
also notify the respective HTTPWriterMirror to stop the mirroring
procedure gracefully. When the method in again invoked with a
true argument from the protocol implementing thread, all
resources are disposed.purge - whether the resources need to be immediately disposed, or this
need to wait until the protocol thread is ready to purge the
involved resourcespublic boolean waitInitialization()
HTTPReaderMirror clients, that want to
be sure that the initialization procedure of the protocol is completed
before they continue their operation. If someone invokes this method
before communication has been successfully been established with the
remote HTTPWriterMirror, and the involved IBuffer
information including the RecordDefinitions are exchanged and the
IBuffer is initialized, the method will block him. After this
operation is completed, and for any later invocation, the method will
return control immediatelypublic GRS2ProxyMirrorProtocolErrorException getInitializationError()
waitInitialization() returned false, this method
will return the error that was recorded during the initialization. If no
error was recorded, null is returnedpublic boolean pollPartial(long recordIndex,
int fieldIndex)
throws GRS2ProxyMirrorDisposedException
the management of the partial requests is performed using
PartialRequestManager
pollPartial in interface IMirrorrecordIndex - The record index / id, for which the requester has requested data to be deliveredfieldIndex - The field index of the specific record for which data are requestedGRS2ProxyMirrorDisposedException - the mirror is already disposedIMirror.pollPartial(long, int)public long requestPartial(long recordIndex,
int fieldIndex,
IBuffer.TransportOverride override,
Object notify)
throws GRS2ProxyMirrorInvalidOperationException,
GRS2ProxyMirrorDisposedException
IBuffer
item that has been transfered only partially and more data is requested by the reader client
The indicative time returned for the next poll operation is the amount
defined as ShortMirrorPeriod
requestPartial in interface IMirrorrecordIndex - The index of the record whose payload is requested. As described in Record, this index coincides with the record id.fieldIndex - The index of the field belonging to the defined record for which additional data is requestedoverride - whether or not the field's IBuffer.TransportDirective should be overridden as explained in IBuffernotify - A synchronization object that can be used for the requester to block on until the required data is providedIMirror.pollPartial(long, int) should be usedGRS2ProxyMirrorDisposedException - the mirror is already disposedGRS2ProxyMirrorInvalidOperationException - if the PartialRequestManager has not been initializedIMirror.requestPartial(long, int,
gr.uoa.di.madgik.grs.buffer.IBuffer.TransportOverride,
java.lang.Object)public void run()
In the context of the mirroring procedure, the execution of this thread
includes the following actions.
Initially, a connection to the remote HTTPWriterMirror is
established, the details of the employed IBuffer are retrieved,
as well as the RecordDefinitions that describe the Record
s that will be retrieved. The appropriate IBuffer implementation
is instantiated, configured and set with all the retrieved information.
After the initialization is completed, any blocked clients waiting to be
notified on initialization completion are notified.
The main protocol loop is then initialized. On every iteration, a request
is send to the remote HTTPWriterMirror with the number of records
that could be added to the local IBuffer, any partial data
requests, as well as the status of the consumption procedure.
In the next step, any event emitted from the reader is send over to the
writer
The next step is to retrieve from the HTTPWriterMirror any
Records send as well as partial data from the requested ones. The
respective information is used to either populate new Records and
add them to the local IBuffer, or to locate and enhance the
Fields for which additional data have been received.
Any events that are send from the writer are also received
The remote status is also retrieved and the protocol loop continues
unless it should be teardown based on the remote status.
If the remote mirror has responded with the information requested, then
the period of the next protocol loop is defined as the minimum defined in
ShortMirrorPeriod while in case no needed
information was received the period is set to the maximum defined in
LongMirrorPeriod
run in interface Runnablerun in class ThreadThread.run()Copyright © 2014. All Rights Reserved.