This is an automated email from the ASF dual-hosted git repository.

nizhikov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new f9ebf2aa13b IGNITE-28934 Create message with direct constructor call 
(#13416)
f9ebf2aa13b is described below

commit f9ebf2aa13b731b76b2c272c0a2fd0ad87c914e4
Author: Nikolay <[email protected]>
AuthorDate: Thu Jul 30 15:52:11 2026 +0300

    IGNITE-28934 Create message with direct constructor call (#13416)
---
 .../ignite/internal/MessageCompanionGenerator.java |  2 +-
 .../internal/MessageSerializerGenerator.java       | 25 +++++++++-
 .../communication/CompressedMessageSerializer.java |  5 ++
 .../communication/IgniteMessageFactory.java        | 13 ++---
 .../communication/IgniteMessageFactoryImpl.java    | 20 +++-----
 ...AbstractMarshallableMessageFactoryProvider.java | 33 ++-----------
 .../org/apache/ignite/spi/IgniteSpiAdapter.java    |  2 -
 .../tcp/internal/GridNioServerWrapper.java         |  3 +-
 .../direct/DirectMarshallingMessagesTest.java      |  6 +--
 ...irectByteBufferStreamImplByteOrderSelfTest.java |  4 +-
 .../GridCommunicationSendMessageSelfTest.java      |  4 +-
 .../GridIoManagerOrderedUnmarshalFailureTest.java  |  7 ++-
 .../IgniteMessageFactoryImplTest.java              | 11 +++--
 .../MessageDirectTypeIdConflictTest.java           |  2 +-
 .../nio/IgniteExceptionInNioWorkerSelfTest.java    |  7 ++-
 .../TcpCommunicationSpiSslVolatilePayloadTest.java |  5 +-
 .../communication/MessageMarshalOnceTest.java      | 14 +++++-
 .../apache/ignite/spi/MessagesPluginProvider.java  | 13 +----
 .../communication/GridCacheMessageSelfTest.java    | 10 ++--
 .../ignite/spi/communication/GridTestMessage.java  |  2 +-
 .../tcp/TestDelayMessageSerializer.java            |  5 ++
 .../tcp/DiscoveryDeserializationExceptionTest.java |  2 +-
 .../tcp/DiscoveryUnmarshalVulnerabilityTest.java   |  6 ++-
 .../resources/codegen/ChildMessageSerializer.java  | 11 +++--
 .../CustomMapperEnumFieldsMessageSerializer.java   | 11 +++--
 .../DefaultMapperEnumFieldsMessageSerializer.java  | 11 +++--
 .../codegen/TestCacheIdMessageDeployer.java        |  2 +-
 .../codegen/TestCollectionsMessageMarshaller.java  |  2 +-
 .../codegen/TestCollectionsMessageSerializer.java  | 11 +++--
 .../codegen/TestDeployableMessageDeployer.java     |  2 +-
 .../codegen/TestMapMessageMarshaller.java          |  2 +-
 .../codegen/TestMapMessageSerializer.java          | 11 +++--
 .../codegen/TestMarshallableMessageMarshaller.java |  2 +-
 .../codegen/TestMarshallableMessageSerializer.java | 11 +++--
 .../TestMarshalledArrayMapMessageMarshaller.java   |  2 +-
 .../TestMarshalledArrayMapMessageSerializer.java   | 11 +++--
 .../TestMarshalledCollectionMessageMarshaller.java |  2 +-
 .../TestMarshalledCollectionMessageSerializer.java | 11 +++--
 .../TestMarshalledMapMessageMarshaller.java        |  2 +-
 .../TestMarshalledMapMessageSerializer.java        | 11 +++--
 .../codegen/TestMarshalledMessageMarshaller.java   |  2 +-
 .../codegen/TestMarshalledMessageSerializer.java   | 11 +++--
 .../TestMarshalledObjectsMessageMarshaller.java    |  2 +-
 .../TestMarshalledObjectsMessageSerializer.java    | 11 +++--
 .../resources/codegen/TestMessageMarshaller.java   |  2 +-
 .../resources/codegen/TestMessageSerializer.java   | 11 +++--
 .../codegen/TestNestedDeployMessageDeployer.java   |  2 +-
 .../query/h2/twostep/msg/GridH2Null.java           |  2 +-
 .../h2/twostep/msg/GridH2ValueMessageFactory.java  | 57 +++++++++++-----------
 .../extensions/communication/MessageFactory.java   | 14 +++---
 .../communication/MessageSerializer.java           |  5 ++
 .../discovery/zk/internal/ZkMessageFactory.java    | 12 ++---
 52 files changed, 253 insertions(+), 194 deletions(-)

diff --git 
a/modules/codegen/src/main/java/org/apache/ignite/internal/MessageCompanionGenerator.java
 
b/modules/codegen/src/main/java/org/apache/ignite/internal/MessageCompanionGenerator.java
index 5bd3a781326..9156694a621 100644
--- 
a/modules/codegen/src/main/java/org/apache/ignite/internal/MessageCompanionGenerator.java
+++ 
b/modules/codegen/src/main/java/org/apache/ignite/internal/MessageCompanionGenerator.java
@@ -178,7 +178,7 @@ public abstract class MessageCompanionGenerator {
         writer.write(NL);
         writer.write(CLS_JAVADOC);
         writer.write(NL);
-        writer.write("public class " + clsName + " implements " + 
interfaceName + "<" + simpleNameWithGeneric(type) + ">");
+        writer.write("public final class " + clsName + " implements " + 
interfaceName + "<" + simpleNameWithGeneric(type) + ">");
     }
 
     /** @return {@code format} formatted with {@code args}, prefixed with 
{@link #indent} tabs. */
diff --git 
a/modules/codegen/src/main/java/org/apache/ignite/internal/MessageSerializerGenerator.java
 
b/modules/codegen/src/main/java/org/apache/ignite/internal/MessageSerializerGenerator.java
index 16cfdace97a..d3344ea8003 100644
--- 
a/modules/codegen/src/main/java/org/apache/ignite/internal/MessageSerializerGenerator.java
+++ 
b/modules/codegen/src/main/java/org/apache/ignite/internal/MessageSerializerGenerator.java
@@ -45,6 +45,7 @@ import org.jetbrains.annotations.Nullable;
 
 import static org.apache.ignite.internal.MessageProcessor.CACHE_OBJECT_CLS;
 import static 
org.apache.ignite.internal.MessageProcessor.COMPRESSED_MESSAGE_CLASS;
+import static org.apache.ignite.internal.MessageProcessor.GRID_H2_NULL;
 import static org.apache.ignite.internal.MessageProcessor.KEY_CACHE_OBJECT_CLS;
 import static org.apache.ignite.internal.MessageProcessor.MESSAGE_INTERFACE;
 
@@ -133,7 +134,6 @@ public class MessageSerializerGenerator extends 
MessageCompanionGenerator {
     /** {@inheritDoc} */
     @Override protected String buildClassCode(String serClsName) throws 
IOException {
         try (Writer writer = new StringWriter()) {
-            imports.add(type.toString());
             imports.add(MESSAGE_SERIALIZER_CLS);
             imports.add(MESSAGE_WRITER_CLS);
             imports.add(MESSAGE_READER_CLS);
@@ -152,6 +152,10 @@ public class MessageSerializerGenerator extends 
MessageCompanionGenerator {
             for (String r: read)
                 writer.write(r + NL);
 
+            writer.write(NL);
+
+            writeCreateMessage(writer);
+
             writer.write("}");
 
             return writer.toString();
@@ -183,7 +187,7 @@ public class MessageSerializerGenerator extends 
MessageCompanionGenerator {
     private void generateMethod(List<String> code, List<VariableElement> 
fields, boolean write) throws Exception {
         code.add(indentedLine(METHOD_JAVADOC));
 
-        code.add(indentedLine("@Override public boolean %s(" + 
simpleNameWithGeneric(type) + " msg, %s) {",
+        code.add(indentedLine("@Override public final boolean %s(" + 
simpleNameWithGeneric(type) + " msg, %s) {",
             write ? "writeTo" : "readFrom", write ? "MessageWriter writer" : 
"MessageReader reader"));
 
         indent++;
@@ -222,6 +226,23 @@ public class MessageSerializerGenerator extends 
MessageCompanionGenerator {
         code.add(indentedLine("}"));
     }
 
+    /** Writes {@code MessageSerializer#createMessage()} method body. */
+    private void writeCreateMessage(Writer writer) throws IOException {
+        writer.write(TAB + "/** {@inheritDoc} */");
+        writer.write(NL);
+        writer.write(TAB + "@Override public final " + type.getSimpleName() + 
" createMessage() {");
+        writer.write(NL);
+
+        if (type.getQualifiedName().contentEquals(GRID_H2_NULL))
+            writer.write(TAB + TAB + "return GridH2Null.INSTANCE;");
+        else
+            writer.write(TAB + TAB + "return new " + type.getSimpleName() + 
"();");
+
+        writer.write(NL);
+        writer.write(TAB + "}");
+        writer.write(NL);
+    }
+
     /**
      * @param field Field.
      * @param opt Case option.
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/CompressedMessageSerializer.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/CompressedMessageSerializer.java
index 44ae6ab390b..7661a114219 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/CompressedMessageSerializer.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/CompressedMessageSerializer.java
@@ -126,4 +126,9 @@ public class CompressedMessageSerializer implements 
MessageSerializer<Compressed
             }
         }
     }
+
+    /** {@inheritDoc} */
+    @Override public CompressedMessage createMessage() {
+        return new CompressedMessage();
+    }
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/IgniteMessageFactory.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/IgniteMessageFactory.java
index 13c8760b4c3..e9a1b7c1241 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/IgniteMessageFactory.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/IgniteMessageFactory.java
@@ -17,7 +17,6 @@
 
 package org.apache.ignite.internal.managers.communication;
 
-import java.util.function.Supplier;
 import org.apache.ignite.IgniteException;
 import org.apache.ignite.internal.processors.cache.GridCacheMessage;
 import org.apache.ignite.internal.processors.cache.GridCacheMessageDeployer;
@@ -38,9 +37,9 @@ import org.jetbrains.annotations.Nullable;
  */
 public interface IgniteMessageFactory<M extends Message, CM extends 
GridCacheMessage> extends MessageFactory<M> {
     /** {@inheritDoc} */
-    @Override default void register(short directType, Supplier<M> supplier, 
MessageSerializer<M> serializer)
+    @Override default void register(short directType, MessageSerializer<M> 
serializer)
         throws IgniteException {
-        register(directType, supplier, serializer, null, null);
+        register(directType, serializer, null, null);
     }
 
     /**
@@ -48,14 +47,13 @@ public interface IgniteMessageFactory<M extends Message, CM 
extends GridCacheMes
      * during construction of the class that implements this interface.
      *
      * @param directType Direct type ({@link Message#directType()}) to 
register the message under.
-     * @param supplier Message supplier.
      * @param serializer Message serializer.
      * @param marshaller Message marshaller, or {@code null} for 
non-marshallable messages.
      * @throws IgniteException If a message is already registered under the 
given direct type.
      */
-    default void register(short directType, Supplier<M> supplier, 
MessageSerializer<M> serializer,
+    default void register(short directType, MessageSerializer<M> serializer,
         @Nullable MessageMarshaller<M> marshaller) throws IgniteException {
-        register(directType, supplier, serializer, marshaller, null);
+        register(directType, serializer, marshaller, null);
     }
 
     /**
@@ -63,13 +61,12 @@ public interface IgniteMessageFactory<M extends Message, CM 
extends GridCacheMes
      * registered during construction of the class that implements this 
interface.
      *
      * @param directType Direct type ({@link Message#directType()}) to 
register the message under.
-     * @param supplier Message supplier.
      * @param serializer Message serializer.
      * @param marshaller Message marshaller, or {@code null} for 
non-marshallable messages.
      * @param deployer Message deployer, or {@code null} for messages without 
deployable fields.
      * @throws IgniteException If a message is already registered under the 
given direct type.
      */
-    public void register(short directType, Supplier<M> supplier, 
MessageSerializer<M> serializer,
+    public void register(short directType, MessageSerializer<M> serializer,
         @Nullable MessageMarshaller<M> marshaller, @Nullable 
GridCacheMessageDeployer<CM> deployer) throws IgniteException;
 
     /**
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/IgniteMessageFactoryImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/IgniteMessageFactoryImpl.java
index d0e90a7b561..a44bbf2706e 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/IgniteMessageFactoryImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/IgniteMessageFactoryImpl.java
@@ -18,7 +18,6 @@
 package org.apache.ignite.internal.managers.communication;
 
 import java.lang.reflect.Array;
-import java.util.function.Supplier;
 import org.apache.ignite.IgniteException;
 import org.apache.ignite.internal.MarshallableMessage;
 import org.apache.ignite.internal.processors.cache.DeployableMessage;
@@ -42,9 +41,6 @@ public class IgniteMessageFactoryImpl<M extends Message, CM 
extends GridCacheMes
     /** Array size. */
     private static final int ARR_SIZE = 1 << Short.SIZE;
 
-    /** Message suppliers. */
-    private final Supplier<M>[] msgSuppliers = 
(Supplier<M>[])Array.newInstance(Supplier.class, ARR_SIZE);
-
     /** Message serializers. */
     private final MessageSerializer<M>[] msgSerializers = 
(MessageSerializer<M>[])Array.newInstance(MessageSerializer.class, ARR_SIZE);
 
@@ -82,12 +78,11 @@ public class IgniteMessageFactoryImpl<M extends Message, CM 
extends GridCacheMes
      * Registers a message with a serializer, an optional marshaller, and an 
optional deployer.
      *
      * @param directType Direct type ({@link Message#directType()}) to 
register the message under.
-     * @param supplier Message supplier.
      * @param serializer Message serializer.
      * @param marshaller Message marshaller, or {@code null} for {@link 
NonMarshallableMessage} types.
      * @param deployer Message deployer, or {@code null} for messages without 
deployable fields.
      */
-    @Override public void register(short directType, Supplier<M> supplier, 
MessageSerializer<M> serializer,
+    @Override public void register(short directType, MessageSerializer<M> 
serializer,
         @Nullable MessageMarshaller<M> marshaller, @Nullable 
GridCacheMessageDeployer<CM> deployer) throws IgniteException {
         if (initialized) {
             throw new IllegalStateException("Message factory is already 
initialized. " +
@@ -95,7 +90,7 @@ public class IgniteMessageFactoryImpl<M extends Message, CM 
extends GridCacheMes
         }
 
         try {
-            Message msg = supplier.get();
+            Message msg = serializer.createMessage();
 
             if (marshaller == null && msg instanceof MarshallableMessage) {
                 throw new IgniteException("Failed to register a message: it 
implements MarshallableMessage but no" +
@@ -118,10 +113,9 @@ public class IgniteMessageFactoryImpl<M extends Message, 
CM extends GridCacheMes
 
         int idx = directTypeToIndex(directType);
 
-        Supplier<M> curr = msgSuppliers[idx];
+        MessageSerializer<M> curr = msgSerializers[idx];
 
         if (curr == null) {
-            msgSuppliers[idx] = supplier;
             msgSerializers[idx] = serializer;
             msgMarshallers[idx] = marshaller;
             msgDeployers[idx] = deployer;
@@ -144,12 +138,12 @@ public class IgniteMessageFactoryImpl<M extends Message, 
CM extends GridCacheMes
      * @throws UnknownMessageException If no message is registered under the 
given {@code directType}.
      */
     @Override public M create(short directType) {
-        Supplier<M> supplier = msgSuppliers[directTypeToIndex(directType)];
+        MessageSerializer<M> serializer = 
msgSerializers[directTypeToIndex(directType)];
 
-        if (supplier == null)
+        if (serializer == null)
             throw new UnknownMessageException(directType);
 
-        return supplier.get();
+        return serializer.createMessage();
     }
 
     /** {@inheritDoc} */
@@ -182,7 +176,7 @@ public class IgniteMessageFactoryImpl<M extends Message, CM 
extends GridCacheMes
 
         if (cnt > 0) {
             for (int i = minIdx, p = 0; i <= maxIdx; i++) {
-                if (msgSuppliers[i] != null)
+                if (msgSerializers[i] != null)
                     res[p++] = indexToDirectType(i);
             }
         }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/plugin/AbstractMarshallableMessageFactoryProvider.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/plugin/AbstractMarshallableMessageFactoryProvider.java
index 94b3457133f..05299f7b438 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/plugin/AbstractMarshallableMessageFactoryProvider.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/plugin/AbstractMarshallableMessageFactoryProvider.java
@@ -18,7 +18,6 @@
 package org.apache.ignite.internal.plugin;
 
 import java.lang.reflect.Constructor;
-import java.util.function.Supplier;
 import org.apache.ignite.IgniteException;
 import org.apache.ignite.internal.MarshallableMessage;
 import org.apache.ignite.internal.UseBinaryMarshaller;
@@ -64,37 +63,11 @@ public abstract class 
AbstractMarshallableMessageFactoryProvider implements Mess
 
     /** Register a message with a caller-provided {@code id}. */
     protected <T extends Message> void register(IgniteMessageFactory factory, 
Class<T> cls, short id) {
-        Constructor<T> ctor;
-
-        try {
-            ctor = cls.getConstructor();
-        }
-        catch (NoSuchMethodException e) {
-            throw new IgniteException("Failed to register message of type " + 
cls.getSimpleName(), e);
-        }
-
-        register(factory, cls, id, () -> {
-            try {
-                return ctor.newInstance();
-            }
-            catch (Exception e) {
-                throw new IgniteException("Failed to create message of type " 
+ cls.getSimpleName(), e);
-            }
-        });
-    }
-
-    /**
-     * Registers a message with a caller-provided {@code supplier} and its 
generated serializer, marshaller (if
-     * marshallable), and deployer (if any). Use this overload when {@code 
cls} is package-private and so cannot be
-     * instantiated by reflection from this package — pass an in-package 
{@code ::new} reference as {@code supplier}.
-     */
-    protected <T extends Message> void register(IgniteMessageFactory factory, 
Class<T> cls, short id, Supplier<Message> supplier) {
-        register(factory, cls, id, supplier, 
cls.getAnnotation(UseBinaryMarshaller.class) != null ? schemaAwareMarsh : 
dfltMarsh);
+        register(factory, cls, id, 
cls.getAnnotation(UseBinaryMarshaller.class) != null ? schemaAwareMarsh : 
dfltMarsh);
     }
 
     /** */
-    private static <T extends Message> void register(IgniteMessageFactory 
factory, Class<T> cls, short id,
-        Supplier<Message> supplier, Marshaller marsh) {
+    private static <T extends Message> void register(IgniteMessageFactory 
factory, Class<T> cls, short id, Marshaller marsh) {
         MessageSerializer<T> serializer = requireGenerated(cls, "Serializer", 
marsh);
 
         // A MarshallableMessage always gets a generated marshaller (the hook 
call alone is a statement), so its
@@ -116,7 +89,7 @@ public abstract class 
AbstractMarshallableMessageFactoryProvider implements Mess
             ? loadGenerated(cls, "Deployer", marsh)
             : null;
 
-        factory.register(id, supplier, serializer, marshaller, deployer);
+        factory.register(id, serializer, marshaller, deployer);
     }
 
     /** Loads the generated companion like {@link #loadGenerated}, failing 
fast when it is missing. */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/spi/IgniteSpiAdapter.java 
b/modules/core/src/main/java/org/apache/ignite/spi/IgniteSpiAdapter.java
index 49ba98811b5..850b196a747 100644
--- a/modules/core/src/main/java/org/apache/ignite/spi/IgniteSpiAdapter.java
+++ b/modules/core/src/main/java/org/apache/ignite/spi/IgniteSpiAdapter.java
@@ -24,7 +24,6 @@ import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.function.Consumer;
-import java.util.function.Supplier;
 import javax.management.JMException;
 import javax.management.MBeanServer;
 import javax.management.ObjectName;
@@ -761,7 +760,6 @@ public abstract class IgniteSpiAdapter implements IgniteSpi 
{
                 msgFactory0 = new IgniteMessageFactory<>() {
                     @Override public void register(
                         short directType,
-                        Supplier<Message> supplier,
                         MessageSerializer<Message> serializer,
                         @Nullable MessageMarshaller<Message> marshaller,
                         @Nullable GridCacheMessageDeployer<GridCacheMessage> 
deployer
diff --git 
a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/internal/GridNioServerWrapper.java
 
b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/internal/GridNioServerWrapper.java
index 5858916b3ca..7874adb5629 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/internal/GridNioServerWrapper.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/internal/GridNioServerWrapper.java
@@ -811,12 +811,11 @@ public class GridNioServerWrapper {
 
                     @Override public void register(
                         short directType,
-                        Supplier<Message> supplier,
                         MessageSerializer<Message> serializer,
                         @Nullable MessageMarshaller<Message> marshaller,
                         @Nullable GridCacheMessageDeployer<GridCacheMessage> 
deployer
                     ) throws IgniteException {
-                        get().register(directType, supplier, serializer, 
marshaller, deployer);
+                        get().register(directType, serializer, marshaller, 
deployer);
                     }
 
                     @Nullable @Override public Message create(short type) {
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/direct/DirectMarshallingMessagesTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/direct/DirectMarshallingMessagesTest.java
index b7273e53665..3e46ceae987 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/direct/DirectMarshallingMessagesTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/direct/DirectMarshallingMessagesTest.java
@@ -46,11 +46,7 @@ public class DirectMarshallingMessagesTest extends 
GridCommonAbstractTest {
     private final MessageFactory msgFactory =
         new IgniteMessageFactoryImpl(new MessageFactoryProvider[] {
             new CoreMessagesProvider(jdk(), jdk()),
-            factory -> factory.register(
-                TestNestedContainersMessage.TYPE,
-                TestNestedContainersMessage::new,
-                new TestNestedContainersMessageSerializer()
-            )
+            factory -> factory.register(TestNestedContainersMessage.TYPE, new 
TestNestedContainersMessageSerializer())
         });
 
     /** */
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/direct/stream/DirectByteBufferStreamImplByteOrderSelfTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/direct/stream/DirectByteBufferStreamImplByteOrderSelfTest.java
index 5fed920d1f2..b89be4bf166 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/direct/stream/DirectByteBufferStreamImplByteOrderSelfTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/direct/stream/DirectByteBufferStreamImplByteOrderSelfTest.java
@@ -22,7 +22,6 @@ import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Random;
-import java.util.function.Supplier;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.ignite.IgniteException;
 import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
@@ -89,8 +88,7 @@ public class DirectByteBufferStreamImplByteOrderSelfTest {
      */
     private static DirectByteBufferStream createStream(ByteBuffer buff) {
         DirectByteBufferStream stream = new DirectByteBufferStream(new 
MessageFactory<>() {
-            @Override public void register(short directType, Supplier<Message> 
supplier,
-                MessageSerializer<Message> serializer) throws IgniteException {
+            @Override public void register(short directType, 
MessageSerializer<Message> serializer) throws IgniteException {
                 throw new UnsupportedOperationException();
             }
 
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/GridCommunicationSendMessageSelfTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/GridCommunicationSendMessageSelfTest.java
index a2b656f117a..56e6a0e130b 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/GridCommunicationSendMessageSelfTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/GridCommunicationSendMessageSelfTest.java
@@ -150,8 +150,8 @@ public class GridCommunicationSendMessageSelfTest extends 
GridCommonAbstractTest
         @Override public void initExtensions(PluginContext ctx, 
ExtensionRegistry registry) {
             registry.registerExtension(MessageFactoryProvider.class, new 
MessageFactoryProvider() {
                 @Override public void registerAll(IgniteMessageFactory 
factory) {
-                    factory.register(DIRECT_TYPE, TestValidByteIdMessage::new, 
new TestValidByteIdMessageSerializer());
-                    factory.register(DIRECT_TYPE_OVER_BYTE, 
TestOverByteIdMessage::new, new TestOverByteIdMessageSerializer());
+                    factory.register(DIRECT_TYPE, new 
TestValidByteIdMessageSerializer());
+                    factory.register(DIRECT_TYPE_OVER_BYTE, new 
TestOverByteIdMessageSerializer());
                 }
             });
         }
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/GridIoManagerOrderedUnmarshalFailureTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/GridIoManagerOrderedUnmarshalFailureTest.java
index 146fc3a0e44..e7dadfbd7e0 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/GridIoManagerOrderedUnmarshalFailureTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/GridIoManagerOrderedUnmarshalFailureTest.java
@@ -81,7 +81,7 @@ public class GridIoManagerOrderedUnmarshalFailureTest extends 
GridCommonAbstract
 
             @Override public void initExtensions(PluginContext ctx, 
ExtensionRegistry registry) {
                 registry.registerExtension(MessageFactoryProvider.class, 
factory ->
-                    factory.register(TYPE, FailingUnmarshalMessage::new, new 
Serializer(), new FailingMarshaller()));
+                    factory.register(TYPE, new Serializer(), new 
FailingMarshaller()));
             }
         });
 
@@ -232,6 +232,11 @@ public class GridIoManagerOrderedUnmarshalFailureTest 
extends GridCommonAbstract
 
             return true;
         }
+
+        /** {@inheritDoc} */
+        @Override public FailingUnmarshalMessage createMessage() {
+            return new FailingUnmarshalMessage();
+        }
     }
 
     /** Fails the unmarshal of the flagged messages. */
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/IgniteMessageFactoryImplTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/IgniteMessageFactoryImplTest.java
index 1e0e47760be..9bc7531da0a 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/IgniteMessageFactoryImplTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/IgniteMessageFactoryImplTest.java
@@ -22,6 +22,7 @@ import org.apache.ignite.internal.CoreMessagesProvider;
 import org.apache.ignite.plugin.extensions.communication.Message;
 import org.apache.ignite.plugin.extensions.communication.MessageFactory;
 import 
org.apache.ignite.plugin.extensions.communication.MessageFactoryProvider;
+import org.apache.ignite.plugin.extensions.communication.MessageSerializer;
 import org.junit.Test;
 
 import static 
org.apache.ignite.internal.managers.communication.TestMessage1.TEST_MSG_1_TYPE;
@@ -46,7 +47,7 @@ public class IgniteMessageFactoryImplTest {
 
         MessageFactory msgFactory = new IgniteMessageFactoryImpl(factories);
 
-        msgFactory.register((short)0, () -> null, null);
+        msgFactory.register((short)0, (MessageSerializer)null);
     }
 
     /**
@@ -107,8 +108,8 @@ public class IgniteMessageFactoryImplTest {
     private static class TestMessageFactoryPovider implements 
MessageFactoryProvider {
         /** {@inheritDoc} */
         @Override public void registerAll(IgniteMessageFactory factory) {
-            factory.register(TEST_MSG_1_TYPE, TestMessage1::new, new 
TestMessage1Serializer());
-            factory.register(TEST_MSG_42_TYPE, TestMessage42::new, new 
TestMessage42Serializer());
+            factory.register(TEST_MSG_1_TYPE, new TestMessage1Serializer());
+            factory.register(TEST_MSG_42_TYPE, new TestMessage42Serializer());
         }
     }
 
@@ -118,7 +119,7 @@ public class IgniteMessageFactoryImplTest {
     private static class TestMessageFactoryPoviderWithTheSameDirectType 
implements MessageFactoryProvider {
         /** {@inheritDoc} */
         @Override public void registerAll(IgniteMessageFactory factory) {
-            factory.register(TEST_MSG_1_TYPE, TestMessage1::new, new 
TestMessage1Serializer());
+            factory.register(TEST_MSG_1_TYPE, new TestMessage1Serializer());
         }
     }
 
@@ -128,7 +129,7 @@ public class IgniteMessageFactoryImplTest {
     private static class TestMessageFactory implements MessageFactoryProvider {
         /** {@inheritDoc} */
         @Override public void registerAll(IgniteMessageFactory factory) {
-            factory.register(TEST_MSG_2_TYPE, TestMessage2::new, new 
TestMessage2Serializer());
+            factory.register(TEST_MSG_2_TYPE, new TestMessage2Serializer());
         }
     }
 }
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/MessageDirectTypeIdConflictTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/MessageDirectTypeIdConflictTest.java
index 14dec7e5035..f31ee64a1ab 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/MessageDirectTypeIdConflictTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/MessageDirectTypeIdConflictTest.java
@@ -80,7 +80,7 @@ public class MessageDirectTypeIdConflictTest extends 
GridCommonAbstractTest {
         @Override public void initExtensions(PluginContext ctx, 
ExtensionRegistry registry) {
             registry.registerExtension(MessageFactoryProvider.class, new 
MessageFactoryProvider() {
                 @Override public void registerAll(IgniteMessageFactory 
factory) {
-                    factory.register(DIRECT_TYPE, 
DuplicateDirectTypeIdMessage::new, new 
DuplicateDirectTypeIdMessageSerializer());
+                    factory.register(DIRECT_TYPE, new 
DuplicateDirectTypeIdMessageSerializer());
                 }
             });
         }
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/util/nio/IgniteExceptionInNioWorkerSelfTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/util/nio/IgniteExceptionInNioWorkerSelfTest.java
index ce3f9fbeca5..1128dc0bb41 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/util/nio/IgniteExceptionInNioWorkerSelfTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/util/nio/IgniteExceptionInNioWorkerSelfTest.java
@@ -113,6 +113,11 @@ public class IgniteExceptionInNioWorkerSelfTest extends 
GridCommonAbstractTest {
         @Override public boolean readFrom(BrokenMessage msg, MessageReader 
reader) {
             return true;
         }
+
+        /** {@inheritDoc} */
+        @Override public BrokenMessage createMessage() {
+            return new BrokenMessage();
+        }
     }
 
     /** Plugin provider that registers {@link BrokenMessageSerializer} for 
{@link BrokenMessage}. */
@@ -125,7 +130,7 @@ public class IgniteExceptionInNioWorkerSelfTest extends 
GridCommonAbstractTest {
         /** {@inheritDoc} */
         @Override public void initExtensions(PluginContext ctx, 
ExtensionRegistry registry) {
             registry.registerExtension(MessageFactoryProvider.class, (factory) 
->
-                factory.register(-42, BrokenMessage::new, new 
BrokenMessageSerializer())
+                factory.register(-42, new BrokenMessageSerializer())
             );
         }
     }
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/util/nio/TcpCommunicationSpiSslVolatilePayloadTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/util/nio/TcpCommunicationSpiSslVolatilePayloadTest.java
index 45c0d0ea029..977a23c23bc 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/util/nio/TcpCommunicationSpiSslVolatilePayloadTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/util/nio/TcpCommunicationSpiSslVolatilePayloadTest.java
@@ -95,10 +95,7 @@ public class TcpCommunicationSpiSslVolatilePayloadTest 
extends GridAbstractCommu
 
     /** {@inheritDoc} */
     @Override protected MessageFactoryProvider customMessageFactory() {
-        return f -> f.register(
-            TestVolatilePayloadMessage.DIRECT_TYPE, 
-            TestVolatilePayloadMessage::new, new 
TestVolatilePayloadMessageSerializer()
-        );
+        return f -> f.register(TestVolatilePayloadMessage.DIRECT_TYPE, new 
TestVolatilePayloadMessageSerializer());
     }
 
     /** {@inheritDoc} */
diff --git 
a/modules/core/src/test/java/org/apache/ignite/plugin/extensions/communication/MessageMarshalOnceTest.java
 
b/modules/core/src/test/java/org/apache/ignite/plugin/extensions/communication/MessageMarshalOnceTest.java
index 2583e52b1b1..ad731b0ab2e 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/plugin/extensions/communication/MessageMarshalOnceTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/plugin/extensions/communication/MessageMarshalOnceTest.java
@@ -86,8 +86,8 @@ public class MessageMarshalOnceTest extends 
GridCommonAbstractTest {
 
             @Override public void initExtensions(PluginContext ctx, 
ExtensionRegistry registry) {
                 registry.registerExtension(MessageFactoryProvider.class, 
factory -> {
-                    factory.register(TYPE, MarshalOnceCheckMessage::new, new 
Serializer(), new CountingMarshaller());
-                    factory.register(RETRY_TYPE, RetryCheckMessage::new, new 
RetrySerializer(), new RetryCountingMarshaller());
+                    factory.register(TYPE, new Serializer(), new 
CountingMarshaller());
+                    factory.register(RETRY_TYPE, new RetrySerializer(), new 
RetryCountingMarshaller());
                 });
             }
         });
@@ -171,6 +171,11 @@ public class MessageMarshalOnceTest extends 
GridCommonAbstractTest {
         @Override public boolean readFrom(MarshalOnceCheckMessage msg, 
MessageReader reader) {
             return true;
         }
+
+        /** {@inheritDoc} */
+        @Override public MarshalOnceCheckMessage createMessage() {
+            return new MarshalOnceCheckMessage();
+        }
     }
 
     /** Marshaller that only counts {@code marshal} calls — no idempotency 
guard, so it counts raw invocations. */
@@ -218,6 +223,11 @@ public class MessageMarshalOnceTest extends 
GridCommonAbstractTest {
         @Override public boolean readFrom(RetryCheckMessage msg, MessageReader 
reader) {
             return true;
         }
+
+        /** {@inheritDoc} */
+        @Override public RetryCheckMessage createMessage() {
+            return new RetryCheckMessage();
+        }
     }
 
     /** Marshaller that only counts {@code marshal} calls of {@link 
RetryCheckMessage}. */
diff --git 
a/modules/core/src/test/java/org/apache/ignite/spi/MessagesPluginProvider.java 
b/modules/core/src/test/java/org/apache/ignite/spi/MessagesPluginProvider.java
index b567501f1eb..69a654b2c96 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/spi/MessagesPluginProvider.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/spi/MessagesPluginProvider.java
@@ -17,10 +17,8 @@
 
 package org.apache.ignite.spi;
 
-import java.util.function.Supplier;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.internal.CoreMessagesProvider;
-import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.plugin.AbstractTestPluginProvider;
 import org.apache.ignite.plugin.ExtensionRegistry;
 import org.apache.ignite.plugin.PluginContext;
@@ -45,16 +43,7 @@ public class MessagesPluginProvider extends 
AbstractTestPluginProvider {
             short directType = CoreMessagesProvider.MAX_MESSAGE_ID + 1;
 
             for (Class<? extends Message> msg : msgs) {
-                Supplier<Message> msgSupp = () -> {
-                    try {
-                        return U.newInstance(msg);
-                    }
-                    catch (IgniteCheckedException e) {
-                        throw new RuntimeException(e);
-                    }
-                };
-
-                f.register(directType, msgSupp, loadSerializer(msg));
+                f.register(directType, loadSerializer(msg));
 
                 directType++;
             }
diff --git 
a/modules/core/src/test/java/org/apache/ignite/spi/communication/GridCacheMessageSelfTest.java
 
b/modules/core/src/test/java/org/apache/ignite/spi/communication/GridCacheMessageSelfTest.java
index 53570527138..b0dcace6bb6 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/spi/communication/GridCacheMessageSelfTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/spi/communication/GridCacheMessageSelfTest.java
@@ -231,11 +231,11 @@ public class GridCacheMessageSelfTest extends 
GridCommonAbstractTest {
         /** {@inheritDoc} */
         @Override public void initExtensions(PluginContext ctx, 
ExtensionRegistry registry) {
             registry.registerExtension(MessageFactoryProvider.class, factory 
-> {
-                factory.register(TestMessage.DIRECT_TYPE, TestMessage::new, 
new TestMessageSerializer());
-                factory.register(GridTestMessage.DIRECT_TYPE, 
GridTestMessage::new, new GridTestMessageSerializer());
-                factory.register(TestMessage1.DIRECT_TYPE, TestMessage1::new, 
new TestMessage1Serializer());
-                factory.register(TestMessage2.DIRECT_TYPE, TestMessage2::new, 
new TestMessage2Serializer());
-                factory.register(TestBadMessage.DIRECT_TYPE, 
TestBadMessage::new, new TestBadMessageSerializer());
+                factory.register(TestMessage.DIRECT_TYPE, new 
TestMessageSerializer());
+                factory.register(GridTestMessage.DIRECT_TYPE, new 
GridTestMessageSerializer());
+                factory.register(TestMessage1.DIRECT_TYPE, new 
TestMessage1Serializer());
+                factory.register(TestMessage2.DIRECT_TYPE, new 
TestMessage2Serializer());
+                factory.register(TestBadMessage.DIRECT_TYPE, new 
TestBadMessageSerializer());
             });
         }
     }
diff --git 
a/modules/core/src/test/java/org/apache/ignite/spi/communication/GridTestMessage.java
 
b/modules/core/src/test/java/org/apache/ignite/spi/communication/GridTestMessage.java
index 83a6ea91775..1310ac30936 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/spi/communication/GridTestMessage.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/spi/communication/GridTestMessage.java
@@ -32,7 +32,7 @@ public class GridTestMessage implements Message {
 
     /** */
     public static final MessageFactoryProvider GRID_TEST_MESSAGE_FACTORY = f 
-> f.register(
-        GridTestMessage.DIRECT_TYPE, GridTestMessage::new, new 
GridTestMessageSerializer());
+        GridTestMessage.DIRECT_TYPE, new GridTestMessageSerializer());
 
     /** */
     @Order(0)
diff --git 
a/modules/core/src/test/java/org/apache/ignite/spi/communication/tcp/TestDelayMessageSerializer.java
 
b/modules/core/src/test/java/org/apache/ignite/spi/communication/tcp/TestDelayMessageSerializer.java
index f1e69422a93..ce905b9806f 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/spi/communication/tcp/TestDelayMessageSerializer.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/spi/communication/tcp/TestDelayMessageSerializer.java
@@ -50,4 +50,9 @@ public class TestDelayMessageSerializer implements 
MessageSerializer<TestDelayMe
     @Override public boolean readFrom(TestDelayMessage msg, MessageReader 
reader) {
         return true;
     }
+
+    /** {@inheritDoc} */
+    @Override public TestDelayMessage createMessage() {
+        return new TestDelayMessage();
+    }
 }
diff --git 
a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/DiscoveryDeserializationExceptionTest.java
 
b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/DiscoveryDeserializationExceptionTest.java
index cfe047d58e7..62ea2d700a8 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/DiscoveryDeserializationExceptionTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/DiscoveryDeserializationExceptionTest.java
@@ -138,7 +138,7 @@ public class DiscoveryDeserializationExceptionTest extends 
GridCommonAbstractTes
         /** {@inheritDoc} */
         @Override public void initExtensions(PluginContext ctx, 
ExtensionRegistry registry) {
             registry.registerExtension(MessageFactoryProvider.class, (factory) 
->
-                factory.register(MSG_DIRECT_TYPE, NotRegisteredMessage::new, 
new NotRegisteredMessageSerializer())
+                factory.register(MSG_DIRECT_TYPE, new 
NotRegisteredMessageSerializer())
             );
         }
     }
diff --git 
a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/DiscoveryUnmarshalVulnerabilityTest.java
 
b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/DiscoveryUnmarshalVulnerabilityTest.java
index 62d194d2970..a146d0f2fd9 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/DiscoveryUnmarshalVulnerabilityTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/DiscoveryUnmarshalVulnerabilityTest.java
@@ -91,7 +91,6 @@ public class DiscoveryUnmarshalVulnerabilityTest extends 
GridCommonAbstractTest
             @Override public void registerAll(IgniteMessageFactory factory) {
                 factory.register(
                     (short)(CoreMessagesProvider.MAX_MESSAGE_ID + 1),
-                    ExploitMessage::new,
                     new MessageSerializerWrapper(),
                     new MessageMarshallerWrapper(this));
             }
@@ -271,6 +270,11 @@ public class DiscoveryUnmarshalVulnerabilityTest extends 
GridCommonAbstractTest
             return serde.readFrom(msg, reader);
         }
 
+        /** {@inheritDoc} */
+        @Override public ExploitMessage createMessage() {
+            return new ExploitMessage();
+        }
+
         /** */
         private void initIfNecessary() {
             if (init.get() && init.compareAndSet(true, false))
diff --git 
a/modules/core/src/test/resources/codegen/ChildMessageSerializer.java 
b/modules/core/src/test/resources/codegen/ChildMessageSerializer.java
index 9ca035db404..8f77e193422 100644
--- a/modules/core/src/test/resources/codegen/ChildMessageSerializer.java
+++ b/modules/core/src/test/resources/codegen/ChildMessageSerializer.java
@@ -28,9 +28,9 @@ import 
org.apache.ignite.plugin.extensions.communication.MessageWriter;
  *
  * @see org.apache.ignite.internal.MessageProcessor
  */
-public class ChildMessageSerializer implements MessageSerializer<ChildMessage> 
{
+public final class ChildMessageSerializer implements 
MessageSerializer<ChildMessage> {
     /** */
-    @Override public boolean writeTo(ChildMessage msg, MessageWriter writer) {
+    @Override public final boolean writeTo(ChildMessage msg, MessageWriter 
writer) {
         if (!writer.isHeaderWritten()) {
             if (!writer.writeHeader(msg.directType()))
                 return false;
@@ -68,7 +68,7 @@ public class ChildMessageSerializer implements 
MessageSerializer<ChildMessage> {
     }
 
     /** */
-    @Override public boolean readFrom(ChildMessage msg, MessageReader reader) {
+    @Override public final boolean readFrom(ChildMessage msg, MessageReader 
reader) {
         switch (reader.state()) {
             case 0:
                 ((AbstractMessage)msg).id = reader.readInt();
@@ -105,4 +105,9 @@ public class ChildMessageSerializer implements 
MessageSerializer<ChildMessage> {
 
         return true;
     }
+
+    /** {@inheritDoc} */
+    @Override public final ChildMessage createMessage() {
+        return new ChildMessage();
+    }
 }
\ No newline at end of file
diff --git 
a/modules/core/src/test/resources/codegen/CustomMapperEnumFieldsMessageSerializer.java
 
b/modules/core/src/test/resources/codegen/CustomMapperEnumFieldsMessageSerializer.java
index 90c17f72b03..8d572106c43 100644
--- 
a/modules/core/src/test/resources/codegen/CustomMapperEnumFieldsMessageSerializer.java
+++ 
b/modules/core/src/test/resources/codegen/CustomMapperEnumFieldsMessageSerializer.java
@@ -30,12 +30,12 @@ import org.apache.ignite.transactions.TransactionIsolation;
  *
  * @see org.apache.ignite.internal.MessageProcessor
  */
-public class CustomMapperEnumFieldsMessageSerializer implements 
MessageSerializer<CustomMapperEnumFieldsMessage> {
+public final class CustomMapperEnumFieldsMessageSerializer implements 
MessageSerializer<CustomMapperEnumFieldsMessage> {
     /** */
     private final EnumMapper<TransactionIsolation> transactionIsolationMapper 
= new TransactionIsolationEnumMapper();
 
     /** */
-    @Override public boolean writeTo(CustomMapperEnumFieldsMessage msg, 
MessageWriter writer) {
+    @Override public final boolean writeTo(CustomMapperEnumFieldsMessage msg, 
MessageWriter writer) {
         if (!writer.isHeaderWritten()) {
             if (!writer.writeHeader(msg.directType()))
                 return false;
@@ -55,7 +55,7 @@ public class CustomMapperEnumFieldsMessageSerializer 
implements MessageSerialize
     }
 
     /** */
-    @Override public boolean readFrom(CustomMapperEnumFieldsMessage msg, 
MessageReader reader) {
+    @Override public final boolean readFrom(CustomMapperEnumFieldsMessage msg, 
MessageReader reader) {
         switch (reader.state()) {
             case 0:
                 msg.txMode = 
transactionIsolationMapper.decode(reader.readByte());
@@ -68,4 +68,9 @@ public class CustomMapperEnumFieldsMessageSerializer 
implements MessageSerialize
 
         return true;
     }
+
+    /** {@inheritDoc} */
+    @Override public final CustomMapperEnumFieldsMessage createMessage() {
+        return new CustomMapperEnumFieldsMessage();
+    }
 }
diff --git 
a/modules/core/src/test/resources/codegen/DefaultMapperEnumFieldsMessageSerializer.java
 
b/modules/core/src/test/resources/codegen/DefaultMapperEnumFieldsMessageSerializer.java
index 245f1f29ae8..da05e0d2408 100644
--- 
a/modules/core/src/test/resources/codegen/DefaultMapperEnumFieldsMessageSerializer.java
+++ 
b/modules/core/src/test/resources/codegen/DefaultMapperEnumFieldsMessageSerializer.java
@@ -30,14 +30,14 @@ import org.apache.ignite.transactions.TransactionIsolation;
  *
  * @see org.apache.ignite.internal.MessageProcessor
  */
-public class DefaultMapperEnumFieldsMessageSerializer implements 
MessageSerializer<DefaultMapperEnumFieldsMessage> {
+public final class DefaultMapperEnumFieldsMessageSerializer implements 
MessageSerializer<DefaultMapperEnumFieldsMessage> {
     /** */
     private final GridCacheOperation[] gridCacheOperationVals = 
GridCacheOperation.values();
     /** */
     private final TransactionIsolation[] transactionIsolationVals = 
TransactionIsolation.values();
 
     /** */
-    @Override public boolean writeTo(DefaultMapperEnumFieldsMessage msg, 
MessageWriter writer) {
+    @Override public final boolean writeTo(DefaultMapperEnumFieldsMessage msg, 
MessageWriter writer) {
         if (!writer.isHeaderWritten()) {
             if (!writer.writeHeader(msg.directType()))
                 return false;
@@ -63,7 +63,7 @@ public class DefaultMapperEnumFieldsMessageSerializer 
implements MessageSerializ
     }
 
     /** */
-    @Override public boolean readFrom(DefaultMapperEnumFieldsMessage msg, 
MessageReader reader) {
+    @Override public final boolean readFrom(DefaultMapperEnumFieldsMessage 
msg, MessageReader reader) {
         switch (reader.state()) {
             case 0:
                 msg.publicEnum = 
DefaultEnumMapper.INSTANCE.decode(transactionIsolationVals, reader.readByte());
@@ -84,4 +84,9 @@ public class DefaultMapperEnumFieldsMessageSerializer 
implements MessageSerializ
 
         return true;
     }
+
+    /** {@inheritDoc} */
+    @Override public final DefaultMapperEnumFieldsMessage createMessage() {
+        return new DefaultMapperEnumFieldsMessage();
+    }
 }
\ No newline at end of file
diff --git 
a/modules/core/src/test/resources/codegen/TestCacheIdMessageDeployer.java 
b/modules/core/src/test/resources/codegen/TestCacheIdMessageDeployer.java
index 00200f0d59c..9e70286b1fa 100644
--- a/modules/core/src/test/resources/codegen/TestCacheIdMessageDeployer.java
+++ b/modules/core/src/test/resources/codegen/TestCacheIdMessageDeployer.java
@@ -28,7 +28,7 @@ import 
org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
  *
  * @see org.apache.ignite.internal.MessageProcessor
  */
-public class TestCacheIdMessageDeployer implements 
GridCacheMessageDeployer<TestCacheIdMessage> {
+public final class TestCacheIdMessageDeployer implements 
GridCacheMessageDeployer<TestCacheIdMessage> {
     /** */
     @Override public void deploy(TestCacheIdMessage msg, 
GridCacheSharedContext<?, ?> ctx) throws IgniteCheckedException {
         GridCacheContext<?, ?> cctx = ctx.cacheContext(msg.cacheId());
diff --git 
a/modules/core/src/test/resources/codegen/TestCollectionsMessageMarshaller.java 
b/modules/core/src/test/resources/codegen/TestCollectionsMessageMarshaller.java
index 65756b4e70f..5a9334c38d3 100644
--- 
a/modules/core/src/test/resources/codegen/TestCollectionsMessageMarshaller.java
+++ 
b/modules/core/src/test/resources/codegen/TestCollectionsMessageMarshaller.java
@@ -30,7 +30,7 @@ import 
org.apache.ignite.plugin.extensions.communication.MessageMarshaller;
  *
  * @see org.apache.ignite.internal.MessageProcessor
  */
-public class TestCollectionsMessageMarshaller implements 
MessageMarshaller<TestCollectionsMessage> {
+public final class TestCollectionsMessageMarshaller implements 
MessageMarshaller<TestCollectionsMessage> {
     /** */
     @Override public void marshal(TestCollectionsMessage msg, 
GridKernalContext kctx, CacheObjectContext cacheObjCtx) throws 
IgniteCheckedException {
         CacheObjectContext ctx = cacheObjCtx;
diff --git 
a/modules/core/src/test/resources/codegen/TestCollectionsMessageSerializer.java 
b/modules/core/src/test/resources/codegen/TestCollectionsMessageSerializer.java
index bfd66a60f53..080c8cfaaa0 100644
--- 
a/modules/core/src/test/resources/codegen/TestCollectionsMessageSerializer.java
+++ 
b/modules/core/src/test/resources/codegen/TestCollectionsMessageSerializer.java
@@ -30,7 +30,7 @@ import 
org.apache.ignite.plugin.extensions.communication.MessageWriter;
  *
  * @see org.apache.ignite.internal.MessageProcessor
  */
-public class TestCollectionsMessageSerializer implements 
MessageSerializer<TestCollectionsMessage> {
+public final class TestCollectionsMessageSerializer implements 
MessageSerializer<TestCollectionsMessage> {
     /** */
     private static final MessageCollectionType affTopVersionListCollDesc = new 
MessageCollectionType(new 
MessageItemType(MessageCollectionItemType.AFFINITY_TOPOLOGY_VERSION), false);
     /** */
@@ -85,7 +85,7 @@ public class TestCollectionsMessageSerializer implements 
MessageSerializer<TestC
     private static final MessageCollectionType uuidListCollDesc = new 
MessageCollectionType(new MessageItemType(MessageCollectionItemType.UUID), 
false);
 
     /** */
-    @Override public boolean writeTo(TestCollectionsMessage msg, MessageWriter 
writer) {
+    @Override public final boolean writeTo(TestCollectionsMessage msg, 
MessageWriter writer) {
         if (!writer.isHeaderWritten()) {
             if (!writer.writeHeader(msg.directType()))
                 return false;
@@ -255,7 +255,7 @@ public class TestCollectionsMessageSerializer implements 
MessageSerializer<TestC
     }
 
     /** */
-    @Override public boolean readFrom(TestCollectionsMessage msg, 
MessageReader reader) {
+    @Override public final boolean readFrom(TestCollectionsMessage msg, 
MessageReader reader) {
         switch (reader.state()) {
             case 0:
                 msg.booleanArrayList = 
reader.readCollection(booleanArrayListCollDesc);
@@ -468,4 +468,9 @@ public class TestCollectionsMessageSerializer implements 
MessageSerializer<TestC
 
         return true;
     }
+
+    /** {@inheritDoc} */
+    @Override public final TestCollectionsMessage createMessage() {
+        return new TestCollectionsMessage();
+    }
 }
\ No newline at end of file
diff --git 
a/modules/core/src/test/resources/codegen/TestDeployableMessageDeployer.java 
b/modules/core/src/test/resources/codegen/TestDeployableMessageDeployer.java
index f4705cafac8..d0cdb010cb4 100644
--- a/modules/core/src/test/resources/codegen/TestDeployableMessageDeployer.java
+++ b/modules/core/src/test/resources/codegen/TestDeployableMessageDeployer.java
@@ -28,7 +28,7 @@ import 
org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
  *
  * @see org.apache.ignite.internal.MessageProcessor
  */
-public class TestDeployableMessageDeployer implements 
GridCacheMessageDeployer<TestDeployableMessage> {
+public final class TestDeployableMessageDeployer implements 
GridCacheMessageDeployer<TestDeployableMessage> {
     /** */
     @Override public void deploy(TestDeployableMessage msg, 
GridCacheSharedContext<?, ?> ctx) throws IgniteCheckedException {
         GridCacheContext<?, ?> cctx = ctx.cacheContext(msg.cacheId());
diff --git 
a/modules/core/src/test/resources/codegen/TestMapMessageMarshaller.java 
b/modules/core/src/test/resources/codegen/TestMapMessageMarshaller.java
index 240a45f59e9..19927eff321 100644
--- a/modules/core/src/test/resources/codegen/TestMapMessageMarshaller.java
+++ b/modules/core/src/test/resources/codegen/TestMapMessageMarshaller.java
@@ -33,7 +33,7 @@ import 
org.apache.ignite.plugin.extensions.communication.MessageMarshaller;
  *
  * @see org.apache.ignite.internal.MessageProcessor
  */
-public class TestMapMessageMarshaller implements 
MessageMarshaller<TestMapMessage> {
+public final class TestMapMessageMarshaller implements 
MessageMarshaller<TestMapMessage> {
     /** */
     @Override public void marshal(TestMapMessage msg, GridKernalContext kctx, 
CacheObjectContext cacheObjCtx) throws IgniteCheckedException {
         CacheObjectContext ctx = cacheObjCtx;
diff --git 
a/modules/core/src/test/resources/codegen/TestMapMessageSerializer.java 
b/modules/core/src/test/resources/codegen/TestMapMessageSerializer.java
index d282801982b..08c7cb117f0 100644
--- a/modules/core/src/test/resources/codegen/TestMapMessageSerializer.java
+++ b/modules/core/src/test/resources/codegen/TestMapMessageSerializer.java
@@ -31,7 +31,7 @@ import 
org.apache.ignite.plugin.extensions.communication.MessageWriter;
  *
  * @see org.apache.ignite.internal.MessageProcessor
  */
-public class TestMapMessageSerializer implements 
MessageSerializer<TestMapMessage> {
+public final class TestMapMessageSerializer implements 
MessageSerializer<TestMapMessage> {
     /** */
     private static final MessageMapType affTopVersionIgniteUuidMapCollDesc = 
new MessageMapType(new 
MessageItemType(MessageCollectionItemType.AFFINITY_TOPOLOGY_VERSION), new 
MessageItemType(MessageCollectionItemType.IGNITE_UUID), false);
     /** */
@@ -86,7 +86,7 @@ public class TestMapMessageSerializer implements 
MessageSerializer<TestMapMessag
     private static final MessageMapType uuidStringMapCollDesc = new 
MessageMapType(new MessageItemType(MessageCollectionItemType.UUID), new 
MessageItemType(MessageCollectionItemType.STRING), false);
 
     /** */
-    @Override public boolean writeTo(TestMapMessage msg, MessageWriter writer) 
{
+    @Override public final boolean writeTo(TestMapMessage msg, MessageWriter 
writer) {
         if (!writer.isHeaderWritten()) {
             if (!writer.writeHeader(msg.directType()))
                 return false;
@@ -256,7 +256,7 @@ public class TestMapMessageSerializer implements 
MessageSerializer<TestMapMessag
     }
 
     /** */
-    @Override public boolean readFrom(TestMapMessage msg, MessageReader 
reader) {
+    @Override public final boolean readFrom(TestMapMessage msg, MessageReader 
reader) {
         switch (reader.state()) {
             case 0:
                 msg.booleanArrayBoxedLongMap = 
reader.readMap(booleanArrayBoxedLongMapCollDesc);
@@ -469,4 +469,9 @@ public class TestMapMessageSerializer implements 
MessageSerializer<TestMapMessag
 
         return true;
     }
+
+    /** {@inheritDoc} */
+    @Override public final TestMapMessage createMessage() {
+        return new TestMapMessage();
+    }
 }
\ No newline at end of file
diff --git 
a/modules/core/src/test/resources/codegen/TestMarshallableMessageMarshaller.java
 
b/modules/core/src/test/resources/codegen/TestMarshallableMessageMarshaller.java
index 1b6000e40b4..689ecaa39d4 100644
--- 
a/modules/core/src/test/resources/codegen/TestMarshallableMessageMarshaller.java
+++ 
b/modules/core/src/test/resources/codegen/TestMarshallableMessageMarshaller.java
@@ -29,7 +29,7 @@ import 
org.apache.ignite.plugin.extensions.communication.MessageMarshaller;
  *
  * @see org.apache.ignite.internal.MessageProcessor
  */
-public class TestMarshallableMessageMarshaller implements 
MessageMarshaller<TestMarshallableMessage> {
+public final class TestMarshallableMessageMarshaller implements 
MessageMarshaller<TestMarshallableMessage> {
     /** */
     private final Marshaller marshaller;
 
diff --git 
a/modules/core/src/test/resources/codegen/TestMarshallableMessageSerializer.java
 
b/modules/core/src/test/resources/codegen/TestMarshallableMessageSerializer.java
index 04b0bbafe71..b48bc85b38b 100644
--- 
a/modules/core/src/test/resources/codegen/TestMarshallableMessageSerializer.java
+++ 
b/modules/core/src/test/resources/codegen/TestMarshallableMessageSerializer.java
@@ -27,9 +27,9 @@ import 
org.apache.ignite.plugin.extensions.communication.MessageWriter;
  *
  * @see org.apache.ignite.internal.MessageProcessor
  */
-public class TestMarshallableMessageSerializer implements 
MessageSerializer<TestMarshallableMessage> {
+public final class TestMarshallableMessageSerializer implements 
MessageSerializer<TestMarshallableMessage> {
     /** */
-    @Override public boolean writeTo(TestMarshallableMessage msg, 
MessageWriter writer) {
+    @Override public final boolean writeTo(TestMarshallableMessage msg, 
MessageWriter writer) {
         if (!writer.isHeaderWritten()) {
             if (!writer.writeHeader(msg.directType()))
                 return false;
@@ -61,7 +61,7 @@ public class TestMarshallableMessageSerializer implements 
MessageSerializer<Test
     }
 
     /** */
-    @Override public boolean readFrom(TestMarshallableMessage msg, 
MessageReader reader) {
+    @Override public final boolean readFrom(TestMarshallableMessage msg, 
MessageReader reader) {
         switch (reader.state()) {
             case 0:
                 msg.iv = reader.readInt();
@@ -90,4 +90,9 @@ public class TestMarshallableMessageSerializer implements 
MessageSerializer<Test
 
         return true;
     }
+
+    /** {@inheritDoc} */
+    @Override public final TestMarshallableMessage createMessage() {
+        return new TestMarshallableMessage();
+    }
 }
diff --git 
a/modules/core/src/test/resources/codegen/TestMarshalledArrayMapMessageMarshaller.java
 
b/modules/core/src/test/resources/codegen/TestMarshalledArrayMapMessageMarshaller.java
index 3fa9b77f4a5..529c2e22bdd 100644
--- 
a/modules/core/src/test/resources/codegen/TestMarshalledArrayMapMessageMarshaller.java
+++ 
b/modules/core/src/test/resources/codegen/TestMarshalledArrayMapMessageMarshaller.java
@@ -35,7 +35,7 @@ import 
org.apache.ignite.plugin.extensions.communication.MessageMarshaller;
  *
  * @see org.apache.ignite.internal.MessageProcessor
  */
-public class TestMarshalledArrayMapMessageMarshaller implements 
MessageMarshaller<TestMarshalledArrayMapMessage> {
+public final class TestMarshalledArrayMapMessageMarshaller implements 
MessageMarshaller<TestMarshalledArrayMapMessage> {
     /** */
     @Override public void marshal(TestMarshalledArrayMapMessage msg, 
GridKernalContext kctx, CacheObjectContext cacheObjCtx) throws 
IgniteCheckedException {
         IgniteMessageFactory msgFactory = 
(IgniteMessageFactory)kctx.messageFactory();
diff --git 
a/modules/core/src/test/resources/codegen/TestMarshalledArrayMapMessageSerializer.java
 
b/modules/core/src/test/resources/codegen/TestMarshalledArrayMapMessageSerializer.java
index 15f8c4992f2..bc59bc7d808 100644
--- 
a/modules/core/src/test/resources/codegen/TestMarshalledArrayMapMessageSerializer.java
+++ 
b/modules/core/src/test/resources/codegen/TestMarshalledArrayMapMessageSerializer.java
@@ -33,7 +33,7 @@ import 
org.apache.ignite.plugin.extensions.communication.MessageWriter;
  *
  * @see org.apache.ignite.internal.MessageProcessor
  */
-public class TestMarshalledArrayMapMessageSerializer implements 
MessageSerializer<TestMarshalledArrayMapMessage> {
+public final class TestMarshalledArrayMapMessageSerializer implements 
MessageSerializer<TestMarshalledArrayMapMessage> {
     /** */
     private static final MessageArrayType fixedMapKeysCollDesc = new 
MessageArrayType(new MessageItemType(MessageCollectionItemType.MSG), 
GridTopicMessage.class);
     /** */
@@ -44,7 +44,7 @@ public class TestMarshalledArrayMapMessageSerializer 
implements MessageSerialize
     private static final MessageArrayType mapValsCollDesc = new 
MessageArrayType(new MessageCollectionType(new 
MessageItemType(MessageCollectionItemType.MSG), false), List.class);
 
     /** */
-    @Override public boolean writeTo(TestMarshalledArrayMapMessage msg, 
MessageWriter writer) {
+    @Override public final boolean writeTo(TestMarshalledArrayMapMessage msg, 
MessageWriter writer) {
         if (!writer.isHeaderWritten()) {
             if (!writer.writeHeader(msg.directType()))
                 return false;
@@ -82,7 +82,7 @@ public class TestMarshalledArrayMapMessageSerializer 
implements MessageSerialize
     }
 
     /** */
-    @Override public boolean readFrom(TestMarshalledArrayMapMessage msg, 
MessageReader reader) {
+    @Override public final boolean readFrom(TestMarshalledArrayMapMessage msg, 
MessageReader reader) {
         switch (reader.state()) {
             case 0:
                 msg.mapKeys = reader.readObjectArray(mapKeysCollDesc);
@@ -119,4 +119,9 @@ public class TestMarshalledArrayMapMessageSerializer 
implements MessageSerialize
 
         return true;
     }
+
+    /** {@inheritDoc} */
+    @Override public final TestMarshalledArrayMapMessage createMessage() {
+        return new TestMarshalledArrayMapMessage();
+    }
 }
\ No newline at end of file
diff --git 
a/modules/core/src/test/resources/codegen/TestMarshalledCollectionMessageMarshaller.java
 
b/modules/core/src/test/resources/codegen/TestMarshalledCollectionMessageMarshaller.java
index 2fc222b7f4a..ac0e941aba6 100644
--- 
a/modules/core/src/test/resources/codegen/TestMarshalledCollectionMessageMarshaller.java
+++ 
b/modules/core/src/test/resources/codegen/TestMarshalledCollectionMessageMarshaller.java
@@ -30,7 +30,7 @@ import 
org.apache.ignite.plugin.extensions.communication.MessageMarshaller;
  *
  * @see org.apache.ignite.internal.MessageProcessor
  */
-public class TestMarshalledCollectionMessageMarshaller implements 
MessageMarshaller<TestMarshalledCollectionMessage> {
+public final class TestMarshalledCollectionMessageMarshaller implements 
MessageMarshaller<TestMarshalledCollectionMessage> {
     /** */
     @Override public void marshal(TestMarshalledCollectionMessage msg, 
GridKernalContext kctx, CacheObjectContext cacheObjCtx) throws 
IgniteCheckedException {
         if (msg.keys != null && msg.keysArr == null)
diff --git 
a/modules/core/src/test/resources/codegen/TestMarshalledCollectionMessageSerializer.java
 
b/modules/core/src/test/resources/codegen/TestMarshalledCollectionMessageSerializer.java
index c87f1bea77d..43f7bf2f2e9 100644
--- 
a/modules/core/src/test/resources/codegen/TestMarshalledCollectionMessageSerializer.java
+++ 
b/modules/core/src/test/resources/codegen/TestMarshalledCollectionMessageSerializer.java
@@ -31,12 +31,12 @@ import 
org.apache.ignite.plugin.extensions.communication.MessageWriter;
  *
  * @see org.apache.ignite.internal.MessageProcessor
  */
-public class TestMarshalledCollectionMessageSerializer implements 
MessageSerializer<TestMarshalledCollectionMessage> {
+public final class TestMarshalledCollectionMessageSerializer implements 
MessageSerializer<TestMarshalledCollectionMessage> {
     /** */
     private static final MessageArrayType keysArrCollDesc = new 
MessageArrayType(new 
MessageItemType(MessageCollectionItemType.GRID_CACHE_VERSION), 
GridCacheVersion.class);
 
     /** */
-    @Override public boolean writeTo(TestMarshalledCollectionMessage msg, 
MessageWriter writer) {
+    @Override public final boolean writeTo(TestMarshalledCollectionMessage 
msg, MessageWriter writer) {
         if (!writer.isHeaderWritten()) {
             if (!writer.writeHeader(msg.directType()))
                 return false;
@@ -56,7 +56,7 @@ public class TestMarshalledCollectionMessageSerializer 
implements MessageSeriali
     }
 
     /** */
-    @Override public boolean readFrom(TestMarshalledCollectionMessage msg, 
MessageReader reader) {
+    @Override public final boolean readFrom(TestMarshalledCollectionMessage 
msg, MessageReader reader) {
         switch (reader.state()) {
             case 0:
                 msg.keysArr = reader.readObjectArray(keysArrCollDesc);
@@ -69,4 +69,9 @@ public class TestMarshalledCollectionMessageSerializer 
implements MessageSeriali
 
         return true;
     }
+
+    /** {@inheritDoc} */
+    @Override public final TestMarshalledCollectionMessage createMessage() {
+        return new TestMarshalledCollectionMessage();
+    }
 }
\ No newline at end of file
diff --git 
a/modules/core/src/test/resources/codegen/TestMarshalledMapMessageMarshaller.java
 
b/modules/core/src/test/resources/codegen/TestMarshalledMapMessageMarshaller.java
index 5aef2b06ced..a2f346a8f89 100644
--- 
a/modules/core/src/test/resources/codegen/TestMarshalledMapMessageMarshaller.java
+++ 
b/modules/core/src/test/resources/codegen/TestMarshalledMapMessageMarshaller.java
@@ -31,7 +31,7 @@ import 
org.apache.ignite.plugin.extensions.communication.MessageMarshaller;
  *
  * @see org.apache.ignite.internal.MessageProcessor
  */
-public class TestMarshalledMapMessageMarshaller implements 
MessageMarshaller<TestMarshalledMapMessage> {
+public final class TestMarshalledMapMessageMarshaller implements 
MessageMarshaller<TestMarshalledMapMessage> {
     /** */
     @Override public void marshal(TestMarshalledMapMessage msg, 
GridKernalContext kctx, CacheObjectContext cacheObjCtx) throws 
IgniteCheckedException {
         if (msg.theMap != null && msg.mapKeys == null) {
diff --git 
a/modules/core/src/test/resources/codegen/TestMarshalledMapMessageSerializer.java
 
b/modules/core/src/test/resources/codegen/TestMarshalledMapMessageSerializer.java
index 8320b6e22b8..add9975d57b 100644
--- 
a/modules/core/src/test/resources/codegen/TestMarshalledMapMessageSerializer.java
+++ 
b/modules/core/src/test/resources/codegen/TestMarshalledMapMessageSerializer.java
@@ -30,14 +30,14 @@ import 
org.apache.ignite.plugin.extensions.communication.MessageWriter;
  *
  * @see org.apache.ignite.internal.MessageProcessor
  */
-public class TestMarshalledMapMessageSerializer implements 
MessageSerializer<TestMarshalledMapMessage> {
+public final class TestMarshalledMapMessageSerializer implements 
MessageSerializer<TestMarshalledMapMessage> {
     /** */
     private static final MessageCollectionType mapKeysCollDesc = new 
MessageCollectionType(new 
MessageItemType(MessageCollectionItemType.GRID_CACHE_VERSION), false);
     /** */
     private static final MessageCollectionType mapValsCollDesc = new 
MessageCollectionType(new 
MessageItemType(MessageCollectionItemType.GRID_CACHE_VERSION), false);
 
     /** */
-    @Override public boolean writeTo(TestMarshalledMapMessage msg, 
MessageWriter writer) {
+    @Override public final boolean writeTo(TestMarshalledMapMessage msg, 
MessageWriter writer) {
         if (!writer.isHeaderWritten()) {
             if (!writer.writeHeader(msg.directType()))
                 return false;
@@ -63,7 +63,7 @@ public class TestMarshalledMapMessageSerializer implements 
MessageSerializer<Tes
     }
 
     /** */
-    @Override public boolean readFrom(TestMarshalledMapMessage msg, 
MessageReader reader) {
+    @Override public final boolean readFrom(TestMarshalledMapMessage msg, 
MessageReader reader) {
         switch (reader.state()) {
             case 0:
                 msg.mapKeys = reader.readCollection(mapKeysCollDesc);
@@ -84,4 +84,9 @@ public class TestMarshalledMapMessageSerializer implements 
MessageSerializer<Tes
 
         return true;
     }
+
+    /** {@inheritDoc} */
+    @Override public final TestMarshalledMapMessage createMessage() {
+        return new TestMarshalledMapMessage();
+    }
 }
\ No newline at end of file
diff --git 
a/modules/core/src/test/resources/codegen/TestMarshalledMessageMarshaller.java 
b/modules/core/src/test/resources/codegen/TestMarshalledMessageMarshaller.java
index 60de55497a9..77cc8daa382 100644
--- 
a/modules/core/src/test/resources/codegen/TestMarshalledMessageMarshaller.java
+++ 
b/modules/core/src/test/resources/codegen/TestMarshalledMessageMarshaller.java
@@ -30,7 +30,7 @@ import 
org.apache.ignite.plugin.extensions.communication.MessageMarshaller;
  *
  * @see org.apache.ignite.internal.MessageProcessor
  */
-public class TestMarshalledMessageMarshaller implements 
MessageMarshaller<TestMarshalledMessage> {
+public final class TestMarshalledMessageMarshaller implements 
MessageMarshaller<TestMarshalledMessage> {
     /** */
     private final Marshaller marshaller;
 
diff --git 
a/modules/core/src/test/resources/codegen/TestMarshalledMessageSerializer.java 
b/modules/core/src/test/resources/codegen/TestMarshalledMessageSerializer.java
index 6315a468831..fa81057b604 100644
--- 
a/modules/core/src/test/resources/codegen/TestMarshalledMessageSerializer.java
+++ 
b/modules/core/src/test/resources/codegen/TestMarshalledMessageSerializer.java
@@ -27,9 +27,9 @@ import 
org.apache.ignite.plugin.extensions.communication.MessageWriter;
  *
  * @see org.apache.ignite.internal.MessageProcessor
  */
-public class TestMarshalledMessageSerializer implements 
MessageSerializer<TestMarshalledMessage> {
+public final class TestMarshalledMessageSerializer implements 
MessageSerializer<TestMarshalledMessage> {
     /** */
-    @Override public boolean writeTo(TestMarshalledMessage msg, MessageWriter 
writer) {
+    @Override public final boolean writeTo(TestMarshalledMessage msg, 
MessageWriter writer) {
         if (!writer.isHeaderWritten()) {
             if (!writer.writeHeader(msg.directType()))
                 return false;
@@ -49,7 +49,7 @@ public class TestMarshalledMessageSerializer implements 
MessageSerializer<TestMa
     }
 
     /** */
-    @Override public boolean readFrom(TestMarshalledMessage msg, MessageReader 
reader) {
+    @Override public final boolean readFrom(TestMarshalledMessage msg, 
MessageReader reader) {
         switch (reader.state()) {
             case 0:
                 msg.dataBytes = reader.readByteArray();
@@ -62,4 +62,9 @@ public class TestMarshalledMessageSerializer implements 
MessageSerializer<TestMa
 
         return true;
     }
+
+    /** {@inheritDoc} */
+    @Override public final TestMarshalledMessage createMessage() {
+        return new TestMarshalledMessage();
+    }
 }
\ No newline at end of file
diff --git 
a/modules/core/src/test/resources/codegen/TestMarshalledObjectsMessageMarshaller.java
 
b/modules/core/src/test/resources/codegen/TestMarshalledObjectsMessageMarshaller.java
index 4f1aa050e0a..5ebabc94f61 100644
--- 
a/modules/core/src/test/resources/codegen/TestMarshalledObjectsMessageMarshaller.java
+++ 
b/modules/core/src/test/resources/codegen/TestMarshalledObjectsMessageMarshaller.java
@@ -33,7 +33,7 @@ import 
org.apache.ignite.plugin.extensions.communication.MessageMarshaller;
  *
  * @see org.apache.ignite.internal.MessageProcessor
  */
-public class TestMarshalledObjectsMessageMarshaller implements 
MessageMarshaller<TestMarshalledObjectsMessage> {
+public final class TestMarshalledObjectsMessageMarshaller implements 
MessageMarshaller<TestMarshalledObjectsMessage> {
     /** */
     private final Marshaller marshaller;
 
diff --git 
a/modules/core/src/test/resources/codegen/TestMarshalledObjectsMessageSerializer.java
 
b/modules/core/src/test/resources/codegen/TestMarshalledObjectsMessageSerializer.java
index e5464b85916..a07b7011929 100644
--- 
a/modules/core/src/test/resources/codegen/TestMarshalledObjectsMessageSerializer.java
+++ 
b/modules/core/src/test/resources/codegen/TestMarshalledObjectsMessageSerializer.java
@@ -30,12 +30,12 @@ import 
org.apache.ignite.plugin.extensions.communication.MessageWriter;
  *
  * @see org.apache.ignite.internal.MessageProcessor
  */
-public class TestMarshalledObjectsMessageSerializer implements 
MessageSerializer<TestMarshalledObjectsMessage> {
+public final class TestMarshalledObjectsMessageSerializer implements 
MessageSerializer<TestMarshalledObjectsMessage> {
     /** */
     private static final MessageCollectionType dataBytesCollDesc = new 
MessageCollectionType(new MessageItemType(MessageCollectionItemType.BYTE_ARR), 
false);
 
     /** */
-    @Override public boolean writeTo(TestMarshalledObjectsMessage msg, 
MessageWriter writer) {
+    @Override public final boolean writeTo(TestMarshalledObjectsMessage msg, 
MessageWriter writer) {
         if (!writer.isHeaderWritten()) {
             if (!writer.writeHeader(msg.directType()))
                 return false;
@@ -55,7 +55,7 @@ public class TestMarshalledObjectsMessageSerializer 
implements MessageSerializer
     }
 
     /** */
-    @Override public boolean readFrom(TestMarshalledObjectsMessage msg, 
MessageReader reader) {
+    @Override public final boolean readFrom(TestMarshalledObjectsMessage msg, 
MessageReader reader) {
         switch (reader.state()) {
             case 0:
                 msg.dataBytes = reader.readCollection(dataBytesCollDesc);
@@ -68,4 +68,9 @@ public class TestMarshalledObjectsMessageSerializer 
implements MessageSerializer
 
         return true;
     }
+
+    /** {@inheritDoc} */
+    @Override public final TestMarshalledObjectsMessage createMessage() {
+        return new TestMarshalledObjectsMessage();
+    }
 }
\ No newline at end of file
diff --git a/modules/core/src/test/resources/codegen/TestMessageMarshaller.java 
b/modules/core/src/test/resources/codegen/TestMessageMarshaller.java
index 83f2af3624e..7402ff749fc 100644
--- a/modules/core/src/test/resources/codegen/TestMessageMarshaller.java
+++ b/modules/core/src/test/resources/codegen/TestMessageMarshaller.java
@@ -29,7 +29,7 @@ import 
org.apache.ignite.plugin.extensions.communication.MessageMarshaller;
  *
  * @see org.apache.ignite.internal.MessageProcessor
  */
-public class TestMessageMarshaller implements MessageMarshaller<TestMessage> {
+public final class TestMessageMarshaller implements 
MessageMarshaller<TestMessage> {
     /** */
     @Override public void marshal(TestMessage msg, GridKernalContext kctx, 
CacheObjectContext cacheObjCtx) throws IgniteCheckedException {
         CacheObjectContext ctx = cacheObjCtx;
diff --git a/modules/core/src/test/resources/codegen/TestMessageSerializer.java 
b/modules/core/src/test/resources/codegen/TestMessageSerializer.java
index 4d42635468b..7aa0a054471 100644
--- a/modules/core/src/test/resources/codegen/TestMessageSerializer.java
+++ b/modules/core/src/test/resources/codegen/TestMessageSerializer.java
@@ -31,7 +31,7 @@ import 
org.apache.ignite.plugin.extensions.communication.MessageWriter;
  *
  * @see org.apache.ignite.internal.MessageProcessor
  */
-public class TestMessageSerializer implements MessageSerializer<TestMessage> {
+public final class TestMessageSerializer implements 
MessageSerializer<TestMessage> {
     /** */
     private static final MessageArrayType intMatrixCollDesc = new 
MessageArrayType(new MessageItemType(MessageCollectionItemType.INT_ARR), 
int[].class);
     /** */
@@ -40,7 +40,7 @@ public class TestMessageSerializer implements 
MessageSerializer<TestMessage> {
     private static final MessageArrayType verArrCollDesc = new 
MessageArrayType(new 
MessageItemType(MessageCollectionItemType.GRID_CACHE_VERSION), 
GridCacheVersion.class);
 
     /** */
-    @Override public boolean writeTo(TestMessage msg, MessageWriter writer) {
+    @Override public final boolean writeTo(TestMessage msg, MessageWriter 
writer) {
         if (!writer.isHeaderWritten()) {
             if (!writer.writeHeader(msg.directType()))
                 return false;
@@ -150,7 +150,7 @@ public class TestMessageSerializer implements 
MessageSerializer<TestMessage> {
     }
 
     /** */
-    @Override public boolean readFrom(TestMessage msg, MessageReader reader) {
+    @Override public final boolean readFrom(TestMessage msg, MessageReader 
reader) {
         switch (reader.state()) {
             case 0:
                 msg.id = reader.readInt();
@@ -283,4 +283,9 @@ public class TestMessageSerializer implements 
MessageSerializer<TestMessage> {
 
         return true;
     }
+
+    /** {@inheritDoc} */
+    @Override public final TestMessage createMessage() {
+        return new TestMessage();
+    }
 }
\ No newline at end of file
diff --git 
a/modules/core/src/test/resources/codegen/TestNestedDeployMessageDeployer.java 
b/modules/core/src/test/resources/codegen/TestNestedDeployMessageDeployer.java
index 3f75e24b49d..43a79476562 100644
--- 
a/modules/core/src/test/resources/codegen/TestNestedDeployMessageDeployer.java
+++ 
b/modules/core/src/test/resources/codegen/TestNestedDeployMessageDeployer.java
@@ -27,7 +27,7 @@ import 
org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
  *
  * @see org.apache.ignite.internal.MessageProcessor
  */
-public class TestNestedDeployMessageDeployer implements 
GridCacheMessageDeployer<TestNestedDeployMessage> {
+public final class TestNestedDeployMessageDeployer implements 
GridCacheMessageDeployer<TestNestedDeployMessage> {
     /** */
     @Override public void deploy(TestNestedDeployMessage msg, 
GridCacheSharedContext<?, ?> ctx) throws IgniteCheckedException {
         GridCacheMessageDeployer.deploy(ctx.kernalContext().messageFactory(), 
msg.nested, ctx);
diff --git 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Null.java
 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Null.java
index 5fcdf6988fc..4eba0cad3e7 100644
--- 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Null.java
+++ 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2Null.java
@@ -26,7 +26,7 @@ import org.h2.value.ValueNull;
  */
 public class GridH2Null extends GridH2ValueMessage {
     /** */
-    public static GridH2Null INSTANCE = new GridH2Null();
+    public static final GridH2Null INSTANCE = new GridH2Null();
 
     /**
      * Disallow new instance creation.
diff --git 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2ValueMessageFactory.java
 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2ValueMessageFactory.java
index 54063c9a5c8..15aa19e0f80 100644
--- 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2ValueMessageFactory.java
+++ 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2ValueMessageFactory.java
@@ -24,7 +24,6 @@ import java.util.List;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.managers.communication.IgniteMessageFactory;
-import org.apache.ignite.internal.processors.query.h2.QueryTable;
 import org.apache.ignite.internal.processors.query.h2.QueryTableSerializer;
 import 
org.apache.ignite.internal.processors.query.h2.opt.GridH2ValueCacheObject;
 import org.apache.ignite.plugin.extensions.communication.Message;
@@ -37,34 +36,34 @@ import org.h2.value.Value;
 public class GridH2ValueMessageFactory implements MessageFactoryProvider {
     /** {@inheritDoc} */
     @Override public void registerAll(IgniteMessageFactory factory) {
-        factory.register(-4, () -> GridH2Null.INSTANCE, new 
GridH2NullSerializer());
-        factory.register(-5, GridH2Boolean::new, new 
GridH2BooleanSerializer());
-        factory.register(-6, GridH2Byte::new, new GridH2ByteSerializer());
-        factory.register(-7, GridH2Short::new, new GridH2ShortSerializer());
-        factory.register(-8, GridH2Integer::new, new 
GridH2IntegerSerializer());
-        factory.register(-9, GridH2Long::new, new GridH2LongSerializer());
-        factory.register(-10, GridH2Decimal::new, new 
GridH2DecimalSerializer());
-        factory.register(-11, GridH2Double::new, new GridH2DoubleSerializer());
-        factory.register(-12, GridH2Float::new, new GridH2FloatSerializer());
-        factory.register(-13, GridH2Time::new, new GridH2TimeSerializer());
-        factory.register(-14, GridH2Date::new, new GridH2DateSerializer());
-        factory.register(-15, GridH2Timestamp::new, new 
GridH2TimestampSerializer());
-        factory.register(-16, GridH2Bytes::new, new GridH2BytesSerializer());
-        factory.register(-17, GridH2String::new, new GridH2StringSerializer());
-        factory.register(-18, GridH2Array::new, new GridH2ArraySerializer());
-        factory.register(-19, GridH2JavaObject::new, new 
GridH2JavaObjectSerializer());
-        factory.register(-20, GridH2Uuid::new, new GridH2UuidSerializer());
-        factory.register(-21, GridH2Geometry::new, new 
GridH2GeometrySerializer());
-        factory.register(-22, GridH2CacheObject::new, new 
GridH2CacheObjectSerializer());
-        factory.register(-30, GridH2IndexRangeRequest::new, new 
GridH2IndexRangeRequestSerializer());
-        factory.register(-31, GridH2IndexRangeResponse::new, new 
GridH2IndexRangeResponseSerializer());
-        factory.register(-32, GridH2RowMessage::new, new 
GridH2RowMessageSerializer());
-        factory.register(-33, GridH2QueryRequest::new, new 
GridH2QueryRequestSerializer());
-        factory.register(-34, GridH2RowRange::new, new 
GridH2RowRangeSerializer());
-        factory.register(-35, GridH2RowRangeBounds::new, new 
GridH2RowRangeBoundsSerializer());
-        factory.register(-54, QueryTable::new, new QueryTableSerializer());
-        factory.register(-55, GridH2DmlRequest::new, new 
GridH2DmlRequestSerializer());
-        factory.register(-56, GridH2DmlResponse::new, new 
GridH2DmlResponseSerializer());
+        factory.register(-4, new GridH2NullSerializer());
+        factory.register(-5, new GridH2BooleanSerializer());
+        factory.register(-6, new GridH2ByteSerializer());
+        factory.register(-7, new GridH2ShortSerializer());
+        factory.register(-8, new GridH2IntegerSerializer());
+        factory.register(-9, new GridH2LongSerializer());
+        factory.register(-10, new GridH2DecimalSerializer());
+        factory.register(-11, new GridH2DoubleSerializer());
+        factory.register(-12, new GridH2FloatSerializer());
+        factory.register(-13, new GridH2TimeSerializer());
+        factory.register(-14, new GridH2DateSerializer());
+        factory.register(-15, new GridH2TimestampSerializer());
+        factory.register(-16, new GridH2BytesSerializer());
+        factory.register(-17, new GridH2StringSerializer());
+        factory.register(-18, new GridH2ArraySerializer());
+        factory.register(-19, new GridH2JavaObjectSerializer());
+        factory.register(-20, new GridH2UuidSerializer());
+        factory.register(-21, new GridH2GeometrySerializer());
+        factory.register(-22, new GridH2CacheObjectSerializer());
+        factory.register(-30, new GridH2IndexRangeRequestSerializer());
+        factory.register(-31, new GridH2IndexRangeResponseSerializer());
+        factory.register(-32, new GridH2RowMessageSerializer());
+        factory.register(-33, new GridH2QueryRequestSerializer());
+        factory.register(-34, new GridH2RowRangeSerializer());
+        factory.register(-35, new GridH2RowRangeBoundsSerializer());
+        factory.register(-54, new QueryTableSerializer());
+        factory.register(-55, new GridH2DmlRequestSerializer());
+        factory.register(-56, new GridH2DmlResponseSerializer());
     }
 
     /**
diff --git 
a/modules/nio/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageFactory.java
 
b/modules/nio/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageFactory.java
index cea29ed62f0..c0e2061e57d 100644
--- 
a/modules/nio/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageFactory.java
+++ 
b/modules/nio/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageFactory.java
@@ -21,7 +21,7 @@ import java.util.function.Supplier;
 import org.apache.ignite.IgniteException;
 
 /**
- * Message factory for all communication messages registered using {@link 
#register(short, Supplier, MessageSerializer)} method call.
+ * Message factory for all communication messages registered using {@link 
#register(short, MessageSerializer)} method call.
  */
 public interface MessageFactory<T extends Message> {
     /**
@@ -34,7 +34,7 @@ public interface MessageFactory<T extends Message> {
      * @throws IgniteException In case of attempt to register message with 
direct type which is already registered.
      * @throws IllegalStateException On any invocation of this method when 
class which implements this interface
      * is alredy constructed.
-     * @deprecated Use {@link #register(short, Supplier, MessageSerializer)} 
instead.
+     * @deprecated Use {@link #register(short, MessageSerializer)} instead.
      */
     @Deprecated(forRemoval = true)
     default void register(short directType, Supplier<T> supplier) throws 
IgniteException {
@@ -51,7 +51,7 @@ public interface MessageFactory<T extends Message> {
      * @throws IgniteException In case of attempt to register message with 
direct type which is already registered.
      * @throws IllegalStateException On any invocation of this method when 
class which implements this interface
      * is alredy constructed.
-     * @deprecated Use {@link #register(int, Supplier, MessageSerializer)} 
instead.
+     * @deprecated Use {@link #register(int, MessageSerializer)} instead.
      */
     @Deprecated(forRemoval = true)
     default void register(int directType, Supplier<T> supplier) throws 
IgniteException {
@@ -64,13 +64,12 @@ public interface MessageFactory<T extends Message> {
      * throw {@link IllegalStateException} exception.
      *
      * @param directType Direct type.
-     * @param supplier Message factory.
      * @param serializer Message serializer.
      * @throws IgniteException In case of attempt to register message with 
direct type which is already registered.
      * @throws IllegalStateException On any invocation of this method when 
class which implements this interface
      * is alredy constructed.
      */
-    public void register(short directType, Supplier<T> supplier, 
MessageSerializer<T> serializer) throws IgniteException;
+    public void register(short directType, MessageSerializer<T> serializer) 
throws IgniteException;
 
     /**
      * Register message factory with given direct type and serializer. The 
direct type is also registered
@@ -82,14 +81,13 @@ public interface MessageFactory<T extends Message> {
      * throw {@link IllegalStateException} exception.
      *
      * @param directType Direct type.
-     * @param supplier Message factory.
      * @param serializer Message serializer.
      * @throws IgniteException In case of attempt to register message with 
direct type which is already registered.
      * @throws IllegalStateException On any invocation of this method when 
class which implements this interface
      * is already constructed.
      */
-    default void register(int directType, Supplier<T> supplier, 
MessageSerializer<T> serializer) throws IgniteException {
-        register((short)directType, supplier, serializer);
+    default void register(int directType, MessageSerializer<T> serializer) 
throws IgniteException {
+        register((short)directType, serializer);
     }
 
     /**
diff --git 
a/modules/nio/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageSerializer.java
 
b/modules/nio/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageSerializer.java
index 98de5c04de5..86ce0d170a0 100644
--- 
a/modules/nio/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageSerializer.java
+++ 
b/modules/nio/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageSerializer.java
@@ -39,4 +39,9 @@ public interface MessageSerializer<M extends Message> {
      * @return Whether message was fully read.
      */
     public boolean readFrom(M msg, MessageReader reader);
+
+    /**
+     * @return New instance of message.
+     */
+    public M createMessage();
 }
diff --git 
a/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZkMessageFactory.java
 
b/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZkMessageFactory.java
index a121b807863..c7b32818666 100644
--- 
a/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZkMessageFactory.java
+++ 
b/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZkMessageFactory.java
@@ -24,11 +24,11 @@ import 
org.apache.ignite.internal.plugin.AbstractMarshallableMessageFactoryProvi
 public class ZkMessageFactory extends 
AbstractMarshallableMessageFactoryProvider {
     /** {@inheritDoc} */
     @Override public void registerAll(IgniteMessageFactory factory) {
-        register(factory, ZkCommunicationErrorResolveFinishMessage.class, 
(short)400, ZkCommunicationErrorResolveFinishMessage::new);
-        register(factory, ZkCommunicationErrorResolveStartMessage.class, 
(short)401, ZkCommunicationErrorResolveStartMessage::new);
-        register(factory, ZkForceNodeFailMessage.class, (short)402, 
ZkForceNodeFailMessage::new);
-        register(factory, ZkNoServersMessage.class, (short)403, 
ZkNoServersMessage::new);
-        register(factory, ZkDiscoDataBagWrapper.class, (short)404, 
ZkDiscoDataBagWrapper::new);
-        register(factory, ZkOperationContextAwareCustomMessage.class, 
(short)405, ZkOperationContextAwareCustomMessage::new);
+        register(factory, ZkCommunicationErrorResolveFinishMessage.class, 
(short)400);
+        register(factory, ZkCommunicationErrorResolveStartMessage.class, 
(short)401);
+        register(factory, ZkForceNodeFailMessage.class, (short)402);
+        register(factory, ZkNoServersMessage.class, (short)403);
+        register(factory, ZkDiscoDataBagWrapper.class, (short)404);
+        register(factory, ZkOperationContextAwareCustomMessage.class, 
(short)405);
     }
 }

Reply via email to