Class HttpEventStreamClient
- java.lang.Object
-
- io.quarkiverse.githubapp.runtime.sse.HttpEventStreamClient
-
public class HttpEventStreamClient extends Object
HTTP Client that can listen for Server-Sent Events (SSE). Implements full protocol and supports automatic reconnect.- Since:
- 2020-12-26
- Author:
- LupCode.com (Luca Vogels)
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description classHttpEventStreamClient.EventEvent that gets received by theHttpEventStreamClientprotected classHttpEventStreamClient.InternalEventStreamAdapter
-
Field Summary
Fields Modifier and Type Field Description protected HttpClientclientprotected AtomicBooleanhasReceivedEventsprotected TreeMap<String,String>headersprotected HashSet<HttpEventStreamClient.InternalEventStreamAdapter>internalListenersprotected longlastEventIDprotected HashSet<EventStreamListener>listenersprotected intmaxReconnectsWithoutEventsprotected HttpRequestMethodmethodprotected AtomicIntegerreconnectWithoutEventsprotected HttpRequest.BodyPublisherrequestBodyprotected booleanresetEventIDonReconnectprotected longretryCooldownprotected CompletableFuture<HttpResponse<Void>>runningprotected longtimeoutprotected URIuriprotected HttpClient.Versionversion
-
Constructor Summary
Constructors Constructor Description HttpEventStreamClient(String url, EventStreamListener... listener)Creates a HTTP client that listens for Server-Sent Events (SSE).HttpEventStreamClient(String url, HttpRequestMethod method, HttpRequest.BodyPublisher requestBody, HttpClient.Version version, Map<String,String> headers, long timeout, long retryCooldown, int maxReconnectsWithoutEvents, boolean resetEventIDonReconnect, HttpClient client, EventStreamListener... listener)Creates a HTTP client that listens for Server-Sent Events (SSE).HttpEventStreamClient(String url, HttpRequestMethod method, HttpRequest.BodyPublisher requestBody, Map<String,String> headers, long timeout, long retryCooldown, EventStreamListener... listener)Creates a HTTP client that listens for Server-Sent Events (SSE).HttpEventStreamClient(String url, HttpRequestMethod method, HttpRequest.BodyPublisher requestBody, Map<String,String> headers, EventStreamListener... listener)Creates a HTTP client that listens for Server-Sent Events (SSE).HttpEventStreamClient(String url, Map<String,String> headers, EventStreamListener... listener)Creates a HTTP client that listens for Server-Sent Events (SSE).
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description voidaddHeaders(Map<String,String> headers)Adds HTTP headers that will be used for HTTP requests (overwrites existing ones).voidaddListener(EventStreamListener... listener)Adds a listener so it gets called on new events.voidclearHeaders()Removes all HTTP headers so no custom HTTP headers will be sent in the HTTP requestsintgetAutoStopThreshold()Returns how often client can reconnect without receiving events in between before it automatically stops.StringgetHeader(String key)Returns the value of the HTTP headers for a specific keyMap<String,String>getHeaders()Returns HTTP headers that will be used for HTTP requestsHttpClientgetHttpClient()HttpClientthat gets used for HTTP requests.HttpRequestMethodgetHttpMethod()Returns the HTTP method type that client uses for HTTP requestsHttpRequest.BodyPublishergetHttpRequestBody()Returns the HTTP body used for requests (can be null)HttpClient.VersiongetHttpVersion()Returns HTTP version if a specific one is set that should be usedlonggetLastEventID()Returns ID of the latest eventSet<EventStreamListener>getListeners()Returns a set containing all added listenersintgetReconnectsWithoutEvents()Returns how often client reconnected so far without receiving any events in between.longgetRetryCooldown()Returns the cooldown in milliseconds that this client will wait before reconnecting after a connection losslonggetTimeout()Returns the timeout in milliseconds for the HTTP client before it reconnects (if negative then ignored)URIgetURI()URI this client listens for eventsStringgetURL()URL string this client listens for eventsbooleanisAutoStopIfNoEventsEnabled()Returns true if client automatically stops after a certain amount of reconnects without receiving events in betweenbooleanisReconnectEnabled()Returns true if client automatically reconnects if connection is lostbooleanisResetLastEventIDonReconnect()Returns if last event id gets reset to zero on reconnectbooleanisRunning()Returns if client is currently listening for SSE eventsHttpEventStreamClientjoin()Blocks until this client has stopped listening.voidremoveAllListeners()Removes all listeners so they no longer get calledStringremoveHeader(String key)Removes a HTTP header so it gets no longer used for HTTP requestsvoidremoveHeaders(String... keys)Removes multiple HTTP headers so they no longer will be used for HTTP requestsvoidremoveListener(EventStreamListener... listener)Removes the listeners so they no longer get calledvoidsetAutoStopThreshold(int maxReconnectsWithoutEvents)Sets how often the client can reconnect without receiving events in between before it automatically stops.voidsetHeader(String key, String value)Sets/Removes a HTTP header that will be used for HTTP requests.voidsetHeaders(Map<String,String> headers)Sets HTTP headers that will be used for HTTP requests (removes all existing ones).voidsetHttpClient(HttpClient client)Sets if a specificHttpClientshould be used for HTTP requests.voidsetHttpMethod(HttpRequestMethod method)Sets the HTTP method type that client uses for HTTP requestsvoidsetHttpRequestBody(HttpRequest.BodyPublisher requestBody)Sets a HTTP body used for requests.voidsetHttpVersion(HttpClient.Version version)Sets a specific HTTP version that should be used.voidsetLastEventID(long id)Sets the event id that should be sent on next start/reconnect.voidsetResetLastEventIDonReconnect(boolean reset)Sets if the last event it should be set to zero on a reconnectvoidsetRetryCooldown(long retryCooldown)Sets the cooldown in milliseconds that this client will wait before reconnection after a connection lossvoidsetTimeout(long timeout)Sets the timeout in milliseconds for the HTTP client before it reconnects (if negative then ignored)voidsetURI(URI uri)Sets the URI that will be used after the next reconnect.voidsetURL(String url)Sets the URL that will be used after the next reconnect.HttpEventStreamClientstart()Starts listening for SSE events and immediately returns.HttpEventStreamClientstop()Stops without reconnecting.
-
-
-
Field Detail
-
uri
protected URI uri
-
method
protected HttpRequestMethod method
-
requestBody
protected HttpRequest.BodyPublisher requestBody
-
version
protected HttpClient.Version version
-
timeout
protected long timeout
-
retryCooldown
protected long retryCooldown
-
maxReconnectsWithoutEvents
protected int maxReconnectsWithoutEvents
-
hasReceivedEvents
protected final AtomicBoolean hasReceivedEvents
-
reconnectWithoutEvents
protected final AtomicInteger reconnectWithoutEvents
-
client
protected HttpClient client
-
lastEventID
protected long lastEventID
-
resetEventIDonReconnect
protected boolean resetEventIDonReconnect
-
listeners
protected HashSet<EventStreamListener> listeners
-
internalListeners
protected HashSet<HttpEventStreamClient.InternalEventStreamAdapter> internalListeners
-
running
protected CompletableFuture<HttpResponse<Void>> running
-
-
Constructor Detail
-
HttpEventStreamClient
public HttpEventStreamClient(String url, EventStreamListener... listener)
Creates a HTTP client that listens for Server-Sent Events (SSE). Starts listening after callingstart()- Parameters:
url- URL the client should listen atlistener- Event stream listeners that listen for arriving events (optional)
-
HttpEventStreamClient
public HttpEventStreamClient(String url, Map<String,String> headers, EventStreamListener... listener)
Creates a HTTP client that listens for Server-Sent Events (SSE). Starts listening after callingstart()- Parameters:
url- URL the client should listen atheaders- HTTP headers that should be set for the request. SSE specific headers will get overwritten [Accept, Cache-Control, Last-Event-ID] (optional)listener- Event stream listeners that listen for arriving events (optional)
-
HttpEventStreamClient
public HttpEventStreamClient(String url, HttpRequestMethod method, HttpRequest.BodyPublisher requestBody, Map<String,String> headers, EventStreamListener... listener)
Creates a HTTP client that listens for Server-Sent Events (SSE). Starts listening after callingstart()- Parameters:
url- URL the client should listen atmethod- HTTP method that should be used to request the event stream (default GET)requestBody- HTTP request body that gets sent along the request (optional)headers- HTTP headers that should be set for the request. SSE specific headers will get overwritten [Accept, Cache-Control, Last-Event-ID] (optional)listener- Event stream listeners that listen for arriving events (optional)
-
HttpEventStreamClient
public HttpEventStreamClient(String url, HttpRequestMethod method, HttpRequest.BodyPublisher requestBody, Map<String,String> headers, long timeout, long retryCooldown, EventStreamListener... listener)
Creates a HTTP client that listens for Server-Sent Events (SSE). Starts listening after callingstart()- Parameters:
url- URL the client should listen atmethod- HTTP method that should be used to request the event stream (default GET)requestBody- HTTP request body that gets sent along the request (optional)headers- HTTP headers that should be set for the request. SSE specific headers will get overwritten [Accept, Cache-Control, Last-Event-ID] (optional)timeout- Timeout in milliseconds for the HTTP client before it reconnects (if negative then ignored)retryCooldown- Cooldown in milliseconds after connection loss before starting to reconnect (negative for no cooldown)listener- Event stream listeners that listen for arriving events (optional)
-
HttpEventStreamClient
public HttpEventStreamClient(String url, HttpRequestMethod method, HttpRequest.BodyPublisher requestBody, HttpClient.Version version, Map<String,String> headers, long timeout, long retryCooldown, int maxReconnectsWithoutEvents, boolean resetEventIDonReconnect, HttpClient client, EventStreamListener... listener)
Creates a HTTP client that listens for Server-Sent Events (SSE). Starts listening after callingstart()- Parameters:
url- URL the client should listen atmethod- HTTP method that should be used to request the event stream (default GET)requestBody- HTTP request body that gets sent along the request (optional)version- Specific HTTP version that should be used to request (optional)headers- HTTP headers that should be set for the request. SSE specific headers will get overwritten [Accept, Cache-Control, Last-Event-ID] (optional)timeout- Timeout in milliseconds for the HTTP client before it reconnects (if negative then ignored)retryCooldown- Cooldown in milliseconds after connection loss before starting to reconnect (negative for no cooldown)maxReconnectsWithoutEvents- How often client can reconnect without receiving events before it stops (zero for no reconnect, negative for infinitely)resetEventIDonReconnect- If true then event id will be set back to zero on a reconnect (default false)client- HTTP client that should be used (optional)listener- Event stream listeners that listen for arriving events (optional)
-
-
Method Detail
-
getURI
public URI getURI()
URI this client listens for events- Returns:
- URI that is used to listen for events
-
getURL
public String getURL()
URL string this client listens for events- Returns:
- URL string that is used to listen for events
-
setURL
public void setURL(String url)
Sets the URL that will be used after the next reconnect. If change should immediately take place callstart()afterwards- Parameters:
url- URL the client should listen at
-
setURI
public void setURI(URI uri)
Sets the URI that will be used after the next reconnect. If change should immediately take place callstart()afterwards- Parameters:
uri- URI the client should listen at
-
getHttpMethod
public HttpRequestMethod getHttpMethod()
Returns the HTTP method type that client uses for HTTP requests- Returns:
- HTTP request method type
-
setHttpMethod
public void setHttpMethod(HttpRequestMethod method)
Sets the HTTP method type that client uses for HTTP requests- Parameters:
method- HTTP request method type used for HTTP requests
-
getHttpRequestBody
public HttpRequest.BodyPublisher getHttpRequestBody()
Returns the HTTP body used for requests (can be null)- Returns:
- HTTP request body or null
-
setHttpRequestBody
public void setHttpRequestBody(HttpRequest.BodyPublisher requestBody)
Sets a HTTP body used for requests. Only needed for certain HTTP request methods otherwise ignored.- Parameters:
requestBody- HTTP request body or null
-
getHttpVersion
public HttpClient.Version getHttpVersion()
Returns HTTP version if a specific one is set that should be used- Returns:
- HTTP version that is forced to be used or null
-
setHttpVersion
public void setHttpVersion(HttpClient.Version version)
Sets a specific HTTP version that should be used. If null then HTTP client will automatically determine appropriate version- Parameters:
version- HTTP version that is forced to be used or null
-
getHeaders
public Map<String,String> getHeaders()
Returns HTTP headers that will be used for HTTP requests- Returns:
- HTTP headers map
-
addHeaders
public void addHeaders(Map<String,String> headers)
Adds HTTP headers that will be used for HTTP requests (overwrites existing ones). SSE specific headers cannot be overwritten (Accept, Cache-Control, Last-Event-ID)- Parameters:
headers- HTTP headers that should be added
-
setHeaders
public void setHeaders(Map<String,String> headers)
Sets HTTP headers that will be used for HTTP requests (removes all existing ones). SSE specific headers cannot be overwritten (Accept, Cache-Control, Last-Event-ID)- Parameters:
headers- HTTP headers that should be added
-
setHeader
public void setHeader(String key, String value)
Sets/Removes a HTTP header that will be used for HTTP requests. SSE specific headers cannot be overwritten (Accept, Cache-Control, Last-Event-ID)- Parameters:
key- Key of the header (cannot be null or blank)value- Value that should be set (if null then key gets removed)
-
getHeader
public String getHeader(String key)
Returns the value of the HTTP headers for a specific key- Parameters:
key- Key the value should be returned for (cannot be null or empty)- Returns:
- Value that is set for the HTTP header or null if not set
-
removeHeader
public String removeHeader(String key)
Removes a HTTP header so it gets no longer used for HTTP requests- Parameters:
key- Key of header that should be removed- Returns:
- Previously set value or null if not previously set
-
removeHeaders
public void removeHeaders(String... keys)
Removes multiple HTTP headers so they no longer will be used for HTTP requests- Parameters:
keys- Keys of the HTTP headers
-
clearHeaders
public void clearHeaders()
Removes all HTTP headers so no custom HTTP headers will be sent in the HTTP requests
-
getTimeout
public long getTimeout()
Returns the timeout in milliseconds for the HTTP client before it reconnects (if negative then ignored)- Returns:
- Timeout in milliseconds
-
setTimeout
public void setTimeout(long timeout)
Sets the timeout in milliseconds for the HTTP client before it reconnects (if negative then ignored)- Parameters:
timeout- Timeout in milliseconds
-
getRetryCooldown
public long getRetryCooldown()
Returns the cooldown in milliseconds that this client will wait before reconnecting after a connection loss- Returns:
- Cooldown in milliseconds
-
setRetryCooldown
public void setRetryCooldown(long retryCooldown)
Sets the cooldown in milliseconds that this client will wait before reconnection after a connection loss- Parameters:
retryCooldown- Cooldown in milliseconds (negative for no cooldown)
-
isAutoStopIfNoEventsEnabled
public boolean isAutoStopIfNoEventsEnabled()
Returns true if client automatically stops after a certain amount of reconnects without receiving events in between- Returns:
- True if auto stop enabled
-
isReconnectEnabled
public boolean isReconnectEnabled()
Returns true if client automatically reconnects if connection is lost- Returns:
- True if reconnect on connection loss
-
getAutoStopThreshold
public int getAutoStopThreshold()
Returns how often client can reconnect without receiving events in between before it automatically stops. If zero then client will not reconnect after a connection loss. If negative then auto stop is disabled and client keeps reconnecting for ever- Returns:
- Max reconnects without events before stopping
-
setAutoStopThreshold
public void setAutoStopThreshold(int maxReconnectsWithoutEvents)
Sets how often the client can reconnect without receiving events in between before it automatically stops. If zero then client will not reconnect after a connection loss. If negative then client will keep reconnecting for ever- Parameters:
maxReconnectsWithoutEvents- How often client can reconnect without receiving events before it stops (zero for no reconnect, negative for infinitely)
-
getReconnectsWithoutEvents
public int getReconnectsWithoutEvents()
Returns how often client reconnected so far without receiving any events in between. Gets reset to zero if client receives an event- Returns:
- Reconnection count without events
-
getHttpClient
public HttpClient getHttpClient()
HttpClientthat gets used for HTTP requests. May be null if not specified and not started yet- Returns:
HttpClientthat is used for HTTP requests (may be null)
-
setHttpClient
public void setHttpClient(HttpClient client)
Sets if a specificHttpClientshould be used for HTTP requests. If null a newHttpClientinstance will be created- Parameters:
client- HTTP client that should be used (null for new instance)
-
getLastEventID
public long getLastEventID()
Returns ID of the latest event- Returns:
- ID of latest event
-
setLastEventID
public void setLastEventID(long id)
Sets the event id that should be sent on next start/reconnect. May be overwritten by the server in the mean time. Callstart()to force sending of new id- Parameters:
id- Event id that should be sent in HTTP header (Last-Event-ID)
-
isResetLastEventIDonReconnect
public boolean isResetLastEventIDonReconnect()
Returns if last event id gets reset to zero on reconnect- Returns:
- True if set to zero on a reconnect
-
setResetLastEventIDonReconnect
public void setResetLastEventIDonReconnect(boolean reset)
Sets if the last event it should be set to zero on a reconnect- Parameters:
reset- If true then last event it will be reset on a reconnect
-
getListeners
public Set<EventStreamListener> getListeners()
Returns a set containing all added listeners- Returns:
- Set of all added listeners
-
removeAllListeners
public void removeAllListeners()
Removes all listeners so they no longer get called
-
addListener
public void addListener(EventStreamListener... listener)
Adds a listener so it gets called on new events. Multiple adding of same listener will only add once- Parameters:
listener- Listener(s) that should be added
-
removeListener
public void removeListener(EventStreamListener... listener)
Removes the listeners so they no longer get called- Parameters:
listener- Listeners that should be removed
-
isRunning
public boolean isRunning()
Returns if client is currently listening for SSE events- Returns:
-
start
public HttpEventStreamClient start()
Starts listening for SSE events and immediately returns. If client looses connection then automatically reconnects. Multiple calls will not start multiple listening but callsEventStreamListener#onReconnect()on listeners- Returns:
- This client instance
-
join
public HttpEventStreamClient join()
Blocks until this client has stopped listening. If not listening then returns immediately- Returns:
- This client instance
-
stop
public HttpEventStreamClient stop()
Stops without reconnecting. ExecutesEventStreamListener#onClose()on listeners- Returns:
- This client instance
-
-