Quartznet: System.PlatformNotSupportedException em execução em um contêiner baseado em Linux

Criado em 11 ago. 2017  ·  5Comentários  ·  Fonte: quartznet/quartznet

Versão: 3.0.0 - alpha3

Acabei de executar o aplicativo de console no contêiner docker e obtive a seguinte PlatformNotSupportedException no início. O mesmo aplicativo funciona bem no Windows .NET Core 2.0.
Parece que é uma das propriedades do Thread que o setter lança isso (o número da linha não ajuda por algum motivo).

Alguma ideia?

[16:44:51] [Info] [  ]Quartz.NET properties loaded from configuration file '/app/quartz.config'
[16:44:51] [Info] [  ]Registering datasource 'myDS' with db provider: 'Quartz.Impl.AdoJobStore.Common.DbProvider'
[16:44:51] [Info] [  ]Using object serializer: Quartz.Simpl.JsonObjectSerializer, Quartz.Serialization.Json
[16:44:51] [Info] [  ]Initialized Scheduler Signaller of type: Quartz.Core.SchedulerSignalerImpl
[16:44:51] [Info] [  ]Quartz Scheduler v.3.0.0.0 created.
[16:44:51] [Info] [  ]Using db table-based data access locking (synchronization).
[16:44:51] [Info] [  ]JobStoreTX initialized.
[16:44:51] [Info] [  ]Scheduler meta-data: Quartz Scheduler (v3.0.0.0) 'Service' with instanceId 'NON_CLUSTERED'
  Scheduler class: 'Quartz.Core.QuartzScheduler' - running locally.
  NOT STARTED.
  Currently in standby mode.
  Number of jobs executed: 0
  Using thread pool 'Quartz.Simpl.DefaultThreadPool' - with 10 threads.
  Using job-store 'Quartz.Impl.AdoJobStore.JobStoreTX' - which supports persistence. and is clustered.

[16:44:51] [Info] [  ]Quartz scheduler 'Service' initialized
[16:44:51] [Info] [  ]Quartz scheduler version: 3.0.0.0
[16:44:52] [Info] [  ]ClusterManager: detected 1 failed or restarted instances.
[16:44:52] [Info] [  ]ClusterManager: Scanning for instance "NON_CLUSTERED"'s failed in-progress jobs.
Host start was not succeeded: System.PlatformNotSupportedException: COM interop is not supported on this platform.
   at Quartz.Util.QueuedTaskScheduler..ctor(Int32 threadCount, String threadName, Boolean useForegroundThreads, ThreadPriority threadPriority, ApartmentState threadApartmentState, Action threadInit, Action threadFinally) in C:\projects\quartznet-6fcn8\src\Quartz\Util\QueuedTaskScheduler.cs:line 72
   at Quartz.Impl.AdoJobStore.ClusterManager.<Initialize>d__8.MoveNext() in C:\projects\quartznet-6fcn8\src\Quartz\Impl\AdoJobStore\ClusterManager.cs:line 36
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Quartz.Impl.AdoJobStore.JobStoreSupport.<SchedulerStarted>d__131.MoveNext() in C:\projects\quartznet-6fcn8\src\Quartz\Impl\AdoJobStore\JobStoreSupport.cs:line 493
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Quartz.Core.QuartzScheduler.<Start>d__68.MoveNext() in C:\projects\quartznet-6fcn8\src\Quartz\Core\QuartzScheduler.cs:line 371

quartz.config

quartz.scheduler.instanceName = AUTO
quartz.jobStore.clustered = true
quartz.scheduler.instanceName = Service
quartz.scheduler.idleWaitTime = 10000
quartz.scheduler.batchTriggerAcquisitionMaxCount = 10

quartz.threadPool.threadCount = 10

quartz.jobStore.type = Quartz.Impl.AdoJobStore.JobStoreTX, Quartz
quartz.jobStore.driverDelegateType = Quartz.Impl.AdoJobStore.MySQLDelegate, Quartz
quartz.jobStore.tablePrefix = QRTZ_
quartz.jobStore.dataSource = myDS
quartz.dataSource.myDS.connectionString = Server=localhost;Database=Service;uid=service;pwd=1
quartz.dataSource.myDS.provider = MySql
quartz.jobStore.useProperties = false

quartz.serializer.type = json

dockerfile

FROM microsoft/dotnet:2.0.0-preview2-runtime-stretch
WORKDIR /app
COPY . .
ENTRYPOINT ["dotnet", "Service.dll"]

Comentários muito úteis

Vou tentar lançar no próximo fim de semana o mais tardar. Estou realmente tentando encontrar possíveis alterações importantes para serem colocadas no próximo lançamento para que eu pudesse chamá-lo de beta em sã consciência. Lamento o atraso, mas não tive muito tempo livre recentemente.

Todos 5 comentários

Analisei isso um pouco mais a fundo e parece que esta linha em QueuedTaskScheduler falha

_threads[i].SetApartmentState(threadApartmentState);

Se eu apenas comentar essa linha e reconstruí-la, ela começa a funcionar. Portanto, parece que devemos ter a capacidade de desligar isso completamente por meio da configuração ou apenas construir o netstandard 2.0 sem o switch THREAD_APARTMENTSTATE como uma solução rápida por enquanto.

Obrigado pelo relatório e investigação detalhada. Eu empurrei uma correção para isso. Realmente não precisamos ter THREAD_APARTMENTSTATE definido para .NET Core como para interoperabilidade COM.

@lahma Incrível, isso foi corrigido para beta-1 , eu também achei isso ao tentar docker + .net standard 2.0 + quartz-net alpha3. Seria possível ter beta-1 publicado no feed AppVeyor NuGet ou no próprio nuget para que possa ser referenciado e usado para teste?

Seria possível lançar um novo alfa para seus feeds nuget com isso incluído? Há um problema de composição aqui com MVC e localização de assemblies de referência locais como é o caso ao compilar a partir da fonte e fazer referência a esta dll do projeto. Suas alterações corrigem esse erro de inicialização.

É um problema conhecido com Não é possível resolver caminhos de montagem para bibliotecas de compilação de referência e parece que o .NET Core 2.1 provavelmente terá essa correção, embora não seja lançado até o primeiro trimestre de 2018. Se pudéssemos usar as DLLs de feed novamente, fazer tudo se encaixar novamente de uma maneira perfeita e nos permitir fazer mais testes com o .NET Core 2.0

Vou tentar lançar no próximo fim de semana o mais tardar. Estou realmente tentando encontrar possíveis alterações importantes para serem colocadas no próximo lançamento para que eu pudesse chamá-lo de beta em sã consciência. Lamento o atraso, mas não tive muito tempo livre recentemente.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

lahma picture lahma  ·  11Comentários

ljani picture ljani  ·  9Comentários

ndenkha picture ndenkha  ·  14Comentários

MuraliM picture MuraliM  ·  3Comentários

dbraaten42 picture dbraaten42  ·  4Comentários