JeroMQ v0.5.0 Release Notes
Release Date: 2019-02-18 // about 5 years ago-
โ Added
#539, #552, #573: Implemented heartbeating between sockets as specified in https://rfc.zeromq.org/spec:37/ZMTP.
#556: There is now a
SocketType
enum that can be used when creating sockets. This is recommended over the old way of using integer values, which is error-prone. The overload ofZContext.createSocket
that takes an integer is still supported, but is now marked deprecated.#559: Added
recvStream
andrecvStrStream
instance methods to theZMQ.Socket
class. These expose a Stream of incoming messages, each of which is abyte[]
orString
, respectively.#560: ZMsg instance methods can now be chained.
#576: Added an overload of
ZMsg.recvMsg
that takes aConsumer<ZMsg> handler
and aConsumer<ZMQException> exceptionHandler
for handling the result of attempting to receive a message on a socket.#586: Implemented a Timer API based on the one added to libzmq in version 4.2.
#590: Added a
closeSelector
method to the ZContext class, to expose a way for selectors created bycreateSelector
to be closed. Note that both of these methods are also deprecated; it is not recommended to manage selectors directly, as these are managed for you by pollers.#614: Added a
ZMQ_SELECTOR_PROVIDERCHOOSER
socket option that allows you to define a custom SelectorProvider.
๐ Changed
๐ JeroMQ no longer supports Java 7. Dropping support for Java 7 allows us to leverage the new features of Java 8, including the use of lambda syntax to create IAttachedRunnable and IDetachedRunnable.
๐จ Refactored code to use Java 8 features like lambdas and streams in various places. See #570 and #650, for example.
#510: Polling now measures time in nanoseconds instead of microseconds, ensuring a higher degree of precision.
๐ #523: Fixed a bug where ZLoop was closing the context.
๐ #525: Fixed a bug in
zmq.io.StreamEngine
that was causing an infinite loop in the IO thread, blocking the application with 100% CPU usage.๐ #527: Fixed a bug in
zmq.io.StreamEngine
where data could still be present inside the handshake buffer that was not decoded.๐ #535: Fixed an edge case where, once in a blue moon, after a socket fails to connect, and is subsequently closed, it would still try to reconnect as if it weren't closed.
๐ #546: Prior to this release, when a ZContext was initialized, its internal
ZMQ.Context
would be null initially, and the ZContextisClosed
instance method would misleadingly returntrue
; theZMQ.Context
was being created lazily whengetContext
was called on the ZContext. Worse, the internal context would be reset tonull
after closing a ZContext, which could lead to problems if another thread happened to try to use the ZContext after it was closed, resulting in a newZMQ.Context
secretly being created. Now, the internalZMQ.Context
is created upon initialization of the ZContext, and you can rely on it never being null.โก๏ธ #548: Various javadoc updates and improvements. There is now a
@Draft
annotation to identify work-in-progress APIs that are unstable or experimental.๐ #552: Fixed a bug where internal command messages (e.g. HEARTBEAT commands) were disrupting the REQ state machine.
#564: Implemented the ability to bind a socket via IPC or TCP with a dynamic ("wildcard") port and retrieve it via
ZMQ.ZMQ_LAST_ENDPOINT
. Leveraged this to make our test suite more reliable.๐ #569: Fixed an issue where an overridable method was being used in the ZStar constructor.
๐ #578: Fixed an issue where an errno of 48 ("address already in use") would persist longer than intended in the process of binding to a random port. Now, errno is reset to 0 after a port is found.
๐ #581: Fixed a bug where, if you're polling in one thread and you close the context in another thread, it would result in an uncaught ClosedSelectorException.
๐ #583: Fixed a race condition causing
ZMQ_CONNECT_RID
to sometimes be assigned to the wrong peer socket.๐ #597: Fixed a bug causing the context to hang indefinitely after calling
destroy()
, if multiple sockets had connected to the same socket.#609: For numerous methods, when invalid arguments are passed to the method, an InvalidArgumentException with a friendly error message will now be thrown, instead of an assertion error.
#610: Added some asserts in places where there could potentially be NullPointerExceptions.
#623:
Options.rcvbuf
andOptions.sndbuf
will now adjustConfig.IN_BATCH_SIZE
andConfig.OUT_BATCH_SIZE
accordingly.#634: We are now using a 64-bit long, instead of a 32-bit integer, as a cursor in the internal
java.zmq.Signaler
class. This change should not affect the library user, except that it will now take longer for the value to overflow. Previously, with the 32-bit integer cursor, the Signaler could overflow within a month or so under heavy load, causing serious problems such as a server being unable to accept new client connections.#642, #646, #652: Removed debug printing intended for development use only.
#643: Added some checks in parts of the codebase related to encryption and authentication mechanisms.
#652: IOExceptions that occur during polling will now set
errno
more accurately depending on the exception. Previously, theerrno
would always be set toEINTR
when an IOException occurs during polling.#653:
ZError.toString
now defaults to"errno " + Integer.toString(code)
if a string version of that error code hasn't been implemented.#654: In a low-level place where an
IllegalStateException
was thrown with no arguments before, the string value of theerrno
is now included to provide some context.#655: In a low-level place in the polling code,
EINTR
is now correctly reported to indicate that polling was interrupted, whereas we used to miss it and try to poll again.#657: When destroying a ZPoller, we will no longer close the poller's Selector, as that is handled by the context.
#659: Made internal optimizations to ZContext. The only visible change should be that the order of the sockets when you call
getSockets()
is no longer deterministic, as we are now storing them internally in a Set rather than a List.#660: When creating a socket and the
maxSockets
limit is reached, a ZMQException is now thrown instead of the more generic IllegalStateException.