首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用.NET 3.x和Sqlit3.0的Quartz.net核心2.0控制台应用程序

使用.NET 3.x和Sqlit3.0的Quartz.net核心2.0控制台应用程序
EN

Stack Overflow用户
提问于 2017-08-30 05:19:33
回答 1查看 1.6K关注 0票数 0

尝试在Quartz调度程序3.0.0-alpha3 3和System.Data.Sqlite.Core (1.0.105.2)中使用Sqlite,并在我的Mac上编译的.NET Core2.0控制台应用程序上进行以下配置:

代码语言:javascript
复制
NameValueCollection props = new NameValueCollection {
 { "quartz.threadPool.type", "Quartz.Simpl.SimpleThreadPool, Quartz" },
 { "quartz.threadPool.threadCount", "10" },
 { "quartz.jobStore.type", "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz" },
 { "quartz.jobStore.misfireThreshold", "60000" },
 { "quartz.jobStore.lockHandler.type", "Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz" },
 { "quartz.jobStore.useProperties", "true" },
 { "quartz.jobStore.dataSource", "default" },
 { "quartz.jobStore.tablePrefix", "QRTZ_" },
 { "quartz.jobStore.driverDelegateType", "Quartz.Impl.AdoJobStore.SQLiteDelegate, Quartz" },
 { "quartz.dataSource.default.provider", "SQLite-10" },
 { "quartz.dataSource.default.connectionString", "Data Source=quartznet.db;Version=3;" }
};

实际行为

Quartz.SchedulerException:无法初始化DataSource: SqliteDS --> System.ArgumentOutOfRangeException:没有提供程序'SQLite-10‘参数名称: providerName的元数据信息 在Quartz.Impl.AdoJobStore.Common.DbProvider.GetDbMetadata(String providerName)在C:\projects\quartznet-6fcn8\src\Quartz\Impl\AdoJobStore\Common\DbProvider.cs:line 118在Quartz.Impl.AdoJobStore.Common.DbProvider..ctor(String dbProviderName,字符串( String connectionString)在C:\projects\quartznet-6fcn8\src\Quartz\Impl\AdoJobStore\Common\DbProvider.cs:line 74 at Quartz.Impl.StdSchedulerFactory.d__65.MoveNext() in C:\projects\quartznet-6fcn8\src\Quartz\Impl\StdSchedulerFactory.cs:line 614 -内部异常堆栈跟踪的末端-在C:\projects\quartznet-6fcn8\src\Quartz\Impl\StdSchedulerFactory.cs:line 623中的Quartz.Impl.StdSchedulerFactory.d__65.MoveNext()从抛出异常的前一个位置(在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task任务)到C:\projects\quartznet-6fcn8\src\Quartz\Impl\StdSchedulerFactory.cs:line 1118中的Quartz.Impl.StdSchedulerFactory.d__69.MoveNext()的堆栈跟踪--从抛出异常的前一个位置开始的堆栈跟踪--在系统上抛出System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task任务。.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at BackgroundProcessingWithQuartz.Program.d__1.MoveNext() in /Users/jakesmith/Projects/BackgroundProcessingWithQuartz/BackgroundProcessingWithQuartz/BackgroundProcessingWithQuartz/Program.cs:line 44 [参见嵌套异常: System.ArgumentOutOfRangeException:没有提供程序'SQLite-10‘参数名称: providerName at Quartz.Impl.AdoJobStore.Common.DbProvider.GetDbMetadata(String providerName的元数据信息),在Quartz.Impl.AdoJobStore.Common.DbProvider..ctor(String dbProviderName的C:\projects\quartznet-6fcn8\src\Quartz\Impl\AdoJobStore\Common\DbProvider.cs:line 118中,在C:\projects\quartznet-6fcn8\src\Quartz\Impl\AdoJobStore\Common\DbProvider.cs:line 74中的字符串connectionString(在C:\projects\quartznet-6fcn8\src\Quartz\Impl\StdSchedulerFactory.cs:line 614中的Quartz.Impl.StdSchedulerFactory.d__65.MoveNext()中)

我错过了什么?所有内容都是通过上的NuGet安装的。另外,当dll在Mac上实际运行时,为什么会有对C驱动器的引用。请帮帮忙。

EN

回答 1

Stack Overflow用户

发布于 2017-09-06 15:30:37

Quartz 3.0 beta 1支持开箱即用的Microsoft.Data.Sqlite

添加所需的包引用:

PackageReference Include="Microsoft.Data.Sqlite“Version="2.0.0”/> PackageReference Include="Quartz“Version=”3.0.0-beta1 1“/>

代码语言:javascript
复制
class Program
{
    static void Main()
    {
        try
        {
            Run().GetAwaiter().GetResult();
        }
        catch (Exception e)
        {
            Console.Error.WriteLine(e);
        }
        finally
        {
            Console.ReadLine();
        }
    }

    private static async Task Run()
    {
        var properties = new NameValueCollection
        {
            ["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz",
            ["quartz.jobStore.useProperties"] = "true",
            ["quartz.jobStore.dataSource"] = "default",
            ["quartz.jobStore.tablePrefix"] = "QRTZ_",
            ["quartz.jobStore.driverDelegateType"] = "Quartz.Impl.AdoJobStore.SQLiteDelegate, Quartz",
            ["quartz.dataSource.default.provider"] = "SQLite-Microsoft",
            ["quartz.dataSource.default.connectionString"] = "Data Source=test.db",
            ["quartz.serializer.type"] = "binary"
        };


        ISchedulerFactory sf = new StdSchedulerFactory(properties);
        IScheduler sched = await sf.GetScheduler();

        await sched.Start();

        Thread.Sleep(TimeSpan.FromMinutes(10));
    }
}

注册自定义提供程序元数据

仅当您需要Microsoft.Data.Sqlite以外的其他提供程序或使用比beta 1更早的版本时,才需要

您需要首先注册元数据,以便能够引用自定义SQLite提供程序。下面是一个例子:

项目档案:

代码语言:javascript
复制
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.0</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.Data.Sqlite" Version="2.0.0" />
    <PackageReference Include="Quartz" Version="3.0.0-alpha3" />
  </ItemGroup>
</Project>

守则:

代码语言:javascript
复制
using System;
using System.Collections.Specialized;
using System.Data;
using System.Threading;
using System.Threading.Tasks;

using Microsoft.Data.Sqlite;

using Quartz;
using Quartz.Impl;
using Quartz.Impl.AdoJobStore.Common;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main()
        {
            Run().GetAwaiter().GetResult();
        }

        private static async Task Run()
        {
            DbProvider.RegisterDbMetadata("sqlite-custom", new DbMetadata()
            {
                AssemblyName = typeof(SqliteConnection).Assembly.GetName().Name,
                ConnectionType = typeof(SqliteConnection),
                CommandType = typeof(SqliteCommand),
                ParameterType = typeof(SqliteParameter),
                ParameterDbType = typeof(DbType),
                ParameterDbTypePropertyName = "DbType",
                ParameterNamePrefix = "@",
                ExceptionType = typeof(SqliteException),
                BindByName = true
            });


            var properties = new NameValueCollection
            {
                ["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz",
                ["quartz.jobStore.useProperties"] = "true",
                ["quartz.jobStore.dataSource"] = "default",
                ["quartz.jobStore.tablePrefix"] = "QRTZ_",
                ["quartz.jobStore.driverDelegateType"] = "Quartz.Impl.AdoJobStore.SQLiteDelegate, Quartz",
                ["quartz.dataSource.default.provider"] = "sqlite-custom",
                ["quartz.dataSource.default.connectionString"] = "Data Source=test.db",
                ["quartz.jobStore.lockHandler.type"] = "Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz",
                ["quartz.serializer.type"] = "binary"
            };


            ISchedulerFactory sf = new StdSchedulerFactory(properties);
            IScheduler sched = await sf.GetScheduler();

            await sched.Start();

            Thread.Sleep(TimeSpan.FromMinutes(10));
        }
    }
}

您可以看到对C驱动器的引用,因为Quartz库是在Windows机器上编译的,这将使PDB文件包含来自构建主机的路径。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45952441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档