我正在构建基于asp.net MVC的BPM,我正在开发两个系统: -
第三方BPM。
我自己的BPM系统。
目前,当我添加新流程时,我正在执行以下操作: -
但我面临以下问题: -
我的流程模型类是: -
public class newprocess
{
public string name { get; set; }
public string activityId { get; set; }
public string Status {get; set;}
}
我的行动方法是: -
[HttpPost]
public ActionResult CreateProcess(string name) {
using (var client = new WebClient())
{
try
{
repository.CreateProcess(name,"Pending");
repository.save();
var query = HttpUtility.ParseQueryString(string.Empty);
query["j_username"] = "kermit";
query["hash"] = "9449B5ABCFA9AFDA36B801351ED3DF66";
query["loginAs"] = User.Identity.Name;
var url = new UriBuilder("http://localhost:8080/jw/web/json/Process/create/" + name.ToString() );
url.Query = query.ToString();
string json = client.DownloadString(url.ToString());
var serializer = new JavaScriptSerializer();
var myObject = serializer.Deserialize<newprocess>(json);
string activityid = myObject.activityId;
if (activityid != null)
{
repository.UpdateProcess(name, "Finish");
repository.save();
}
所以我在POST动作方法中所做的是: -
我的方法也会运作良好,否则会产生我不知道的问题。或者我应该寻找一种完全不同的方法
提前感谢您的帮助。
答案 0 :(得分:1)
方向看起来不错。但请记住完成周期并考虑更多选项
根据您的陈述“我在做什么”
1在我的数据库中创建一个状态为“pending”的新记录。
2调用第三方API,并获得结果。
3如果ActivityID不为null(第三方系统中的创建成功),我将记录状态更新为“完成”。否则状态将保持未决状态。
4我已经构建了一个显示状态为“pending”的所有记录的屏幕,管理员可以从我自己的数据库中删除它们。
您已经涵盖了2阶段提交的主要概念。如果一切顺利,这将没事。 但你也应该考虑。
调查是否仅从理论的角度来看“可靠的消息传递”。 在这里可能有点矫枉过正。
如果您的待完成更改提交失败,会发生什么? 你如何恢复这种情况。 删除其他条目?或者重试你的。
当对方根本无法访问时,您还应该考虑基本模式/计划是什么。接受帖子,将许多记录为待处理,并有一个稍后重试待处理记录的进程。或者只是失败所有新呼叫,直到可以访问另一方。 至少要考虑非完美的世界情景并制定计划。
这是基本模式。手动完成其中一些操作是可以的。这是一个计划,是一种有效的模式。 当然,您可以添加工具和逻辑来帮助支持此功能。 例如错误处理,自动重试模式。异步确认等 但这是将它带到企业级别。以企业成本。
基本上如果采取立场,ONE系统负责整体完整性和持续同步。这是最好的起点。你有。您的系统是Orchestrator,负责同步结果。