c# - 如何在没有作业程序集的本地副本的情况下在 Quartz.net 中安排远程作业?

标签 c# quartz.net typeof

我正在尝试创建一个远程作业以在 Quartz.net 中进行调度。当我在本地拥有包含作业的程序集副本时,我可以执行类似的操作

    JobDetail job = new JobDetail("remotelyAddedJob", "default", typeof(DummyJob.DummyJob));

这要求我在服务器和我从中创建计划的计算机上都有包含 DummyJob 类的程序集的副本。

我想要做的是能够通过以存储在quartz_jobs.xml 文件中的方式发送作业类型信息来创建计划,而无需客户端的组件副本

  <job-type>Quartz.Job.NoOpJob, Quartz</job-type>

我无法弄清楚如何在没有本地副本的情况下发送类类型信息。有没有人有好的解决办法?

最佳答案

这个问题真的很困扰我。我知道我可以即时生成类,因此我研究了如何生成类。

第 1 步:创建此类

using System;
using Quartz;
using System.Reflection;
using System.Reflection.Emit;

namespace TestQuartzTaskCreator {
    public class FakeJob {
        public static Type Create(string assemblyName, string typeName){
            AssemblyName aName = new AssemblyName(assemblyName);
            AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(
                    aName,
                    AssemblyBuilderAccess.RunAndSave);

            ModuleBuilder mb = ab.DefineDynamicModule(aName.Name, aName.Name + ".dll");

            TypeBuilder tb = mb.DefineType(typeName, TypeAttributes.Public);

            tb.AddInterfaceImplementation(typeof(IJob));

            MethodBuilder meth = tb.DefineMethod(
                "Execute",
                MethodAttributes.Public | MethodAttributes.Virtual,
                typeof(void),
                new Type[] { typeof(JobExecutionContext) });

            meth.DefineParameter(1,
                ParameterAttributes.In,
                "context");

            ILGenerator methIL = meth.GetILGenerator();
            methIL.Emit(OpCodes.Ldarg_0);

            Type t = null;
            try {
                // Finish the type.
                t = tb.CreateType();
            }
            catch (Exception ex) {
                System.Console.WriteLine(ex.ToString());
            }

//            ab.Save(aName.Name + ".dll");

            return t;
        }
    }
}

第 2 步:从此更改

JobDetail job = new JobDetail("remotelyAddedJob", "default", typeof(TestType));

到此

JobDetail job = new JobDetail("remotelyAddedJob", "default", FakeJob.Create("TestAss", "TestType"));

第 3 步:像以前一样运行(但客户端中没有引用作业程序集的副本)

-- 编辑-- 虽然这实现了我最初想要的效果,但它并不能解决从客户端环境使用 Quartz.Net 时的所有问题。检索作业需要程序集可用。

我当前的方法是创建一个 Web 服务接口(interface),该接口(interface)将与服务驻留在同一服务器上,并提供一个更加断开连接的接口(interface)。

关于c# - 如何在没有作业程序集的本地副本的情况下在 Quartz.net 中安排远程作业?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6496899/

相关文章:

c# - 如何使用 LINQ 在 string[] 中查找最长的字符串

c# - quartz : Does not implement interface member

quartz-scheduler - 如何创建每 N 秒运行一次的 quartz 作业,即使作业需要更多时间

javascript - typeof a == 'undefined' vs typeof a === 'undefined'

c# - AutoMapper 将对象映射到数组

c# - 在查询之前对 ObservableCollection 进行空检查

c# - 使用 Moq 设置解决不明确的调用,方法首先返回,第二个抛出异常

quartz-scheduler - Quartz.net 调度器和 IStatefulJob

dojo - 接口(interface)上的 typescript 类型?

JavaScript: 'typeof' 运算符未返回正确的类类型