refactor:add command factory to handle the request from server and impl some command executor ,need to be improve

develop
Xuanye Wong 11 months ago
parent f2e8231d9d
commit 1e7dd0f239
  1. 19
      src/DotXxlJob.Core/CommandExecutors/BeatCommandExecutor.cs
  2. 30
      src/DotXxlJob.Core/CommandExecutors/IdleBeatCommandExecutor.cs
  3. 29
      src/DotXxlJob.Core/CommandExecutors/KillCommandExecutor.cs
  4. 29
      src/DotXxlJob.Core/CommandExecutors/TriggerCommandExecutor.cs
  5. 4
      src/DotXxlJob.Core/DotXxlJob.Core.csproj
  6. 17
      src/DotXxlJob.Core/ICommandExecutor.cs
  7. 10
      src/DotXxlJob.Core/ICommandExecutorFactory.cs
  8. 18
      src/DotXxlJob.Core/ISerializer.cs
  9. 39
      src/DotXxlJob.Core/Internal/TextJsonSerializer.cs
  10. 40
      src/DotXxlJob.Core/Models/ExecutorResult.cs
  11. 14
      src/DotXxlJob.Core/Models/IdleBeatCommand.cs
  12. 14
      src/DotXxlJob.Core/Models/KillCommand.cs
  13. 46
      src/DotXxlJob.Core/Models/TriggerCommand.cs

@ -0,0 +1,19 @@
// Copyright (c) Xuanye Wong. All rights reserved.
// Licensed under MIT license
using DotXxlJob.Core.Models;
using System.Threading;
using System.Threading.Tasks;
namespace DotXxlJob.Core.CommandExecutors
{
public class BeatCommandExecutor:ICommandExecutor
{
public string CommandName => "Beat";
public Task<ExecutorResult> ExecuteAsync(byte[] payload,CancellationToken cancellationToken = default)
{
return Task.FromResult(ExecutorResult.Success());
}
}
}

@ -0,0 +1,30 @@
// Copyright (c) Xuanye Wong. All rights reserved.
// Licensed under MIT license
using DotXxlJob.Core.Models;
using System.Threading;
using System.Threading.Tasks;
namespace DotXxlJob.Core.CommandExecutors
{
public class IdleBeatCommandExecutor:ICommandExecutor
{
private readonly ISerializer _serializer;
public IdleBeatCommandExecutor(ISerializer serializer)
{
_serializer = serializer;
}
public string CommandName => "IdleBeat";
public Task<ExecutorResult> ExecuteAsync(byte[] payload,CancellationToken cancellationToken = default)
{
var idleBeat = _serializer.Deserialize<IdleBeatCommand>(payload);
if (idleBeat == null)
{
return Task.FromResult(ExecutorResult.Failure("Command[IdleBrat],parameter is empty"));
}
throw new System.NotImplementedException();
}
}
}

@ -0,0 +1,29 @@
// Copyright (c) Xuanye Wong. All rights reserved.
// Licensed under MIT license
using DotXxlJob.Core.Models;
using System.Threading;
using System.Threading.Tasks;
namespace DotXxlJob.Core.CommandExecutors
{
public class KillCommandExecutor: ICommandExecutor
{
private readonly ISerializer _serializer;
public KillCommandExecutor(ISerializer serializer)
{
_serializer = serializer;
}
public string CommandName => "kill";
public Task<ExecutorResult> ExecuteAsync(byte[] payload, CancellationToken cancellationToken)
{
var command = _serializer.Deserialize<IdleBeatCommand>(payload);
if (command == null)
{
return Task.FromResult(ExecutorResult.Failure("Command[Kill],parameter is empty"));
}
throw new System.NotImplementedException();
}
}
}

@ -0,0 +1,29 @@
// Copyright (c) Xuanye Wong. All rights reserved.
// Licensed under MIT license
using DotXxlJob.Core.Models;
using System.Threading;
using System.Threading.Tasks;
namespace DotXxlJob.Core.CommandExecutors
{
public class TriggerCommandExecutor: ICommandExecutor
{
private readonly ISerializer _serializer;
public TriggerCommandExecutor(ISerializer serializer)
{
_serializer = serializer;
}
public string CommandName => "Run";
public Task<ExecutorResult> ExecuteAsync(byte[] payload, CancellationToken cancellationToken)
{
var command = _serializer.Deserialize<TriggerCommand>(payload);
if (command== null)
{
return Task.FromResult(ExecutorResult.Failure("command[run],parameter is empty"));
}
throw new System.NotImplementedException();
}
}
}

@ -5,4 +5,8 @@
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<PackageReference Include="System.Text.Json" Version="8.0.5" />
</ItemGroup>
</Project> </Project>

@ -0,0 +1,17 @@
// Copyright (c) Xuanye Wong. All rights reserved.
// Licensed under MIT license
using DotXxlJob.Core.Models;
using System.Threading;
using System.Threading.Tasks;
namespace DotXxlJob.Core
{
public interface ICommandExecutor
{
string CommandName { get; }
Task<ExecutorResult> ExecuteAsync(byte[] payload,CancellationToken cancellationToken);
}
}

@ -0,0 +1,10 @@
// Copyright (c) Xuanye Wong. All rights reserved.
// Licensed under MIT license
namespace DotXxlJob.Core
{
public interface ICommandExecutorFactory
{
ICommandExecutor GetCommandExecutor(string commandName);
}
}

@ -0,0 +1,18 @@
// Copyright (c) Xuanye Wong. All rights reserved.
// Licensed under MIT license
using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
namespace DotXxlJob.Core
{
public interface ISerializer
{
T? Deserialize<T>(byte[] data) where T : class;
byte[] Serialize<T>(T item) where T : class;
object? Deserialize(byte[] data,Type type);
byte[] Serialize(object item,Type type);
}
}

@ -0,0 +1,39 @@
// Copyright (c) Xuanye Wong. All rights reserved.
// Licensed under MIT license
using System;
using System.IO;
using System.Text;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
namespace DotXxlJob.Core.Internal
{
public class TextJsonSerializer:ISerializer
{
public T? Deserialize<T>(byte[] data) where T : class
{
var json = Encoding.UTF8.GetString(data);
return JsonSerializer.Deserialize<T>(json);
}
public byte[] Serialize<T>(T item) where T : class
{
return JsonSerializer.SerializeToUtf8Bytes(item);
}
public object? Deserialize(byte[] data, Type type)
{
var json = Encoding.UTF8.GetString(data);
return JsonSerializer.Deserialize(json,type);
}
public byte[] Serialize(object item,Type type)
{
return JsonSerializer.SerializeToUtf8Bytes(item);
}
}
}

@ -0,0 +1,40 @@
// Copyright (c) Xuanye Wong. All rights reserved.
// Licensed under MIT license
using System.Runtime.Serialization;
namespace DotXxlJob.Core.Models
{
public class ExecutorResult
{
protected const int SUCCESS_CODE = 200;
protected const int FAILURE_CODE = 500;
protected const int TIMEOUT_CODE = 502;
[DataMember(Name = "code",Order = 1)]
public int Code { get; set; }
[DataMember(Name = "msg",Order = 2)]
public string? Message { get; set; }
public static ExecutorResult Success(string message="")
{
return new ExecutorResult(){Code = SUCCESS_CODE, Message = message};
}
public static ExecutorResult Failure(string message)
{
return new ExecutorResult(){Code = FAILURE_CODE, Message = message};
}
}
public class ExecutorResult<T> : ExecutorResult where T : class
{
[DataMember(Name = "content",Order = 3)]
public T Data { get; set; } = default!;
public static ExecutorResult Success(string message, T data)
{
return new ExecutorResult<T>(){Code = SUCCESS_CODE, Message = message,Data = data};
}
}
}

@ -0,0 +1,14 @@
// Copyright (c) Xuanye Wong. All rights reserved.
// Licensed under MIT license
using System.Runtime.Serialization;
namespace DotXxlJob.Core.Models
{
[DataContract]
public class IdleBeatCommand
{
[DataMember(Name = "jobId", Order = 1)]
public int JobId { get; set; }
}
}

@ -0,0 +1,14 @@
// Copyright (c) Xuanye Wong. All rights reserved.
// Licensed under MIT license
using System.Runtime.Serialization;
namespace DotXxlJob.Core.Models
{
[DataContract]
public class KillCommand
{
[DataMember(Name = "jobId", Order = 1)]
public int JobId { get; set; }
}
}

@ -0,0 +1,46 @@
// Copyright (c) Xuanye Wong. All rights reserved.
// Licensed under MIT license
using System.Runtime.Serialization;
namespace DotXxlJob.Core.Models
{
[DataContract]
public class TriggerCommand
{
[DataMember(Name = "jobId", Order = 1)]
public int JobId { get; set; }
[DataMember(Name = "executorHandler", Order = 2)]
public string ExecutorHandler { get; set; } = null!;
[DataMember(Name = "executorParams", Order = 3)]
public string ExecutorParams{ get; set; } = null!;
[DataMember(Name = "executorBlockStrategy", Order = 4)]
public string ExecutorBlockStrategy{ get; set; }= null!;
[DataMember(Name = "executorTimeout", Order = 5)]
public int ExecutorTimeout{ get; set; }
[DataMember(Name = "logId",Order = 5)]
public long LogId { get; set; }
[DataMember(Name = "logDateTime", Order = 6)]
public long LogDateTime{ get; set; }
[DataMember(Name = "glueType",Order = 7)]
public string? GlueType{ get; set; }
[DataMember(Name = "glueSource",Order = 8)]
public string? GlueSource{ get; set; }
[DataMember(Name = "glueUpdatetime", Order = 9)]
public long GlueUpdateTime{ get; set; }
[DataMember(Name = "broadcastIndex",Order = 10)]
public int BroadcastIndex{ get; set; }
[DataMember(Name = "broadcastTotal",Order = 11)]
public int BroadcastTotal{ get; set; }
}
}
Loading…
Cancel
Save