NopCommerce 任务插件未启动任务
NopCommerce Task Plugin not starting task
使用 NopCommerce 3.8。
我创建了一个新的 Misc 插件。目的是 运行 一个安静地调用我的网络 api 获取数据的任务。
以下是我的代码:
插件class
public class MereSyncPlugin : BasePlugin, IMiscPlugin
{
private MereSyncObjectContext _context;
private IScheduleTaskService _schedualTaskService;
public MereSyncPlugin(MereSyncObjectContext context, IScheduleTaskService schedualTaskService)
{
_context = context;
_schedualTaskService = schedualTaskService;
}
public void GetConfigurationRoute(out string actionName, out string controllerName, out RouteValueDictionary routeValues)
{
actionName = "";
controllerName = "";
routeValues = new RouteValueDictionary()
{
{ "Namespaces", "Nop.plugin.Misc.MereSync.Controllers" },
{ "area", null }
};
}
public override void Install()
{
//TODO: add more
_schedualTaskService.InsertTask(new Nop.Core.Domain.Tasks.ScheduleTask()
{
Enabled = true,
Name = "Product Sync",
Seconds = 3600,
StopOnError = false,
Type = "Nop.Plugin.Misc.MereSync.ProductSyncTask, Nop.Plugin.Misc.MereSync"
});
//_context.Install();
base.Install();
}
public override void Uninstall()
{
Nop.Core.Domain.Tasks.ScheduleTask task = _schedualTaskService.GetTaskByType("Nop.Plugin.Misc.MereSync.ProductSyncTask, Nop.Plugin.Misc.MereSync");
if (task != null)
_schedualTaskService.DeleteTask(task);
//_context.Uninstall();
base.Uninstall();
}
}
对象上下文class(虽然此时没有设置所以注释掉了一些部分)
public class MereSyncObjectContext : DbContext, IDbContext
{
public bool ProxyCreationEnabled
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
public bool AutoDetectChangesEnabled
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
public MereSyncObjectContext(string nameOrConnectionString) : base(nameOrConnectionString)
{
}
/*protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//TODO: insert ALL model MAPPINGS!!!!
//modelBuilder.Configurations.Add(new insertnewmap());
base.OnModelCreating(modelBuilder);
}*/
public string CreateDatabaseInstallationScript()
{
return ((IObjectContextAdapter)this).ObjectContext.CreateDatabaseScript();
}
public void Install()
{
Database.SetInitializer<MereSyncObjectContext>(null);
Database.ExecuteSqlCommand(CreateDatabaseInstallationScript());
SaveChanges();
}
public void Uninstall()
{
//this.DropPluginTable("MereSys_TableName");
}
IDbSet<TEntity> IDbContext.Set<TEntity>()
{
return base.Set<TEntity>();
}
public IList<TEntity> ExecuteStoredProcedureList<TEntity>(string commandText, params object[] parameters) where TEntity : BaseEntity, new()
{
throw new NotImplementedException();
}
public IEnumerable<TElement> SqlQuery<TElement>(string sql, params object[] parameters)
{
throw new NotImplementedException();
}
public int ExecuteSqlCommand(string sql, bool doNotEnsureTransaction = false, int? timeout = default(int?), params object[] parameters)
{
throw new NotImplementedException();
}
public void Detach(object entity)
{
throw new NotImplementedException();
}
}
任务class
public class ProductSyncTask : ITask
{
private readonly ILogger _logger;
public ProductSyncTask(ILogger logger)
{
this._logger = logger;
}
public async void Execute()
{
//TODO: Call My method, USE BEST PRACTICE, IoC DI
//throw new NotImplementedException();
_logger.InsertLog(Nop.Core.Domain.Logging.LogLevel.Information, "Start", "Product sync has started");
ProductSyncService test = new ProductSyncService();
await test.GetProductsAsync();
}
}
问题
当我在 Nopcommerce 后端导航到日志文件时
admin area > system > log
我希望在那里看到我的日志声明,但没有显示。
所以我也检查了任务的计划状态,它从未开始。在调试模式下我的任务 class 也设置了断点,并且永远不会命中。
所以,我在这里遗漏了什么吗?我的实现是否正确?
备注:
我已经删除了异步调用,但它什么也没做(因为它从未达到 class 级别)。清理并重建,在适用的情况下将 copy local false 设置为 false。
插件已安装。机器上的事件查看器不显示任何与 nopcommerce 相关的警告或错误。 "Run Now" 按钮按下时刷新页面但没有指示任务 运行,我的 class 断点在调试模式下也没有命中。
源文件
Source
到目前为止,插件包含我的代码,大部分是多余的,未使用,即休息客户端等,因为我从未到达流程的那个阶段。
Type
的第一个参数属性是class的完整路径,继承了ITask
接口。第二个参数是插件的命名空间。
因此,您只需在此处进行更改:
_schedualTaskService.InsertTask(new Nop.Core.Domain.Tasks.ScheduleTask()
{
Enabled = true,
Name = "Product Sync",
Seconds = 3600,
StopOnError = false,
Type = "Nop.Plugin.Misc.MereSync.ProductSyncTask, Nop.Plugin.Misc.MereSync"
});
到
Type = "Nop.Plugin.Misc.MereSync.ProductSyncTask.MereSyncPlugin, Nop.Plugin.Misc.MereSync"
希望对您有所帮助!
好的 Div 在正确的轨道上,但看不到我的文件系统,我忘记了 1 个文件夹。
这里要学什么?检查字符串,我忘了我添加了一个很好的额外文件夹,名为...... "Tasks".
完整的安装路径?
"Nop.Plugin.Misc.MereSync.Tasks.ProductSyncTask, Nop.Plugin.Misc.MereSync.MereSyncPlugin"
nop 中的任务真的很简单。不要像我一样浪费一天!
使用 NopCommerce 3.8。
我创建了一个新的 Misc 插件。目的是 运行 一个安静地调用我的网络 api 获取数据的任务。
以下是我的代码:
插件class
public class MereSyncPlugin : BasePlugin, IMiscPlugin
{
private MereSyncObjectContext _context;
private IScheduleTaskService _schedualTaskService;
public MereSyncPlugin(MereSyncObjectContext context, IScheduleTaskService schedualTaskService)
{
_context = context;
_schedualTaskService = schedualTaskService;
}
public void GetConfigurationRoute(out string actionName, out string controllerName, out RouteValueDictionary routeValues)
{
actionName = "";
controllerName = "";
routeValues = new RouteValueDictionary()
{
{ "Namespaces", "Nop.plugin.Misc.MereSync.Controllers" },
{ "area", null }
};
}
public override void Install()
{
//TODO: add more
_schedualTaskService.InsertTask(new Nop.Core.Domain.Tasks.ScheduleTask()
{
Enabled = true,
Name = "Product Sync",
Seconds = 3600,
StopOnError = false,
Type = "Nop.Plugin.Misc.MereSync.ProductSyncTask, Nop.Plugin.Misc.MereSync"
});
//_context.Install();
base.Install();
}
public override void Uninstall()
{
Nop.Core.Domain.Tasks.ScheduleTask task = _schedualTaskService.GetTaskByType("Nop.Plugin.Misc.MereSync.ProductSyncTask, Nop.Plugin.Misc.MereSync");
if (task != null)
_schedualTaskService.DeleteTask(task);
//_context.Uninstall();
base.Uninstall();
}
}
对象上下文class(虽然此时没有设置所以注释掉了一些部分)
public class MereSyncObjectContext : DbContext, IDbContext
{
public bool ProxyCreationEnabled
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
public bool AutoDetectChangesEnabled
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
public MereSyncObjectContext(string nameOrConnectionString) : base(nameOrConnectionString)
{
}
/*protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//TODO: insert ALL model MAPPINGS!!!!
//modelBuilder.Configurations.Add(new insertnewmap());
base.OnModelCreating(modelBuilder);
}*/
public string CreateDatabaseInstallationScript()
{
return ((IObjectContextAdapter)this).ObjectContext.CreateDatabaseScript();
}
public void Install()
{
Database.SetInitializer<MereSyncObjectContext>(null);
Database.ExecuteSqlCommand(CreateDatabaseInstallationScript());
SaveChanges();
}
public void Uninstall()
{
//this.DropPluginTable("MereSys_TableName");
}
IDbSet<TEntity> IDbContext.Set<TEntity>()
{
return base.Set<TEntity>();
}
public IList<TEntity> ExecuteStoredProcedureList<TEntity>(string commandText, params object[] parameters) where TEntity : BaseEntity, new()
{
throw new NotImplementedException();
}
public IEnumerable<TElement> SqlQuery<TElement>(string sql, params object[] parameters)
{
throw new NotImplementedException();
}
public int ExecuteSqlCommand(string sql, bool doNotEnsureTransaction = false, int? timeout = default(int?), params object[] parameters)
{
throw new NotImplementedException();
}
public void Detach(object entity)
{
throw new NotImplementedException();
}
}
任务class
public class ProductSyncTask : ITask
{
private readonly ILogger _logger;
public ProductSyncTask(ILogger logger)
{
this._logger = logger;
}
public async void Execute()
{
//TODO: Call My method, USE BEST PRACTICE, IoC DI
//throw new NotImplementedException();
_logger.InsertLog(Nop.Core.Domain.Logging.LogLevel.Information, "Start", "Product sync has started");
ProductSyncService test = new ProductSyncService();
await test.GetProductsAsync();
}
}
问题
当我在 Nopcommerce 后端导航到日志文件时
admin area > system > log
我希望在那里看到我的日志声明,但没有显示。
所以我也检查了任务的计划状态,它从未开始。在调试模式下我的任务 class 也设置了断点,并且永远不会命中。
所以,我在这里遗漏了什么吗?我的实现是否正确?
备注:
我已经删除了异步调用,但它什么也没做(因为它从未达到 class 级别)。清理并重建,在适用的情况下将 copy local false 设置为 false。 插件已安装。机器上的事件查看器不显示任何与 nopcommerce 相关的警告或错误。 "Run Now" 按钮按下时刷新页面但没有指示任务 运行,我的 class 断点在调试模式下也没有命中。
源文件 Source
到目前为止,插件包含我的代码,大部分是多余的,未使用,即休息客户端等,因为我从未到达流程的那个阶段。
Type
的第一个参数属性是class的完整路径,继承了ITask
接口。第二个参数是插件的命名空间。
因此,您只需在此处进行更改:
_schedualTaskService.InsertTask(new Nop.Core.Domain.Tasks.ScheduleTask()
{
Enabled = true,
Name = "Product Sync",
Seconds = 3600,
StopOnError = false,
Type = "Nop.Plugin.Misc.MereSync.ProductSyncTask, Nop.Plugin.Misc.MereSync"
});
到
Type = "Nop.Plugin.Misc.MereSync.ProductSyncTask.MereSyncPlugin, Nop.Plugin.Misc.MereSync"
希望对您有所帮助!
好的 Div 在正确的轨道上,但看不到我的文件系统,我忘记了 1 个文件夹。
这里要学什么?检查字符串,我忘了我添加了一个很好的额外文件夹,名为...... "Tasks".
完整的安装路径?
"Nop.Plugin.Misc.MereSync.Tasks.ProductSyncTask, Nop.Plugin.Misc.MereSync.MereSyncPlugin"
nop 中的任务真的很简单。不要像我一样浪费一天!