【问题标题】:Spring Cloud AWS - Invalid Header posting SNS notificationSpring Cloud AWS - 无效的标头发布 SNS 通知
【发布时间】:2016-02-18 13:50:56
【问题描述】:

我正在尝试使用 org.springframework.cloud.aws.messaging.core.NotificationMessagingTemplate(来自 Spring Cloud AWS)将通知发布到 SNS 主题。

每次发布​​通知时都会生成一条警告消息:

WARN [org.springframework.cloud.aws.messaging.core.TopicMessageChannel] 名称为“id”且类型为“java.util.UUID”的消息头不能作为消息属性发送,因为 SNS 不支持。

问题似乎是org.springframework.messaging.MessageHeaders 自动生成了一个 java.util.UUID 类型的 id 标头,这不是 Spring Cloud 知道如何处理的。

除了抑制日志之外,有没有办法避免自动生成标头(我可以在这里没有 UUID)或避免警告?

类似的事情也在影响 SQS:

相关问题: spring-cloud-aws Spring creates message header attribute not supported by SQS Related Bug: Warning "'java.util.UUID' cannot be sent as message attribute ..." on any request sent to SQS channel

我的控制器看起来像这样:

package com.stackoverflow.sample.web;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.aws.messaging.core.NotificationMessagingTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/whatever")
public class SampleController {

    @Autowired
    private NotificationMessagingTemplate template;

    @RequestMapping(method = RequestMethod.GET)
        public String handleGet() {
            this.template.sendNotification("message", "subject");
            return "yay";
        }
    }
}

我的 Spring 配置如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:aws-context="http://www.springframework.org/schema/cloud/aws/context"
        xmlns:aws-messaging="http://www.springframework.org/schema/cloud/aws/messaging"
    xsi:schemaLocation="
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
        http://www.springframework.org/schema/cloud/aws/context http://www.springframework.org/schema/cloud/spring-cloud-aws-context.xsd
        http://www.springframework.org/schema/cloud/aws/messaging http://www.springframework.org/schema/cloud/spring-cloud-aws-messaging.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">

    <context:annotation-config />
    <context:component-scan base-package="com.stackoverflow.sample" />
    <mvc:annotation-driven />

    <aws-context:context-credentials>
        <aws-context:instance-profile-credentials/>
        <aws-context:simple-credentials access-key="MyKey" secret-key="mySecret" />
    </aws-context:context-credentials>

    <aws-messaging:notification-messaging-template id="notificationMessagingTemplate" region="us-west-2" default-destination="myTopic" />
</beans>

【问题讨论】:

    标签: java spring amazon-web-services spring-cloud amazon-sns


    【解决方案1】:

    出现问题是因为构造函数调用了MessageHeaders类

    MessageHeaders 类

    MessageHeaders(Map<String, Object> headers) { } on line 39
    

    并且不发送您需要调用构造函数的 id 标头 MessageHeaders 类

    MessageHeaders(Map<String, Object> headers, UUID id, Long timestamp){} on line 43
    

    因为这个构造函数有条件不自动创建id头

    要停止发送标头 ID,您需要覆盖 MessageHeader 和 NotificationMessagingTemplate 类

    类 MessageHeaders

    public class MessageHeadersCustom extends MessageHeaders {
        public MessageHeadersCustom() {
            super(new HashMap<String, Object>(), ID_VALUE_NONE, null);
        }
    }
    

    类 NotificationMessagingTemplate

    public class NotificationMessagingTemplateCustom extends NotificationMessagingTemplate {
    
        public NotificationMessagingTemplateCustom(AmazonSNS amazonSns) {
            super(amazonSns);
        }
    
        @Override
        public void sendNotification(Object message, String subject) {
    
            MessageHeaders headersCustom = new MessageHeadersCustom();
            headersCustom.put(TopicMessageChannel.NOTIFICATION_SUBJECT_HEADER, subject);
    
            this.convertAndSend(getRequiredDefaultDestination(), message, headersCustom);
        }
    }
    

    最后,调用的类需要使用你的实现

    package com.stackoverflow.sample.web;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cloud.aws.messaging.core.NotificationMessagingTemplate;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    
    @Controller
    @RequestMapping("/whatever")
    public class SampleController {
    
        @Autowired
        private NotificationMessagingTemplateCustom template;
    
        @RequestMapping(method = RequestMethod.GET)
            public String handleGet() {
                this.template.sendNotification("message", "subject");
                return "yay";
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-09-23
      • 2016-07-03
      • 2016-06-30
      • 2016-04-04
      • 2020-08-28
      • 2019-07-10
      • 1970-01-01
      • 1970-01-01
      • 2021-10-18
      相关资源
      最近更新 更多