Hi Sebastian, Thanks for example and detailed steps to reproduce.
Unfortunately, this is a flaw in current binary metadata exchange algorithm. I have created a ticket for it - https://issues.apache.org/jira/browse/IGNITE-5794. To avoid this issue for now, you should either: - ensure that there is always at least 1 server node alive, - restart all client nodes after last server node left cluster. On Thu, Jul 20, 2017 at 9:18 AM, Sebastian Sindelar < [email protected]> wrote: > Hi. > > > > Just figured out while the example setup doesn’t produce the error. The > following TestClient will always cause the exception at the server. > > > > *public* *class* TestClient { > > > > *public* *static* *void* main(String[] args) { > > IgniteConfiguration igniteConfiguration = *new* > IgniteConfiguration(); > > igniteConfiguration.setClientMode(*true*); > > igniteConfiguration.setMetricsLogFrequency(0); > > Ignite ignite = *Ignition.start(**igniteConfiguration**)*; > > > > Scanner *scanner* = *new* Scanner(System.*in*); > > *while** (**true**) {* > > * String **message** = **scanner**.nextLine();* > > * IgniteMessaging **messaging** = **ignite**.message(* > *ignite**.cluster());* > > *messaging**.send(**"test"**, **new** ComplexMessage(* > *message**));* > > * }* > > > > > > } > > } > > > > Ignite.message(…) is now called before each message is send. In the main > application it is called only once. > > I also noticed I didn’t describe the steps to reproduce the problem very > detailed yesterday evening. > > > > 1. Start 1 Client and 1 Server > 2. Type in some message in the client console and hit Enter > 3. Check that message is received and logged by the server > 4. Stop the Server > 5. Start the Server and wait for the client to reconnect > 6. Type in another message in the client console and hit Enter > 7. See the Exception at the server log > > > > Also one additional note. This only happens if all cluster servers are > offline and the cluster gets restartet. If you have multiple servers there > is no problem. At least one server must survive to keep the record on how > to unmarshall the sent class. > > > > Best regards, > Sebastian Sindelar > > *Von:* Sebastian Sindelar [mailto:[email protected]] > *Gesendet:* Mittwoch, 19. Juli 2017 16:53 > *An:* [email protected] > *Betreff:* Problem with Messages after client reconnect > > > > Hi. > > > > I just started with Ignite messaging and I encountered the following > problem: > > > > I have a simple Setup with 1 server and 1 client. Sending messages from > the client to the server works fine. But after a server restart I encounter > the problem that when I send a message with a custom class I get an > unmarshalling error: > > > > > > *org.apache.ignite.IgniteCheckedException*: null > > at org.apache.ignite.internal.util.IgniteUtils.unmarshal( > *IgniteUtils.java:9893*) ~[ignite-core-2.0.0.jar:2.0.0] > > at org.apache.ignite.internal.managers.communication.GridIoManager$ > GridUserMessageListener.onMessage(*GridIoManager.java:2216*) > ~[ignite-core-2.0.0.jar:2.0.0] > > at org.apache.ignite.internal.managers.communication. > GridIoManager.invokeListener(*GridIoManager.java:1257*) > [ignite-core-2.0.0.jar:2.0.0] > > at org.apache.ignite.internal.managers.communication. > GridIoManager.access$2000(*GridIoManager.java:114*) > [ignite-core-2.0.0.jar:2.0.0] > > at org.apache.ignite.internal.managers.communication.GridIoManager$ > GridCommunicationMessageSet.unwind(*GridIoManager.java:2461*) > [ignite-core-2.0.0.jar:2.0.0] > > at org.apache.ignite.internal.managers.communication.GridIoManager. > unwindMessageSet(*GridIoManager.java:1217*) [ignite-core-2.0.0.jar:2.0.0] > > at org.apache.ignite.internal.managers.communication. > GridIoManager.access$2300(*GridIoManager.java:114*) > [ignite-core-2.0.0.jar:2.0.0] > > at org.apache.ignite.internal.managers.communication. > GridIoManager$8.run(*GridIoManager.java:1186*) > [ignite-core-2.0.0.jar:2.0.0] > > at java.util.concurrent.ThreadPoolExecutor.runWorker( > *ThreadPoolExecutor.java:1142*) [na:1.8.0_112] > > at java.util.concurrent.ThreadPoolExecutor$Worker.run( > *ThreadPoolExecutor.java:617*) [na:1.8.0_112] > > at java.lang.Thread.run(*Thread.java:745*) [na:1.8.0_112] > > Caused by: *java.lang.NullPointerException*: null > > at org.apache.ignite.internal.processors.cache.binary. > CacheObjectBinaryProcessorImpl.metadata( > *CacheObjectBinaryProcessorImpl.java:492*) ~[ignite-core-2.0.0.jar:2.0.0] > > at org.apache.ignite.internal.processors.cache.binary. > CacheObjectBinaryProcessorImpl$2.metadata( > *CacheObjectBinaryProcessorImpl.java:174*) ~[ignite-core-2.0.0.jar:2.0.0] > > at org.apache.ignite.internal.binary.BinaryContext.metadata( > *BinaryContext.java:1231*) ~[ignite-core-2.0.0.jar:2.0.0] > > at org.apache.ignite.internal.binary.BinaryReaderExImpl. > getOrCreateSchema(*BinaryReaderExImpl.java:1987*) > ~[ignite-core-2.0.0.jar:2.0.0] > > at org.apache.ignite.internal.binary.BinaryReaderExImpl.<init>( > *BinaryReaderExImpl.java:283*) ~[ignite-core-2.0.0.jar:2.0.0] > > at org.apache.ignite.internal.binary.BinaryReaderExImpl.<init>( > *BinaryReaderExImpl.java:182*) ~[ignite-core-2.0.0.jar:2.0.0] > > at org.apache.ignite.internal.binary.BinaryReaderExImpl.<init>( > *BinaryReaderExImpl.java:161*) ~[ignite-core-2.0.0.jar:2.0.0] > > at org.apache.ignite.internal.binary.GridBinaryMarshaller. > deserialize(*GridBinaryMarshaller.java:304*) > ~[ignite-core-2.0.0.jar:2.0.0] > > at org.apache.ignite.internal.binary.BinaryMarshaller.unmarshal0( > *BinaryMarshaller.java:99*) ~[ignite-core-2.0.0.jar:2.0.0] > > at org.apache.ignite.marshaller.AbstractNodeNameAwareMarshalle > r.unmarshal(*AbstractNodeNameAwareMarshaller.java:82*) > ~[ignite-core-2.0.0.jar:2.0.0] > > at org.apache.ignite.internal.util.IgniteUtils.unmarshal( > *IgniteUtils.java:9887*) ~[ignite-core-2.0.0.jar:2.0.0] > > ... 10 common frames omitted > > > > Sending String or Integer Messages works fine. > > > > I tried to boil it down into a simple server and client but can’t > reproduce the behaivor exactly: > > > > *public* *class* TestServer { > > *public* *static* *void* main(String[] args) { > > IgniteConfiguration igniteConfiguration = *new* > IgniteConfiguration(); > > igniteConfiguration.setMetricsLogFrequency(0); > > Ignite ignite = *Ignition.start(**igniteConfiguration**)*; > > > > IgniteMessaging messaging = ignite > > .message(ignite.cluster()); > > messaging.localListen("test", (nodeId, msg) -> { > > *System.**out*.println("Message received: '" + msg + "' > von '" + nodeId + "'"); > > *return* *true*; > > }); > > } > > } > > > > *public* *class* TestClient { > > > > *public* *static* *void* main(String[] args) { > > IgniteConfiguration igniteConfiguration = *new* > IgniteConfiguration(); > > igniteConfiguration.setClientMode(*true*); > > igniteConfiguration.setMetricsLogFrequency(0); > > Ignite ignite = *Ignition.start(**igniteConfiguration**)*; > > IgniteMessaging messaging = ignite.message(ignite.cluster()); > > > > Scanner *scanner* = *new* Scanner(System.*in*); > > *while** (**true**) {* > > * String **message** = **scanner**.nextLine();* > > *messaging**.send(**"test"**, **new** ComplexMessage(* > *message**));* > > * }* > > } > > } > > > > *public* *class* ComplexMessage { > > *private* *final* String message; > > *public* ComplexMessage(String message) { > > *super*(); > > *this*.message = message; > > } > > > > @Override > > *public* String toString() { > > *return* String.*format*("ComplexMessage [message=%s]", > message); > > } > > } > > > > > > I tried to play around with different clustergroups (e.g. .forRemotes()) > but most oft he time after the reconnect the server doesn’t receive any > messages at all, but I also had the unmarshalling NPE. I think understand > something fundamentally wrong about the ignite messaging or the client > reconnect. > > > > Sincerly, > > Sebastian > > > > > > > > Mit freundlichen Grüßen / Best regards, > Sebastian Sindelar > ________________________________________________________________ > IBH Datentechnik GmbH > Mendelssohn-Bartholdy-Str.17 > 34134 Kassel > > Tel.: +49 (0)561 942880 > Fax: +49 (0)561 9428877 > Support: +49 (0)561 9428899 > > > E-Mail: [email protected] > > Sitz der Gesellschaft / Domicile of the Company: Kassel > Registergericht / Register Court: Amtsgericht Kassel HRB 5096 > USt.-Nr: / VAT-ID: DE113075366 > Geschäftsführer / Managing Director: Bernd Hähner > > Diese E-Mail enthält vertrauliche und / oder rechtlich geschützte > Informationen. Wenn Sie nicht der richtige Adressat sind oder diese E-Mail > irrtümlich erhalten haben, informieren Sie bitte sofort den Absender und > vernichten Sie diese Mail. Wir verwenden aktuelle Virenschutzprogramme. Für > Schäden, die dem Empfänger gleichwohl durch von uns oder unter unserem > Namen zugesandte mit Viren befallene E-Mails entstehen, schließen wir jede > Haftung aus. > This e-mail may contain confidential and / or privileged information. If > you are not the intended recipient or have received this e-mail in error > please notify the sender immediately and destroy this e-mail. We use > updated antivirus protection software. We do not accept any responsibility > for damages caused anyhow by viruses transmitted via e-mail. > -- Best regards, Ilya
