成功向两个topc生产消息;
select id as topic_roleId, id as topic_myId from role updatetime<'{End}'
This commit is contained in:
parent
98cbadfc0a
commit
fc01893ead
|
@ -30,6 +30,16 @@
|
||||||
<DebugType>full</DebugType>
|
<DebugType>full</DebugType>
|
||||||
<DebugSymbols>true</DebugSymbols>
|
<DebugSymbols>true</DebugSymbols>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Remove="appsettings.json" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Content Include="appsettings.json">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
|
||||||
|
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
||||||
|
</Content>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="NewLife.Agent" Version="8.7.2020.417-beta" />
|
<PackageReference Include="NewLife.Agent" Version="8.7.2020.417-beta" />
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
{
|
||||||
|
"Logging": {
|
||||||
|
"LogLevel": {
|
||||||
|
"Default": "Warning"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"AllowedHosts": "*",
|
||||||
|
"ConnectionStrings": {
|
||||||
|
"Membership": {
|
||||||
|
"connectionString": "Data Source=..\\Data\\Membership.db",
|
||||||
|
"providerName": "SQLite"
|
||||||
|
},
|
||||||
|
"Log": {
|
||||||
|
"connectionString": "Data Source=..\\Data\\Log.db",
|
||||||
|
"providerName": "SQLite"
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,6 +1,8 @@
|
||||||
using System;
|
using System;
|
||||||
|
using System.Linq;
|
||||||
using AntJob.Data;
|
using AntJob.Data;
|
||||||
using AntJob.Extensions;
|
using AntJob.Extensions;
|
||||||
|
using AntJob.Providers;
|
||||||
using NewLife.Data;
|
using NewLife.Data;
|
||||||
using XCode.DataAccessLayer;
|
using XCode.DataAccessLayer;
|
||||||
|
|
||||||
|
@ -37,7 +39,7 @@ namespace AntJob
|
||||||
var sections = SqlSection.ParseAll(sqls);
|
var sections = SqlSection.ParseAll(sqls);
|
||||||
if (sections.Length == 0) return -1;
|
if (sections.Length == 0) return -1;
|
||||||
|
|
||||||
var rs = ExecuteSql(sections, ctx);
|
var rs = ExecuteSql(sections, ctx, (section, dt) => SqlMessage.ProcessMessage(dt, ctx));
|
||||||
|
|
||||||
return rs;
|
return rs;
|
||||||
}
|
}
|
||||||
|
@ -45,8 +47,9 @@ namespace AntJob
|
||||||
/// <summary>执行Sql集合</summary>
|
/// <summary>执行Sql集合</summary>
|
||||||
/// <param name="sections"></param>
|
/// <param name="sections"></param>
|
||||||
/// <param name="ctx"></param>
|
/// <param name="ctx"></param>
|
||||||
|
/// <param name="callback"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static Int32 ExecuteSql(SqlSection[] sections, JobContext ctx)
|
public static Int32 ExecuteSql(SqlSection[] sections, JobContext ctx, Action<SqlSection, DbTable> callback = null)
|
||||||
{
|
{
|
||||||
if (sections == null || sections.Length == 0) return -1;
|
if (sections == null || sections.Length == 0) return -1;
|
||||||
|
|
||||||
|
@ -62,19 +65,23 @@ namespace AntJob
|
||||||
{
|
{
|
||||||
// 按顺序执行处理Sql语句
|
// 按顺序执行处理Sql语句
|
||||||
DbTable dt = null;
|
DbTable dt = null;
|
||||||
foreach (var item in sections)
|
foreach (var section in sections)
|
||||||
{
|
{
|
||||||
switch (item.Action)
|
switch (section.Action)
|
||||||
{
|
{
|
||||||
case SqlActions.Query:
|
case SqlActions.Query:
|
||||||
dt = item.Query();
|
dt = section.Query();
|
||||||
if (dt != null) ctx.Total += dt.Rows.Count;
|
if (dt != null) ctx.Total += dt.Rows.Count;
|
||||||
|
|
||||||
|
// 处理生产消息
|
||||||
|
callback?.Invoke(section, dt);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case SqlActions.Execute:
|
case SqlActions.Execute:
|
||||||
rs += item.Execute();
|
rs += section.Execute();
|
||||||
break;
|
break;
|
||||||
case SqlActions.Insert:
|
case SqlActions.Insert:
|
||||||
rs += item.BatchInsert(dt);
|
rs += section.BatchInsert(dt);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
using System;
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading;
|
||||||
using AntJob.Data;
|
using AntJob.Data;
|
||||||
using AntJob.Extensions;
|
using AntJob.Extensions;
|
||||||
using AntJob.Handlers;
|
using AntJob.Handlers;
|
||||||
|
using AntJob.Providers;
|
||||||
using NewLife.Data;
|
using NewLife.Data;
|
||||||
using XCode.DataAccessLayer;
|
|
||||||
|
|
||||||
namespace AntJob
|
namespace AntJob
|
||||||
{
|
{
|
||||||
|
@ -15,14 +17,7 @@ namespace AntJob
|
||||||
{
|
{
|
||||||
#region 构造
|
#region 构造
|
||||||
/// <summary>实例化</summary>
|
/// <summary>实例化</summary>
|
||||||
public SqlMessage()
|
public SqlMessage() => Topic = "Sql";//Mode = JobModes.Message;//var job = Job;//job.BatchSize = 8;
|
||||||
{
|
|
||||||
Topic = "Sql";
|
|
||||||
//Mode = JobModes.Message;
|
|
||||||
|
|
||||||
//var job = Job;
|
|
||||||
//job.BatchSize = 8;
|
|
||||||
}
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
/// <summary>根据解码后的消息执行任务</summary>
|
/// <summary>根据解码后的消息执行任务</summary>
|
||||||
|
@ -36,12 +31,35 @@ namespace AntJob
|
||||||
// 向调度中心返回解析后的Sql语句
|
// 向调度中心返回解析后的Sql语句
|
||||||
ctx.Remark = sqls;
|
ctx.Remark = sqls;
|
||||||
|
|
||||||
|
// 分解Sql语句得到片段数组
|
||||||
var sections = SqlSection.ParseAll(sqls);
|
var sections = SqlSection.ParseAll(sqls);
|
||||||
if (sections.Length == 0) return -1;
|
if (sections.Length == 0) return -1;
|
||||||
|
|
||||||
var rs = SqlHandler.ExecuteSql(sections, ctx);
|
// 依次执行Sql片段数组。遇到query时,可能需要生产消息
|
||||||
|
var rs = SqlHandler.ExecuteSql(sections, ctx, (section, dt) => ProcessMessage(dt, ctx));
|
||||||
|
|
||||||
return rs;
|
return rs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal static void ProcessMessage(DbTable dt, JobContext ctx)
|
||||||
|
{
|
||||||
|
if (dt == null || dt.Columns == null || dt.Columns.Length == 0 || dt.Rows == null || dt.Rows.Count == 0) return;
|
||||||
|
|
||||||
|
// select id as topic_roleId, id as topic_myId from role where updatetime>='{Start}' and updatetime<'{End}'
|
||||||
|
|
||||||
|
for (var i = 0; i < dt.Columns.Length; i++)
|
||||||
|
{
|
||||||
|
var col = dt.Columns[i];
|
||||||
|
if (col.StartsWithIgnoreCase("topic_"))
|
||||||
|
{
|
||||||
|
var topic = col.Substring("topic_".Length);
|
||||||
|
var messages = dt.Rows.Select(e => "{0}".F(e[i])).Distinct().ToArray();
|
||||||
|
if (messages.Length > 0)
|
||||||
|
{
|
||||||
|
ctx.Handler.Produce(topic, messages, new MessageOption { Unique = true });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -45,11 +45,20 @@ namespace AntJob.Extensions
|
||||||
|
|
||||||
// 两个换行隔开片段
|
// 两个换行隔开片段
|
||||||
var ss = sqls.Split(new[] { "\r\n\r", "\r\r", "\n\n" }, StringSplitOptions.RemoveEmptyEntries);
|
var ss = sqls.Split(new[] { "\r\n\r", "\r\r", "\n\n" }, StringSplitOptions.RemoveEmptyEntries);
|
||||||
|
var connName = "";
|
||||||
foreach (var item in ss)
|
foreach (var item in ss)
|
||||||
{
|
{
|
||||||
var section = new SqlSection();
|
var section = new SqlSection();
|
||||||
section.Parse(item);
|
section.Parse(item);
|
||||||
|
|
||||||
|
// 如果当前片段未指定连接名,则使用上一个
|
||||||
|
if (section.ConnName.IsNullOrEmpty())
|
||||||
|
section.ConnName = connName;
|
||||||
|
else
|
||||||
|
connName = section.ConnName;
|
||||||
|
|
||||||
|
if (section.ConnName.IsNullOrEmpty()) throw new Exception("未指定连接名!");
|
||||||
|
|
||||||
list.Add(section);
|
list.Add(section);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,15 @@
|
||||||
var fields = ViewBag.Fields as IList<FieldItem>;
|
var fields = ViewBag.Fields as IList<FieldItem>;
|
||||||
var set = ViewBag.PageSetting as PageSetting;
|
var set = ViewBag.PageSetting as PageSetting;
|
||||||
}
|
}
|
||||||
|
<style>
|
||||||
|
|
||||||
|
.OverFlow {
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
max-width: 400px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
<table class="table table-bordered table-hover table-striped table-condensed">
|
<table class="table table-bordered table-hover table-striped table-condensed">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
|
@ -20,6 +29,7 @@
|
||||||
<th class="text-center"><a href="@Html.Raw(page.GetSortUrl("AppID"))">应用</a></th>
|
<th class="text-center"><a href="@Html.Raw(page.GetSortUrl("AppID"))">应用</a></th>
|
||||||
<th class="text-center"><a href="@Html.Raw(page.GetSortUrl("JobID"))">作业</a></th>
|
<th class="text-center"><a href="@Html.Raw(page.GetSortUrl("JobID"))">作业</a></th>
|
||||||
<th class="text-center" title="主题。区分作业下多种资源"><a href="@Html.Raw(page.GetSortUrl("Topic"))">主题</a></th>
|
<th class="text-center" title="主题。区分作业下多种资源"><a href="@Html.Raw(page.GetSortUrl("Topic"))">主题</a></th>
|
||||||
|
<th class="text-center">内容</th>
|
||||||
<th class="text-center" style="min-width:134px;"><a href="@Html.Raw(page.GetSortUrl("CreateTime"))">创建时间</a></th>
|
<th class="text-center" style="min-width:134px;"><a href="@Html.Raw(page.GetSortUrl("CreateTime"))">创建时间</a></th>
|
||||||
<th class="text-center" style="min-width:134px;"><a href="@Html.Raw(page.GetSortUrl("UpdateTime"))">更新时间</a></th>
|
<th class="text-center" style="min-width:134px;"><a href="@Html.Raw(page.GetSortUrl("UpdateTime"))">更新时间</a></th>
|
||||||
@if (this.Has(PermissionFlags.Detail, PermissionFlags.Update, PermissionFlags.Delete))
|
@if (this.Has(PermissionFlags.Detail, PermissionFlags.Update, PermissionFlags.Delete))
|
||||||
|
@ -40,6 +50,7 @@
|
||||||
<td><a href="App?ID=@entity.AppID">@entity.AppName</a></td>
|
<td><a href="App?ID=@entity.AppID">@entity.AppName</a></td>
|
||||||
<td><a href="Job?ID=@entity.JobID">@entity.JobName</a></td>
|
<td><a href="Job?ID=@entity.JobID">@entity.JobName</a></td>
|
||||||
<td>@entity.Topic</td>
|
<td>@entity.Topic</td>
|
||||||
|
<td class="OverFlow" title="@entity.Data">@entity.Data</td>
|
||||||
<td>@entity.CreateTime.ToFullString("")</td>
|
<td>@entity.CreateTime.ToFullString("")</td>
|
||||||
<td>@entity.UpdateTime.ToFullString("")</td>
|
<td>@entity.UpdateTime.ToFullString("")</td>
|
||||||
@if (this.Has(PermissionFlags.Detail, PermissionFlags.Update, PermissionFlags.Delete))
|
@if (this.Has(PermissionFlags.Detail, PermissionFlags.Update, PermissionFlags.Delete))
|
||||||
|
|
Loading…
Reference in New Issue