mirth - HTTP Sender 和 REST 约定
问题描述
我正在编写一个 C# Web API 服务器应用程序,并将通过 Mirth HTTP Sender 目标向它发送 JSON。这篇文章是关于如何处理错误情况的。具体来说,我要处理三种情况:
- 有时我们为了系统升级或维护,让 C# 应用服务器短时间离线,Mirth 根本无法连接。我希望 Mirth 将所有消息按顺序排列,当服务器可用时,按接收顺序处理它们。
- 服务器接收到请求,但由于请求的内容有问题(例如缺少必填字段)而拒绝了它。根据 REST 约定,服务器将返回 400 级 HTTP 响应。此消息每次提交都会被拒绝,因此不应重新发送;只需记录失败并继续下一条消息。
- 服务器收到请求,但服务器出现问题,服务器返回 HTTP 500 Server Error 响应。这将是适当的响应,例如,当服务器环境中出现问题时。一个真实的例子是 Web API 服务器正在运行,但有人重新启动了数据库服务器。REST 约定建议我们继续重新发送消息,直到暂时性问题得到解决。
对于#1,最初我让它在失败/总是排队,但似乎响应转换器从未针对排队的消息运行(至少,调试语句从未显示在日志中)。我已关闭排队,并将其设置为每十秒重试一个小时,这似乎给出了所需的行为。我是在正确的轨道上,还是错过了什么?
对于 #2 和 #3,返回任何 HTTP 400 或 500 错误会调用 1 小时重试。我想要的是对 500 个错误应用 1 小时重试,而不是 400 个错误。我已经responseStatus = SENT
在响应转换器中尝试过,但是响应转换器只运行一次,在一小时过后,而不是每次重试。
这似乎是一个常见问题,但我没有找到解决方案。你们其他人是如何处理这个问题的?
解决方案
你很近!
因此,默认情况下,响应转换器仅在有要转换的响应负载时才会运行。对于连接问题,或者可能对于不包含有效负载的 4xx/5xx 响应,响应转换器将不会执行。
但是,如果您将响应数据类型(从 Summary -> Set Data Types 对话框,或从 Destinations -> Edit Response,Message Templates 选项卡)设置为 Raw,则响应转换器将一直执行。原因是原始数据类型甚至认为空有效负载是“可转换的”。
因此,重新打开排队,并将您的响应数据类型设置为 Raw。然后在响应转换器中,如果您查看 Reference 选项卡,则会有一个 HTTP Sender 类别:
您需要“响应状态行”,即包含响应代码的响应的“HTTP/1.1 200 OK”行。这是一个响应转换器脚本,它强制 4xx 响应错误:
if (responseStatus == QUEUED) {
var statusLine = $('responseStatusLine');
if (statusLine) {
var parts = statusLine.split(' ');
if (parts.length >= 2) {
var responseCode = parseInt(parts[1], 10);
// Force 4xx responses to error
if (responseCode >= 400 && responseCode < 500) {
responseStatus = ERROR;
responseStatusMessage = statusLine;
}
}
}
}
推荐阅读
- c# - 替换完全匹配的字符串
- c++ - 如何在 C++ 中将迭代器作为函数参数传递
- token - 如何仅使用 OAuth 访问令牌将 ibm watson 聊天机器人与 slack 集成
- c++ - MinGW 的“-fno-elide-constructors”的类似物是什么?
- mediawiki - 具有多个表达式的 mediawiki api 搜索查询
- java - 在枚举中实现 Runnable
- django - 如何在Django rest框架中嵌套抽象关系?
- regex - 如何在 PowerShell 中使用带有正则表达式的条件语句?
- embedded-linux - 嵌入式 Linux 的启动卡住了。如何调试?
- android - 如何获取文档 ID?Firestore 分页