Рассмотрим класс, использующий библиотеку Apache Ignite.NET
public interface ICluster
{
void Join();
void Leave();
}
public class ApacheIgniteClusterImpl : ICluster
{
private IIgnite Ignite { get; set; }
private int MulticastPort { get; }
private int ThinClientPort { get; }
public ApacheIgniteClusterImpl(int multicastPort = 47401, int thinClientPort = 10800)
{
MulticastPort = multicastPort;
ThinClientPort = thinClientPort;
}
public void Join()
{
if (Ignite != null)
{
return;
}
var configuration = new IgniteConfiguration
{
ClientConnectorConfiguration = new ClientConnectorConfiguration
{
Port = ThinClientPort,
},
DiscoverySpi = new TcpDiscoverySpi
{
IpFinder = new TcpDiscoveryMulticastIpFinder()
{
MulticastPort = MulticastPort,
}
},
JvmOptions = new List<string>()
{
"-DIGNITE_NO_SHUTDOWN_HOOK=true",
},
};
// Start
Ignite = Ignition.Start(configuration);
}
public void Leave()
{
Ignition.Stop(null, true);
Ignite = null;
}
}
Обычно в .NET Standard нам разрешено подключаться к событию AppDomain.CurrentDomain.ProcessExit
, где мы могли бы выполнять очистку. Однако после создания JVM в Apache Ignite. NET AppDomain.CurrentDomain.ProcessExit
никогда не будет запущен, когда я убиваю консольное приложение на MacOS с kill <pid>
.
Я провел некоторое исследование во время отладки и обнаружил, что это произойдет где-то после вызова private static Jvm CreateJvm(IgniteConfiguration cfg, ILogger log)
.
Есть идеи, что там происходит, и если есть шанс, мы можем подключиться к AppDomain.CurrentDomain.ProcessExit
?
UPD : ни AppDomain.CurrentDomain.DomainUnload
, ни System.Runtime.Loader.AssemblyLoadContext.Unloading
также не будут работать.