代码之家  ›  专栏  ›  技术社区  ›  Artyom Sokolov

apache ignite.net和appdomain.currentdomain.processexit

  •  3
  • Artyom Sokolov  · 技术社区  · 6 年前

    考虑类,使用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标准中,我们可以 AppDomain.CurrentDomain.ProcessExit 我们可以做清理工作的活动。然而,一旦ApacheIgnite.net创建了JVM appdomain.currentdomain.processexit 当我用 kill <pid> .

    我在调试的时候做了一些研究,发现它会在以后的某个地方发生。 private static Jvm CreateJvm(IgniteConfiguration cfg, ILogger log) 已被调用。

    你知道那里发生了什么吗?如果有机会的话 appdomain.currentdomain.processexit ?

    小精灵 :两者都不是 AppDomain.CurrentDomain.DomainUnload 也不 System.Runtime.Loader.AssemblyLoadContext.Unloading 也会有用的。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Pavel Tupitsyn    6 年前

    ProcessExit is not guaranteed to be called .

    我认为ignite.net与此无关。我已经检查过这个(不引用或开始点火),如果强制终止进程,则不会调用处理程序。

        2
  •  1
  •   Artyom Sokolov    6 年前

    根据 Oracle's Java Documentation :

    嵌入JVM的应用程序经常需要捕获信号,例如sigint或sigterm,这可能会导致对JVM信号处理程序的干扰。-xrs选项可用于解决此问题。使用-xrs时,jvm不会更改sigint、sigterm、sighup和sigquit的信号屏蔽,并且不会安装这些信号的信号处理程序。

    因此,在稍微修改了初始类之后,我能够处理 AppDomain.CurrentDomain.ProcessExit Console.CancelKeyPress

    // ...
    JvmOptions = new List<string>()
    {
        "-Xrs", // <--------------------
        "-DIGNITE_NO_SHUTDOWN_HOOK=true",
    },
    // ...