I just released a first alpha of JGroups 4.0.0 to SourceForge and maven. There are 12+ issues left, and I expect a final release in October.
The major version number was incremented because there are a lot of API changes and removal of deprecated classes/methods.
I'd be happy to get feedback on the API; there's still time to make a few API changes until the final release.
Major API changes
- Deprecated classes and methods were removed (TCP_NIO, UNICAST, UNICAST2, NAKACK, PEER_LOCK, MERGE, MERGE2, FC, SCOPE etc)
- The shared transport was removed (https://issues.jboss.org/browse/JGRP-1844). Use fork channels instead.
- MuxRpcDispatcher was finally removed (https://issues.jboss.org/browse/JGRP-2008). YEAH!!!
- RpcDispatcher now uses CompletableFuture (https://issues.jboss.org/browse/JGRP-1605)
- Changed code to use new Java 8 features (e.g. streams): https://issues.jboss.org/browse/JGRP-2007
- Removed the Channel interface and merged it into JChannel: https://issues.jboss.org/browse/JGRP-2018
Deliver message batchesAbility to handle message batches in addition to individual messages: receive(MessageBatch) was added to ReceiverAdapter: https://issues.jboss.org/browse/JGRP-2003
Encryption and authenticationENCRYPT was removed and replaced by SYM_ENCRYPT (keystore-based) and ASYM_ENCRYPT (asymmetric key exchange): https://issues.jboss.org/browse/JGRP-2021.
ENCRYPT had a couple of security flaws, and since the code hasn't been touched for almost a decade, I took this chance and completely refactored it into the 2 protocols above.
The code is now much more readable and maintainable.
Removal of Java serializationJGroups marshalling falls back to Java serialization if a class is not primitive or implements Streamable. This was completely removed for JGroups-internal classes: https://issues.jboss.org/browse/JGRP-2033
MessageBundler improvementsThe performance of existing bundlers has been improved, and new bundlers (RingBufferBundler, NoBundler) have been added. Since the shared transport feature was removed, SingletonAddress used as key into a bundler's hashmap could also be removed.
For instance, TransferQueueBundler now removes chunks of message from the queue, rather than one-by-one: https://issues.jboss.org/browse/JGRP-2076.
I also added the ability to switch bundlers at runtime (via (e.g.) probe.sh op=TCP.bundler["rb"]): https://issues.jboss.org/browse/JGRP-2057 / https://issues.jboss.org/browse/JGRP-2058
Reduction of event creationFor every message sent up or down, a new Event (wrapping the message) had to be created. Adding 2 separate up(Message) and down(Message) callbacks removed that unneeded creation: https://issues.jboss.org/browse/JGRP-2067
Faster header marshalling and creationHeaders used to do a hashmap lookup to get their magic-id when getting marshalled. Now they carry the magic ID directly in the header. This saves a hashmap lookup per header (usually we have 3-4 headers per message): https://issues.jboss.org/browse/JGRP-2042.
Header creation was getting the class using a lookup with the magic ID, and then creating an instance. This was replaced by each header class implementing a create() method, resulting in header creation getting from 300ns down to 25ns.
MFC and UFC headers getting mixed upThis is a regression that led to premature exhaustion of credits, slowing things down:
<groupId>org.jgroups</groupId> <artifactId>jgroups</artifactId> <version>4.0.0-Alpha1</version>
The manual has not been changed yet, so browse the source code or javadocs for details.
Enjoy! and feedback via the mailing list, please!