async Task EnsureServerInitializedAsync() { if (this.ServerAddress != null) { return; } int threadCount = Environment.ProcessorCount; var executorGroup = new MultithreadEventLoopGroup(threadCount); var bufAllocator = new PooledByteBufferAllocator(16 * 1024, 10 * 1024 * 1024 / threadCount); // reserve 10 MB for 64 KB buffers BlobSessionStatePersistenceProvider sessionStateProvider = await BlobSessionStatePersistenceProvider.CreateAsync( this.settingsProvider.GetSetting("BlobSessionStatePersistenceProvider.StorageConnectionString"), this.settingsProvider.GetSetting("BlobSessionStatePersistenceProvider.StorageContainerName")); TableQos2StatePersistenceProvider qos2StateProvider = await TableQos2StatePersistenceProvider.CreateAsync( this.settingsProvider.GetSetting("TableQos2StatePersistenceProvider.StorageConnectionString"), this.settingsProvider.GetSetting("TableQos2StatePersistenceProvider.StorageTableName")); var settings = new Settings(this.settingsProvider); var authProvider = new SasTokenDeviceIdentityProvider(); var topicNameRouter = new ConfigurableMessageRouter(); IotHubClientFactoryFunc iotHubClientFactoryMethod = IotHubClient.PreparePoolFactory(settings.IotHubConnectionString + ";DeviceId=stub", "a", 1); var iotHubFactory = new IotHubCommunicationFactory(iotHubClientFactoryMethod); ServerBootstrap server = new ServerBootstrap() .Group(executorGroup) .Channel <TcpServerSocketChannel>() .ChildOption(ChannelOption.Allocator, bufAllocator) .ChildOption(ChannelOption.AutoRead, false) .ChildHandler(new ActionChannelInitializer <IChannel>(ch => { ch.Pipeline.AddLast(TlsHandler.Server(this.tlsCertificate)); ch.Pipeline.AddLast( MqttEncoder.Instance, new MqttDecoder(true, 256 * 1024), new LoggingHandler(), new MqttIotHubAdapter( settings, sessionStateProvider, authProvider, qos2StateProvider, iotHubFactory, topicNameRouter), new XUnitLoggingHandler(this.output)); })); IChannel serverChannel = await server.BindAsync(IPAddress.Any, this.ProtocolGatewayPort); this.ScheduleCleanup(async() => { await serverChannel.CloseAsync(); await executorGroup.ShutdownGracefullyAsync(); }); this.ServerAddress = IPAddress.Loopback; }
public static IotHubClientFactoryFunc PreparePoolFactory(string baseConnectionString, string poolId, int connectionPoolSize, TimeSpan?connectionIdleTimeout) { IotHubConnectionStringBuilder csb = IotHubConnectionStringBuilder.Create(baseConnectionString); IotHubClientFactoryFunc iotHubClientFactory = deviceIdentity => { var identity = (IotHubDeviceIdentity)deviceIdentity; csb.AuthenticationMethod = DeriveAuthenticationMethod(csb.AuthenticationMethod, identity); csb.HostName = identity.IotHubHostName; string connectionString = csb.ToString(); return(CreateFromConnectionStringAsync(connectionString, connectionPoolSize, connectionIdleTimeout)); }; return(iotHubClientFactory); }
public static IotHubClientFactoryFunc PreparePoolFactory(string baseConnectionString, string poolId, int connectionPoolSize) { IotHubConnectionStringBuilder csb = IotHubConnectionStringBuilder.Create(baseConnectionString); // todo: uncommment once explicit control over connection pooling is available //string[] connectionIds = Enumerable.Range(1, connectionPoolSize).Select(index => poolId + index).ToArray(); int connectionIndex = 0; IotHubClientFactoryFunc iotHubClientFactory = deviceIdentity => { //if (++connectionIndex >= connectionPoolSize) //{ // connectionIndex = 0; //} //csb.GroupName = connectionIds[connectionIndex]; // todo: uncommment once explicit control over connection pooling is available var identity = (IotHubDeviceIdentity)deviceIdentity; csb.AuthenticationMethod = DeriveAuthenticationMethod(csb.AuthenticationMethod, identity); csb.HostName = identity.IotHubHostName; string connectionString = csb.ToString(); return(CreateFromConnectionStringAsync(connectionString)); }; return(iotHubClientFactory); }
public IotHubCommunicationFactory(IotHubClientFactoryFunc iotHubClientFactoryMethod) { this.iotHubClientFactoryMethod = iotHubClientFactoryMethod; }