Observability of the Java Virtual Machine

Image
The JVM is one of the most observable runtimes. It provides us lots of tools for troubleshooting a JVM application in production. 1. Thread observability Threads are how the JVM actually does work. When something is wrong in production, the symptom is almost always a thread: stopped, blocked, leaking etc. Thread dumps work on any JVM with no  instrumentation, no agents, no restarts. <Example project link with /threaddump endpoint>         // (1) Deadlock — two threads grab the same pair of locks in opposite order.         new Thread(() -> grab(LOCK_A, LOCK_B), "deadlock-A-then-B").start();         new Thread(() -> grab(LOCK_B, LOCK_A), "deadlock-B-then-A").start(); http://localhost:8080/actuator/threaddump To list the JVMS, we can use the command below. PS C:\observe-jvm> jps -lv 25296 jdk.jcmd/sun.tools.jps.Jps -Dapplication.home=C:\Program Files\Microsoft\jdk-21.0.3.9-hotspot -Xms8m -Djdk.module.main=...

Axon Framework ve tanımı değişen Event sınıfları

Axon Framework kullanarak geliştirdiğim CQRS uygulamasında karşılaştığım bir sorundan ve çözüm yollarından bahsedeceğim.
Uygulamada "event sourcing" yöntemini kullanıyorum ve Event nesneleri SQL veritabanına serialize edildikten sonra kaydediliyor. Serialize edilen veri içerisinde Event sınıfının tam ismi (paket ismi ile birlikte) geçtiği için, bu isimde yapılan bir değişiklik (örneğin paket yapısındaki bir refactoring) benim mevcut event verilerim ile uyumsuz hale geliyor.
Böyle durumlarda serialize edilmiş event verilerinin migrate edilmesi için 2 yöntemden bahsediliyor:

1) Genellikle bu durumda bir "Upcaster" yardımıyla eski tip eventler deserialize edilir. Yani uygulamamız deserialize sürecinde eski eventleri ele alabilmek için ayarlanmış olmalıdır. Axon framework'te EventUpcaster sınıfı incelenebilir.

2) Paket yapısında bir değişiklik olduğunda ve XStram kullanılıyorsa, eski paketten yeni pakete bir "alias" tanımlanabilir.

// makes sure old package is read in as new.package
serializer.addPackageAlias("old.package.name", "new.package.name");



Bahadır Konu
bah.konu(at)gmail(dot)com

Comments

Popular posts from this blog

The WeakReference class, monitoring memory leak and garbage collection in a Java application

Simplescalar Simulator - Part 2: sim-outorder.c

Notes on Java Performance