public interface OutboundRequestIterator
OutboundRequest
instances to use for attempting to
send a particular request to a remote communication endpoint.
As long as hasNext
returns true
,
the next
method can be invoked to initiate an attempt
to make the request. If successful, the next
method
returns an OutboundRequest
to use to write the request
data and read the response.
If the request communication attempt fails, such as if the
next
invocation throws an exception or if a subsequent
I/O operation on the returned OutboundRequest
or its
streams throws an exception, then if hasNext
returns
true
again, the next
method can be
invoked again to retry the request attempt. This process of
retrying failed request attempts can repeat as long as
hasNext
returns true
after the previous
failed request attempt.
Note that it is the user's responsibility to abstain from
retrying a request attempt if doing so might violate any applicable
guarantees of at most once execution semantics (invoking
getDeliveryStatus
on the
previous OutboundRequest
might aid in making that
determination).
A typical OutboundRequestIterator
is likely to
support making only one request attempt, in which case after one
invocation of next
(successful or not),
hasNext
will return false
. Reasons that
an OutboundRequestIterator
might support multiple
request attempts include:
hasNext
method should not return true
after successive failed request attempts indefinitely. The request
retry mechanism provided by OutboundRequestIterator
is
not intended for implementing a strategy of general retry of the
same communication mechanism after indeterminate failures.
Note that it is permitted, although unlikely, for an
OutboundRequestIterator
's hasNext
method
to never return true
, in which case the
OutboundRequestIterator
does not support initiating
even one attempt to send the request.
An OutboundRequestIterator
is not guaranteed to be
safe for concurrent use by multiple threads.
Endpoint
Modifier and Type | Method and Description |
---|---|
boolean |
hasNext()
Returns
true if this iterator supports making at
least one more attempt to communicate the request, and
false otherwise. |
OutboundRequest |
next()
Initiates an attempt to communicate the request to the remote
endpoint.
|
boolean hasNext()
true
if this iterator supports making at
least one more attempt to communicate the request, and
false
otherwise.
If this method returns true
, then it is
guaranteed that the next invocation of next
on
this iterator will not throw a NoSuchElementException
.
If next
has been invoked on this iterator and
the previous invocation of next
returned an
OutboundRequest
, then this method should not be
invoked until that OutboundRequest
has been used
to attempt to communicate the request and a failure has
occurred.
The security context in which this method is invoked may be
used for subsequent verification of security permissions; see
the next
method specification for more details.
true
if this iterator supports making
another attempt to communicate the request, and
false
otherwiseOutboundRequest next() throws IOException
After an invocation of hasNext
returns
true
, it is guaranteed that the next invocation of
this method will not throw a NoSuchElementException
.
If successful, this method returns an
OutboundRequest
to use to write the request data
and read the response. Even if this method throws an IOException
or a SecurityException
, the iteration of
attempts to communicate the request may continue with another
invocation of hasNext
.
The implementation verifies that the user's security context
has all of the security permissions necessary to communicate
the current request attempt with the remote endpoint and to
satisfy any required constraints, as appropriate to the
implementation of this interface. The implementation is
allowed, however, to indicate failure of such a permission
check by either throwing a SecurityException
from
this method or, after returning an OutboundRequest
from this method, throwing a SecurityException
from some subsequent operation on the
OutboundRequest
or its streams. If such a
SecurityException
is thrown, request data must not
have been transmitted to the server (that is, if an
OutboundRequest
has been returned, its getDeliveryStatus
method
must return false
), and the client's identity must
not have been revealed to the server.
Also, the implementation of this method or the returned
OutboundRequest
must eventually verify that the
client and server have the requisite principals and credentials
to satisfy any required constraints and if not, throw an
IOException
. If such an IOException
is thrown, request data must not have been transmitted to the
server.
In verifying any such permission requirement or credential,
the implementation is allowed to use the security context in
effect for this or any previous invocation of a method on this
iterator or the security context in effect for any operation on
the OutboundRequest
returned by this or any
previous invocation of this method on this iterator.
Therefore, this iterator and the OutboundRequest
instances that it produces should be used in a uniform security
context.
OutboundRequest
to use to write the
request data and read the responseNoSuchElementException
- if this iterator does not
support making another attempt to communicate the request (that
is, if hasNext
would return false
)IOException
- if an I/O exception occurs while performing
this operation; in this event, the recipient may have received
an indication of the request initiation attemptSecurityException
- if the user does not have the
permissions necessary to communicate with the remote endpoint