【问题标题】:Camel SQS unmarshalCamel SQS 解组
【发布时间】:2018-09-07 04:21:46
【问题描述】:

我有一个非常简单的骆驼路由器,它使用 SQS 和 base64 解码:

 from("aws-sqs://test-camel-start?amazonSQSClient=#sqsClient&concurrentConsumers=2&maxMessagesPerPoll=1")
            .unmarshal()
            .base64()
            .process(new BaseProcessor())
            .to("aws-sqs://test-camel-success?amazonSQSClient=#sqsClient").end();

我的测试处理器:

 public boolean process(Exchange exchange, AsyncCallback callback) {
    try {
        String header = (String) exchange.getIn().getHeader("CamelAwsSqsMessageId");
        String message = exchange.getIn().getBody(String.class);
        MDC.put("message-id", header);
        Thread.sleep(5 * 1000);
        LOG.info("Async ping");
        LOG.info(message);
    } catch (Throwable e) {
        LOG.error(e.getMessage(), e);
        exchange.setException(e);
    }
    callback.done(false);
    return false;
}

所以我有下一个情况: 1)骆驼成功地从“test-camel-start”队列中读取消息 2) BaseProcessor 成功处理消息 3) 在重试向“test-camel-success”传递消息时失败

我收到了下一个日志跟踪:

637435 [Camel (HomeCamelSQS) 线程 #2 - aws-sqs://test-camel-start] 错误 oacprocessor.DefaultErrorHandler cr.id=18b85e94-bc2f-44dd-baef-4bcd4fb79e0c - (MessageId: ExchangeId 上的 ID-DESKTOP-5SBC4FA-1522239559145-0-6:ID-DESKTOP-5SBC4FA-1522239559145-0-5)。交付尝试后用尽:1 捕获:com.amazonaws.services.sqs.model.AmazonSQSException:请求必须包含参数 MessageBody。 (服务:AmazonSQS;状态码:400;错误码:MissingParameter;请求 ID:85604fc2-0724-5d16-af6b-1cf78a24e8b0)

消息历史记录

RouteId ProcessorId 处理器已用(毫秒) [route1] [route1] [aws-sqs://test-camel-start?amazonSQSClient=%23sqsClient&concurrentConsumers=2&] [7591] [route1] [unmarshal1] [unmarshal [org.apache.camel.model.dataformat.Base64DataFormat@237080aa]] [1] [route1] [process1] [处理器@0x5007bde9] [7417] [route1] [to1] [aws-sqs://test-camel-success?amazonSQSClient=#sqsClient] [172]

堆栈跟踪

com.amazonaws.services.sqs.model.AmazonSQSException:请求必须包含参数 MessageBody。 (服务:AmazonSQS;状态代码:400;错误代码:MissingParameter;请求 ID:85604fc2-0724-5d16-af6b-1cf78a24e8b0) 在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1638) 在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1303) 在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1055) 在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:743) 在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:717) 在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:699) 在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:667) 在 com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:649) 在 com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:513) 在 com.amazonaws.services.sqs.AmazonSQSClient.doInvoke(AmazonSQSClient.java:2013) 在 com.amazonaws.services.sqs.AmazonSQSClient.invoke(AmazonSQSClient.java:1989) 在 com.amazonaws.services.sqs.AmazonSQSClient.executeSendMessage(AmazonSQSClient.java:1594) 在 com.amazonaws.services.sqs.AmazonSQSClient.sendMessage(AmazonSQSClient.java:1571) 在 org.apache.camel.component.aws.sqs.SqsProducer.process(SqsProducer.java:62) 在 org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61) 在 org.apache.camel.processor.SendProcessor.process(SendProcessor.java:148) 在 org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:548) 在 org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201) 在 org.apache.camel.processor.Pipeline.process(Pipeline.java:138) 在 org.apache.camel.processor.Pipeline.access 100 美元(Pipeline.java:43) 在 org.apache.camel.processor.Pipeline$1.done(Pipeline.java:157) 在 org.apache.camel.processor.CamelInternalProcessor$InternalCallback.done(CamelInternalProcessor.java:262) 在 org.apache.camel.processor.RedeliveryErrorHandler$2.done(RedeliveryErrorHandler.java:560) 在 com.home.camel_poligon.BaseProcessor.process(BaseProcessor.java:35) 在 org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:110) 在 org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:548) 在 org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201) 在 org.apache.camel.processor.Pipeline.process(Pipeline.java:138) 在 org.apache.camel.processor.Pipeline.process(Pipeline.java:101) 在 org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201) 在 org.apache.camel.component.aws.sqs.SqsConsumer.processBatch(SqsConsumer.java:206) 在 org.apache.camel.component.aws.sqs.SqsConsumer.poll(SqsConsumer.java:111) 在 org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:174) 在 org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:101) 在 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:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 java.lang.Thread.run(Thread.java:745)

日志说“请求必须包含参数MessageBody”。

而且我不知道为什么没有这个消息正文。

【问题讨论】:

    标签: java apache-camel


    【解决方案1】:

    查看此常见问题解答:http://camel.apache.org/why-is-my-message-body-empty.html

    在您的处理器中,您将消息正文转换为记录的字符串。由于消息主体是基于流的(例如来自 base64 的输出),它会将主体读取到流的末尾,然后消息将视为为空。

    您可以打开流缓存,也可以不手动登录您的处理器。

    【讨论】:

      猜你喜欢
      • 2021-08-26
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-15
      • 1970-01-01
      • 1970-01-01
      • 2017-06-18
      相关资源
      最近更新 更多