INetNode CreateNetNode(StatefulServiceContext initParams)
        {
            var logger = new LoggerConfiguration()
                .ConfigureMOUSETypesDestructure()
                .MinimumLevel.Verbose()
                .WriteTo.Seq("http://localhost:5341/")
                .CreateLogger();

            var coreEventsLogger = new SerilogCoreEvents(logger);
            var lidgrenEventsLogger = new SerilogLidgrenEvents(logger);


            var messageSerializer = new ProtobufMessageSerializer(typeof(Message).Assembly, typeof(Say).Assembly);

            var endPoint = initParams
                .CodePackageActivationContext
                .GetEndpoint("ServiceEndPoint");

            var nodeContext = FabricRuntime.GetNodeContext();

            string nodeName = $"{nodeContext.NodeName}:{nodeContext.NodeId}";

            var transport = new LidgrenNetProvider(
                new NetPeerConfiguration("Public")
                {
                    MaximumConnections = 10,
                    AcceptIncomingConnections = true,
                    Port = endPoint.Port,
                    LocalAddress = Dns.GetHostAddresses(nodeContext.IPAddressOrFQDN).First(x => x.AddressFamily == AddressFamily.InterNetwork)
                },
                lidgrenEventsLogger);

            var netConfig = new NetNodeConfig()
            {
                ConnectTimeoutSec = 30,
                SendTimeoutSec = 30
            };

            var bufferPool = new WcfBufferPool();
            
            var node = new NetNode<NetChannel>(nodeName, transport, coreEventsLogger, messageSerializer,
                    config: netConfig,
                    channelFactory: (owner, transportChannel) =>
                        new AsyncProcessingNetChannel(builder => builder
                            .UseFiber(Fiber, config => config
                                .Lock<Say>(LockType.Read)
                                .Lock<JoinRoom>(LockType.Write)
                                .Lock<PeerDisconnected>(LockType.Write))
                            .UseConfigurableDispatcher(config => config
                                .HandleMessageAsync<Say>(OnSay)
                                .HandleMessageAsync<JoinRoom>(OnRoomJoin)
                                .HandleMessageAsync<PeerDisconnected>((msg, o) => OnRoomLeave(o.ReplyChannel))),
                            owner, transportChannel, messageSerializer, coreEventsLogger, netConfig, bufferPool));

            return node;
        }
Example #2
0
        INetNode CreateNetNode(StatefulServiceContext initParams)
        {
            var logger = new LoggerConfiguration()
                         .ConfigureMOUSETypesDestructure()
                         .MinimumLevel.Verbose()
                         .WriteTo.Seq("http://localhost:5341/")
                         .CreateLogger();

            var coreEventsLogger    = new SerilogCoreEvents(logger);
            var lidgrenEventsLogger = new SerilogLidgrenEvents(logger);


            var messageSerializer = new ProtobufMessageSerializer(typeof(Message).Assembly, typeof(Say).Assembly);

            var endPoint = initParams
                           .CodePackageActivationContext
                           .GetEndpoint("ServiceEndPoint");

            var nodeContext = FabricRuntime.GetNodeContext();

            string nodeName = $"{nodeContext.NodeName}:{nodeContext.NodeId}";

            var transport = new LidgrenNetProvider(
                new NetPeerConfiguration("Public")
            {
                MaximumConnections        = 10,
                AcceptIncomingConnections = true,
                Port         = endPoint.Port,
                LocalAddress = Dns.GetHostAddresses(nodeContext.IPAddressOrFQDN).First(x => x.AddressFamily == AddressFamily.InterNetwork)
            },
                lidgrenEventsLogger);

            var netConfig = new NetNodeConfig()
            {
                ConnectTimeoutSec = 30,
                SendTimeoutSec    = 30
            };

            var bufferPool = new WcfBufferPool();

            var node = new NetNode <NetChannel>(nodeName, transport, coreEventsLogger, messageSerializer,
                                                config: netConfig,
                                                channelFactory: (owner, transportChannel) =>
                                                new AsyncProcessingNetChannel(builder => builder
                                                                              .UseFiber(Fiber, config => config
                                                                                        .Lock <Say>(LockType.Read)
                                                                                        .Lock <JoinRoom>(LockType.Write)
                                                                                        .Lock <PeerDisconnected>(LockType.Write))
                                                                              .UseConfigurableDispatcher(config => config
                                                                                                         .HandleMessageAsync <Say>(OnSay)
                                                                                                         .HandleMessageAsync <JoinRoom>(OnRoomJoin)
                                                                                                         .HandleMessageAsync <PeerDisconnected>((msg, o) => OnRoomLeave(o.ReplyChannel))),
                                                                              owner, transportChannel, messageSerializer, coreEventsLogger, netConfig, bufferPool));

            return(node);
        }