29 Eylül 2023 Cuma

HazelcastAPI NodeShutdownHookThread

Giriş
Şu satırı dahil ederiz
import com.hazelcast.instance.imp.NodeShutdownHookThread;
Örnek
Şöyle yaparız. Böylece kill -15 ile SIGTERM gönderilirse graceful shutdown yapılır
<property name="hazelcast.shutdownhook.enabled">true</property>
<property name="hazelcast.shutdownhook.policy">GRACEFUL</property>
Açıklaması şöyle
... when the process is terminated by SIGTERM the JVM invokes registered shutdown hooks with no defined sequence (or maybe even in parallel).
So our own shutdown hook that handles graceful shutdown may run in parallel or after a shutdown hook registered by the logging implementation that closes loggers 
switch (policy) {
  case TERMINATE:
    hazelcastInstance.getLifecycleService().terminate();
    break;
  case GRACEFUL:
    hazelcastInstance.getLifecycleService().shutdown();
    break;
  default:
    throw new IllegalArgumentException("Unimplemented shutdown hook policy: " + policy);
}

27 Eylül 2023 Çarşamba

HazelcastAPI NearCacheStats Sınıfı

Giriş
Şu satırı dahil ederiz
import com.hazelcast.nearcache.NearCacheStats;
getNearCacheStats metodu
Şöyle yaparız
NearCache nearCache = ...;
NearCacheStats nearCacheStats = nearCache.getNearCacheStats();

hazelcast-code-samples Projesi

Giriş
GitHub linki burada

https://github.com/hazelcast/hazelcast-code-samples/tree/master/jet/jms değişti çünkü Jakarta güncellemesi yapıldı

HazelcastAPI IcmpFailureDetectorConfig Sınıfı

Giriş
Şu satırı dahil ederiz
import com.hazelcast.config.IcmpFailureDetectorConfig;
isEchoFailFastOnStartup
Eğer işletim sistemi ICMP yani Ping yapmaya izin vermiyorsa ClusterHeartbeatManager hata döner

isEnabled metodu
Varsayılan değer FALSE. Kod şöyle

26 Eylül 2023 Salı

HazelcastAPI ConnectorPermission Sınıfı

Giriş
Şu satırı dahil ederiz 
import com.hazelcast.security.permission.ConnectorPermission;
Kalıtım şöyle
Permission
  ClusterPermission
    InstancePermission
      ConnectorPermission

implies metodu
Kod şöyle. Mask değerleri aynıysa, daha sonra isim karşılaştırması yapıyor
@Override
public boolean implies(Permission permission) {
  if (this.getClass() != permission.getClass()) {
    return false;
  }

  InstancePermission that = (InstancePermission) permission;

  boolean maskTest = ((this.mask & that.mask) == that.mask);
  if (!maskTest) {
    return false;
  }

  return CONFIG_PATTERN_MATCHER.matches(getName(), that.getName());
}


20 Eylül 2023 Çarşamba

HazelcastAPI SqlConsole Sınıfı

Giriş
Şu satırı dahil ederiz
import com.hazelcast.client.console.SqlConsole;
jline kütüphanesini kullanarak kabuk sağlar. hazelcast/pom.xml şöyle
<dependency>
  <groupId>org.jline</groupId>
  <artifactId>jline-terminal</artifactId>
  <version>${jline.version}</version>
  <scope>provided</scope>
  <optional>true</optional>
</dependency>
<dependency>
  <groupId>org.jline</groupId>
  <artifactId>jline-reader</artifactId>
  <version>${jline.version}</version>
  <scope>provided</scope>
  <optional>true</optional>
</dependency>
Hazelcast projesinde scope alanı provided olarak kullanılıyor. Gerçek kütüphane hazelcast-distribution projesinden geliyor. Neden böyle bilmiyorum. hazelcast-distribution/pom.xml şöyle
<!-- HazelcastCommandLine dependencies-->
<dependency>
  <groupId>info.picocli</groupId>
  <artifactId>picocli</artifactId>
</dependency>
<dependency>
  <groupId>org.jline</groupId>
  <artifactId>jline-terminal</artifactId>
  <version>${jline.version}</version>
</dependency>
<dependency>
  <groupId>org.jline</groupId>
  <artifactId>jline-reader</artifactId>
  <version>${jline.version}</version>
</dependency>




HazelcastAPI ExecutionService Arayüzü

Giriş
Şu satırı dahil ederiz
import com.hazelcast.spi.impl.ExecutionService;
Kalıtım şöyle
ExecutionService
  ExecutionServiceImpl

ExecutionServiceImpl Sınıfı
createExecutor metodu
İmzası şöyle
private ManagedExecutorService createExecutor(String name, int poolSize, int queueCapacity,
                                          ExecutorType type, ThreadFactory threadFactory)
Kod şöyle.  CachedExecutorServiceDelegate veya NamedThreadPoolExecutor yaratır
private ManagedExecutorService createExecutor(String name, int poolSize, int queueCapacity,
                                           ExecutorType type, ThreadFactory threadFactory) {
  ManagedExecutorService executor;
  if (type == ExecutorType.CACHED) {
    if (threadFactory != null) {
      throw new IllegalArgumentException("...");
    }
    executor = new CachedExecutorServiceDelegate(name, cachedExecutorService, poolSize, 
      queueCapacity);
  } else if (type == ExecutorType.CONCRETE) {
    ...
  } else {
    throw new IllegalArgumentException("Unknown executor type: " + type);
  }
  return executor;
}
CachedExecutorServiceDelegate 
Bu sınıf Runnable işleri cachedExecutorService nesnesine verir. Yani aslında bir sürü sınıf altta paylaşılan bir ExecutorService kullanıyor

13 Eylül 2023 Çarşamba

HazelcastAPI EntryView Arayüzü - Belirli Bir Key İçin İstatistik Verir - Map Metrics

Giriş
Şu satırı dahil ederiz
import com.hazelcast.core.EntryView;
Açıklaması şöyle. Yani etkinleştirmek gerekir. Eğer etkin değilse -1 döner.
To get statistics for a specific map entry, you can use the getEntryView(key) method of one of the following available client libraries. To use this method, the map must have its per-entry-stats-enabled element set to true.
getEntryView() metodu hem member hem de istemci tarafında kullanılabilir

Örnek
Şöyle yaparız
HazelcastInstance hz = HazelcastClient.newHazelcastClient();

EntryView entry = hz.getMap("map").getEntryView( "key" );

System.out.println ("size in memory  : " + entry.getCost());
System.out.println ("creationTime    : " + entry.getCreationTime());
System.out.println ("expirationTime  : " + entry.getExpirationTime());
System.out.println ("number of hits  : " + entry.getHits());
System.out.println ("lastAccessedTime: " + entry.getLastAccessTime());
System.out.println ("lastUpdateTime  : " + entry.getLastUpdateTime());
System.out.println ("version         : " + entry.getVersion());
System.out.println ("key             : " + entry.getKey());
System.out.println ("value           : " + entry.getValue());


11 Eylül 2023 Pazartesi

Hazelcast Jet Sources.jdbc metodu

Giriş
Bu metodun 4 tane overload edilmiş hali var

1. jdbc metodu - SupplierEx + ToResultSetFunction + FunctionEx
İmzası şöyle
public static <T> BatchSource<T> jdbc(
  SupplierEx<? extends Connection> newConnectionFn,
  ToResultSetFunction resultSetFn,
  FunctionEx<? super ResultSet, ? extends T> createOutputFn
) 

public static <T> BatchSource<T> jdbc(
  DataConnectionRef dataConnectionRef,
  ToResultSetFunction resultSetFn,
  FunctionEx<? super ResultSet, ? extends T> createOutputFn
)

public static <T> BatchSource<T> jdbc(
   String connectionURL,
   String query,
   FunctionEx<? super ResultSet, ? extends T> createOutputFn
)

public static <T> BatchSource<T> jdbc(
  String connectionURL,
  String query,
  Properties properties,
  FunctionEx<? super ResultSet, ? extends T> createOutputFn
)
Speeding up reading from JDBC through Spark yazısında JDBC okumasını paralel hale nasıl getirileceği anlatılıyor. Ben bu yazıyı yazarken Hazelcast böyle bir özellik sağlamıyordu

Birinci parametre JDBC Connection nesnesini döndürür
İkinci parametre JDBC ResultSet nesnesini döndürür
Üçüncü parametre JDBC ResultSet nesnesinden Java nesnesi döndürür
Örnek
Şöyle yaparız
Pipeline p = Pipeline.create();
p.readFrom(Sources.jdbc(
    () -> DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql"),
    (con, parallelism, index) -> {
        PreparedStatement stmt = con.prepareStatement(
              "SELECT * FROM person WHERE MOD(id, ?) = ?)");
        stmt.setInt(1, parallelism);
        stmt.setInt(2, index);
        return stmt.executeQuery();
    },
    resultSet -> new Person(resultSet.getInt(1), resultSet.getString(2))
)).writeTo(Sinks.logger());

7 Eylül 2023 Perşembe

HazelcastSpring Kullanımı

hazelcast-spring Projesine Dair Notlar

XML Parsing
Bu projede spring bean'lerinin tanımlandığı XML dosyasını parse edebilmek için bir sürü kod var.

XML dosyasında geçen tag'leri hangi sınıfın bileşenlerine ayıraca HazelcastNamespaceHandler dosyasında tanımlı.

Cache
Bu pakette şu sınıflar var
HazelcastCache
HazelcastCacheManager


6 Eylül 2023 Çarşamba

Hazelcast archunit-rules

Giriş
Bu projede custom  ArchRule kuralları tanımlı. Kurallar için ArchCondition sınıfları tanımlı. Kuralları  testler eden kodlar da yazılmış. Kurallar ArchUnitRules içinde tanımlı

THIRD-PARTY.txt Dosyası

Kullanılan harici kütüphanelerin sürümleri bu dosyada Dosyanın yolu şöyle hazelcast/licenses/THIRD-PARTY.txt