调用 amazonSQS.deleteMessage(queueURL,receiptHandle)

问题描述

我正在开发一个应用程序,我通过 Apache Camel 连接到 SQS 队列,该应用程序只需要 AmazonSQS 客户端(我找不到 Camel + AWS SDK 和 Java 2.x 的任何引用)作为参数作为 SQS 队列的一部分网址。

作为同一个应用程序的一部分,我在 SQS 中执行不同的操作,其中之一是删除消息。使用 AmazonSQS.delete(queueURL,receiptHanlde) 从 AWS SQS 队列中删除消息时。下面是同样抛出的异常。但是,该消息正在从队列中删除。看起来它正在尝试在删除消息并失败后解析响应。

请建议如何解决异常。

com.amazonaws.SdkClientException: 无法解组响应 (ParseError at [row,col]:[1,1] 消息:序言中不允许使用内容。)。响应代码:200,响应文本: 在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleResponse(AmazonHttpClient.java:1681) 在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleSuccessResponse(AmazonHttpClient.java:1422) 在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1344) 在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1127) 在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:784) 在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:752) 在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:726) 在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:686) 在 com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:668) 在 com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:532) 在 com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:512) 在 com.amazonaws.services.sqs.AmazonSQSClient.doInvoke(AmazonSQSClient.java:2207) 在 com.amazonaws.services.sqs.AmazonSQSClient.invoke(AmazonSQSClient.java:2174) 在 com.amazonaws.services.sqs.AmazonSQSClient.invoke(AmazonSQSClient.java:2163) 在 com.amazonaws.services.sqs.AmazonSQSClient.executeDeleteMessage(AmazonSQSClient.java:893) 在 com.amazonaws.services.sqs.AmazonSQSClient.deleteMessage(AmazonSQSClient.java:865) 在 com.orchestrator.api.processor.BenefitFocusSoldCaseProcessor.soldCaseProcess(BenefitFocusSoldCaseProcessor.java:72) 在 com.orchestrator.api.processor.BenefitFocusSoldCaseProcessor.process(BenefitFocusSoldCaseProcessor.java:35) 在 org.apache.camel.support.processor.DelegateSyncProcessor.process(DelegateSyncProcessor.java:66) 在 org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$SimpleTask.run(RedeliveryErrorHandler.java:395) 在 org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:148) 在 org.apache.camel.impl.engine.DefaultReactiveExecutor.scheduleMain(DefaultReactiveExecutor.java:60) 在 org.apache.camel.processor.Pipeline.process(Pipeline.java:147) 在 org.apache.camel.impl.engine.CamelInternalProcessor.process(CamelInternalProcessor.java:312) 在 org.apache.camel.component.aws.sqs.SqsConsumer.processBatch(SqsConsumer.java:213) 在 org.apache.camel.component.aws.sqs.SqsConsumer.poll(SqsConsumer.java:111) 在 org.apache.camel.support.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:190) 在 org.apache.camel.support.ScheduledPollConsumer.run(ScheduledPollConsumer.java:107) 在 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 在 java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) 在 java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) 在 java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 在 java.lang.Thread.run(Thread.java:748) 引起:javax.xml.stream.XMLStreamException: ParseError at [row,1] 消息:序言中不允许使用内容。 在 com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:604) 在 com.sun.xml.internal.stream.XMLEventReaderImpl.peek(XMLEventReaderImpl.java:276) 在 com.amazonaws.transform.StaxUnmarshallerContext.nextEvent(StaxUnmarshallerContext.java:220) 在 com.amazonaws.services.sqs.model.transform.DeleteMessageResultStaxUnmarshaller.unmarshall(DeleteMessageResultStaxUnmarshaller.java:40) 在 com.amazonaws.services.sqs.model.transform.DeleteMessageResultStaxUnmarshaller.unmarshall(DeleteMessageResultStaxUnmarshaller.java:28) 在 com.amazonaws.http.StaxResponseHandler.handle(StaxResponseHandler.java:106) 在 com.amazonaws.http.StaxResponseHandler.handle(StaxResponseHandler.java:42) 在 com.amazonaws.http.response.AwsResponseHandlerAdapter.handle(AwsResponseHandlerAdapter.java:69) 在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleResponse(AmazonHttpClient.java:1657) ... 34个

解决方法

您使用的是 V1,即 com.amazonaws.services.sqs.AmazonSQSClient

亚马逊建议使用适用于 Java 2.x 的 AWS 开发工具包,这是对构建在 Java 8+ 之上的 1.11.x 代码库的重大重写。 Java SDK 2.x 改进了一致性、易用性和强执行的不变性。它还支持非阻塞 I/O,并能够在运行时插入不同的 HTTP 实现

您可以在此处找到此用例的 V2 示例。

https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/javav2/example_code/sqs/src/main/java/com/example/sqs/SQSExample.java

如果您不熟悉适用于 Java V2 的 AWS 开发工具包,我是否建议您阅读此文档:

Get started with the AWS SDK for Java 2.x

刚刚测试了该代码示例,它可以正常工作。