我正在尝试创建一个远程作业以在 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/