Sto riscontrando problemi nel far funzionare un'implementazione client/server di Quartz.NET.Quartz.NET, "Errore nella comunicazione con lo scheduler remoto."
Ho un server SQL su ServerA, un server che esegue Quartz come servizio (ServerB) e un server che ospita un'applicazione ASP.NET (ServerC).
Ho seguito tutti i tutorial e ho approfondito il codice in buona quantità ma non riesco a vedere cosa sto facendo male. Il server è in ascolto e posso vedere che la porta è aperta da ServerC. Nessun firewall incluso.
ServerB, che esegue il servizio incluso nel pacchetto di download (Quartz.Server.Service) ha le seguenti impostazioni del file di configurazione:
<quartz>
<add key="quartz.server.serviceName" value="quartz" />
<add key="quartz.server.serviceDisplayName" value="Job Scheduler" />
<add key="quartz.scheduler.instanceName" value="RemoteServer" />
<add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" />
<add key="quartz.threadPool.threadCount" value="10" />
<add key="quartz.threadPool.threadPriority" value="Normal" />
<add key="quartz.scheduler.exporter.type" value="Quartz.Simpl.RemotingSchedulerExporter, Quartz" />
<add key="quartz.scheduler.exporter.port" value="5656" />
<add key="quartz.scheduler.exporter.bindName" value="QuartzScheduler" />
<add key="quartz.scheduler.exporter.channelType" value="tcp" />
<add key="quartz.jobStore.type" value="Quartz.Impl.AdoJobStore.JobStoreTX, Quartz" />
<add key="quartz.jobStore.driverDelegateType" value="Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz" />
<add key="quartz.jobStore.tablePrefix" value="qrtz_" />
<add key="quartz.jobStore.dataSource" value="db" />
<add key="quartz.dataSource.db.provider" value="SqlServer-20" />
<add key="quartz.dataSource.db.connectionString" value="Data Source=ServerA;Initial Catalog=dev;User ID=dev;Password=dev" />
<add key="quartz.jobStore.useProperties" value="true" />
<add key="quartz.jobStore.lockHandler.type" value="Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz" />
</quartz>
L'applicazione ASP.NET ha la seguente configurazione:
<quartz>
<add key="quartz.scheduler.instanceName" value="RemoteClient" />
<add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" />
<add key="quartz.threadPool.threadCount" value="5" />
<add key="quartz.threadPool.threadPriority" value="Normal" />
<add key="quartz.scheduler.proxy" value="true" />
<add key="quartz.scheduler.proxy.address" value="tcp://ServerB:5656/QuartzScheduler" />
</quartz>
Ho provato numerose cose. Occasionalmente ricevo un errore che lo schedulatore esiste già al posto di quello nel titolo della domanda.
Ho letto altrove che a causa di problemi di threading dovrei creare lo scheduler in un Singleton, che ho fatto:
private static readonly ISchedulerFactory _schedulerFactory;
private static readonly IScheduler _scheduler;
static JobScheduleService() {
_schedulerFactory = new StdSchedulerFactory();
_scheduler = _schedulerFactory.GetScheduler();
}
public static IScheduler GetScheduler() {
return _scheduler;
}
Che cosa ho mancato? TIA
Se apro una scatola telnet sul server Web e connettersi al server di quarzo poi il servizio è decisamente risponde. Se digito alcuni caratteri ottengo un errore da Quartz.
fa questo aiuto? Cioè non è un problema di connettività?
Telnet http://www.freeimagehosting.net/uploads/3bd8cd3f53.png
Il file dll sul servizio Quartz o sull'app da cui si connetteva da remoto era mancante? Ti dispiacerebbe condividere il nome della DLL? Sto riscontrando lo stesso problema durante la connessione remota a un server al quarzo. – user2748614
Era sul server, ma non ricordo quale dll fosse - sarebbe stato Quartz.Core.dll, Quartz.Service.dll, o l'assembly in cui avevo implementato le mie interfacce IJob. – enashnash