- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在下一个设计中遇到了问题:
当我在我的 SQS 订阅者中接收消息时,消息的模型是错误的,例如:
{
"Type" : "Notification",
"MessageId" : "7a6789f0-02f0-5ed3-8a11-deebcd08f145",
"TopicArn" : "arn:aws:sns:us-east-2:167186109795:name_sns_topic",
"Message" : "My JSON message",
"Timestamp" : "1987-04-23T17:17:44.897Z",
"SignatureVersion" : "1",
"Signature" : "string",
"SigningCertURL" : "url",
"UnsubscribeURL" : "url",
"MessageAttributes" : {
"X-Header1" : {"Type":"String","Value":"value1"},
"X-Header2" : {"Type":"String","Value":"value2"},
"X-Header3" : {"Type":"String","Value":"value3"},
"X-HeaderN" : {"Type":"String","Value":"value4"}
}
}
从SQS接收消息的常用模型应该是:
{
"Records": [
{
"messageId": "19dd0b57-b21e-4ac1-bd88-01bbb068cb78",
"receiptHandle": "MessageReceiptHandle",
"body": "Hello from SQS!",
"attributes": {
"ApproximateReceiveCount": "1",
"SentTimestamp": "1523232000000",
"SenderId": "123456789012",
"ApproximateFirstReceiveTimestamp": "1523232000001"
},
"messageAttributes": {},
"md5OfBody": "7b270e59b47ff90a553787216d55d91d",
"eventSource": "aws:sqs",
"eventSourceARN": "arn:{partition}:sqs:{region}:123456789012:MyQueue",
"awsRegion": "{region}"
}
]
}
在我的处理程序中,Java Lambda(示例代码)抛出异常,因为接收到的消息的结构不是 SQS 事件:
public class MyHandler implements RequestHandler<SQSEvent, String> {
@Override
public String handleRequest(SQSEvent event, Context context) {
LambdaLogger logger = context.getLogger();
for (SQSEvent.SQSMessage msg : event.getRecords()) {
logger.log("SQS message body: " + msg.getBody());
logger.log("Get attributes: " + msg.getMessageAttributes().toString());
msg.getMessageAttributes()
.forEach(
(k, v) -> {
logger.log("key: " + k + "value: " + v.getStringValue());
});
}
return "Successful";
}
}
How can I do for handle the message thats its receiving ?
最佳答案
在我看来,这并没有得到很好的记录,但一旦你弄明白了,它也不错。
第一件事是我不使用预定义的 Lambda 对象。我将所有内容读入一个字符串并从那里获取。所以我的 Lamda 函数的基础是:
public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
// copy InputStream to String, avoiding 3rd party libraries
ByteArrayOutputStream result = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) != -1) {
result.write(buffer, 0, length);
}
String jsonString = result.toString();
}
当您从 SNS“直接”到 Lambda 时,消息看起来像这样(为了长度而删除了一些字段):
{
"Records": [
{
"EventSource": "aws:sns",
"EventVersion": "1.0",
"Sns": {
"Type": "Notification",
"Subject": "the message subject",
"Message": "{\"message\": \"this is the message\", \"value\": 100}",
"Timestamp": "2020-04-24T21:44:28.220Z",
"SignatureVersion": "1"
}
}
]
}
我发送了一条包含两个简单字段的 JSON 格式的测试消息。使用 JsonPath读取所有内容中的“消息”字段:
String snsMessage = JsonPath.read(jsonString, "$.Records[0].Sns.Message");
String realMessage = JsonPath.read(snsMessage, "$.message");
但是当它进入 SNS -> SQS -> Lambda(或者实际上任何 SNS -> SQS 路径)时,SNS 消息现在大部分被包装并在 SQS 消息中转义:
{
"Records": [
{
"messageId": "ca8c53e5-8417-4479-a720-d4ecf970ca68",
"body": "{\n \"Type\" : \"Notification\",\n \"Subject\" : \"the message subject\",\n \"Message\" : \"{\\\"message\\\": \\\"this is the message\\\", \\\"value\\\": 100}\"\n}",
"attributes": {
"ApproximateReceiveCount": "1"
},
"md5OfBody": "6a4840230aca6a7bf7934bf191a529b8",
"eventSource": "aws:sqs"
}
]
}
所以在这种情况下,该值位于 Records[0].body
中,但它包含另一个 JSON 对象。我承认可能有更简单的方法,但从我发现的情况来看,我必须解析 3 次:
String sqsBody = <as read in lambda>;
String recordBody = JsonPath.read(sqsBody, "$.Records[0].body");
String internalMessage = JsonPath.read(recordBody, "$.Message");
// now read out of the sns message
String theSnsMessage = JsonPath.read(message, "$.message");
关于amazon-web-services - 从 SNS 主题订阅时出现错误的 SQS AWS 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61410478/
我在 lambda 中有以下代码: entries = [ { "Id": str(index), "MessageAttribut
我正在构建一个无服务器应用程序,它在资源中定义了一个 SQS 队列,如下所示: resources: Resources: TheQueue: Type: "AWS:SQS:Q
我正在使用无服务器框架来使用来自 SQS 的消息。一些发送到队列的消息不会被消费。他们直接进入飞行中的 SQS 状态,然后从那里进入我的死信队列。当我查看我的消费者日志时,我可以看到它消费并成功处理了
我们的亚马逊 SQS 队列没有收到来自亚马逊 MWS 的 AnyOfferChanged 通知消息。 我们发送一个测试通知,当我们收到通知时,它会被发送到队列并可用。 我们已经设置了两个 AWS 账户
我想知道最后一条消息何时发布到 SQS 队列。 查看队列属性(通过 CLI 或其他方式),我看不到任何合适的内容 - 只能看到队列属性最后一次修改的时间。 如果有什么技巧可以找到这个(在不了解客户的情
我正在使用无服务器框架来使用来自 SQS 的消息。一些发送到队列的消息不会被消费。他们直接进入飞行中的 SQS 状态,然后从那里进入我的死信队列。当我查看我的消费者日志时,我可以看到它消费并成功处理了
我们的亚马逊 SQS 队列没有收到来自亚马逊 MWS 的 AnyOfferChanged 通知消息。 我们发送一个测试通知,当我们收到通知时,它会被发送到队列并可用。 我们已经设置了两个 AWS 账户
我正在使用 Amazon SQS 队列向外部系统发送通知。 如果使用 SQS 时 HTTP 请求失败 SendMessage ,我不知道消息是否已排队。我的默认策略是重试将消息发布到队列,但存在两次发
来自 SNS FAQ ,我知道 SNS 到 SQS 有重试策略,但是他们是否保证至少向 SQS 传递一条消息? 请给官方报价。 最佳答案 见 https://aws.amazon.com/sqs/fa
我是否可以使用 Amazon PHP SDK 根据消息 ID 从 SQS 队列中获取消息?我是否必须获取队列中的所有消息,然后在我的服务器上对其进行过滤? 我的服务器收到一个带有队列消息 ID 的 S
我意外删除了 Amazon SQS 中的队列。有没有办法检索/撤消删除? 最佳答案 不,队列(以及队列上的任何消息)将永远消失。 如果您使用相同名称重新创建队列,它将保留相同的 ARN 和 URL。希
我的大多数 Celery 任务的 ETA 都长于 Amazon SQS 定义的最大可见性超时。 celery documentation说: This causes problems with ETA
我正在实现 SQS fifo 队列。我必须使用 cloudformation 模板来实现。 当我放大推送时,我得到 错误API:sqs:CreateQueue 对资源 https://sqs.us-e
我有一个代码,我需要将消息发送到现有的 sqs 队列。 我在 aws-cdk 中有这段代码。但这是行不通的。没有添加访问权限。 const sqsQ = sqs.Queue.fromQueueArn(
我很想了解 GCP 的 PubSub 的实现。尽管 Pubsub 似乎指向遵循发布-订阅设计模式,但它似乎比 AWS SNS(使用发布-订阅模型)更接近 AWS 的 SQS(队列)。为什么认为这是,G
序言:我正在尝试为我认为是一个非常常见的用例提出一个建议,我想使用 Amazon 的 SWF 和 SQS 来实现我的目标。可能还有其他服务可以更好地匹配我正在尝试做的事情,因此,如果您有任何建议,请随
AWS SQS 是否可以通过某种方式调用我的 REST API?基本上,一旦消息被推送到 AWS SQS,我就想听到它并执行所需的操作。我可以安排一个每秒可以提取消息的监听器,但这不是一个优化解决方案
我已配置 SQS 监听器来使用消息列表中的消息,但一次只收到一条消息,并收到错误,因为无法将 model.StudentData 转换为 java.util.ArrayList 的实例 我的代码是:-
使用 Amazon Simple Queue Service 发送消息需要多长时间? 另外,我想知道在 Amazon SQS 中一分钟内会发送多少条消息? 最佳答案 截至 2007 年,at leas
我正在使用 Amazon-SQS,我尝试从队列中检索大约数量的属性,但响应为空 我正在使用 C# 以下是代码: GetQueueAttributesRequest attReq = new GetQu
我是一名优秀的程序员,十分优秀!