使用Java的SNS主题上的InvalidParameterException

时间:2019-02-27 11:42:32

标签: java amazon-web-services exception amazon-sns

当尝试使用com.amazonaws.services.sns Java模块将消息发送到AWS SNS主题时,遇到以下错误:

shaded.com.amazonaws.services.sns.model.InvalidParameterException: Invalid parameter: Message too long (Service: AmazonSNS; Status Code: 400; Error Code: InvalidParameter; Request ID: 3b01ce49-a37d-5aba-bec2-9ab9d5446aea)
at shaded.com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1587)
at shaded.com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1257)
at shaded.com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1029)
at shaded.com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:741)
at shaded.com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:715)
at shaded.com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:697)
at shaded.com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:665)
at shaded.com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:647)
at shaded.com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:511)
at shaded.com.amazonaws.services.sns.AmazonSNSClient.doInvoke(AmazonSNSClient.java:2270)
at shaded.com.amazonaws.services.sns.AmazonSNSClient.invoke(AmazonSNSClient.java:2246)
at shaded.com.amazonaws.services.sns.AmazonSNSClient.executePublish(AmazonSNSClient.java:1698)
at shaded.com.amazonaws.services.sns.AmazonSNSClient.publish(AmazonSNSClient.java:1675)

以下是AmazonSNS帮助程序类。此类管理客户端创建和将消息发布到SNS主题。

import java.io.Serializable;

import com.amazonaws.services.sns.AmazonSNS;
import com.amazonaws.services.sns.AmazonSNSClientBuilder;
import com.amazonaws.services.sns.model.PublishRequest;
import com.amazonaws.services.sns.model.PublishResult;

public class AWSSNS implements Serializable {

private static final long serialVersionUID = -4175291946259141176L;
protected AmazonSNS client;

public AWSSNS(){
    this.client=AmazonSNSClientBuilder.standard().withRegion("us-west-2").build();
}

public AWSSNS(AmazonSNS client) { 
    this.client=client;
}

public AmazonSNS getSnsClient(){
    return this.client;
}

public void setSqsClient(AmazonSNS client){
    this.client = client;
}

public boolean sendMessages(String topicArn, String messageBody){

    PublishRequest publishRequest = new PublishRequest(topicArn, messageBody);
    PublishResult publishResult = this.client.publish(publishRequest);

    if(publishResult != null && publishResult.getMessageId() != null){
        return true;
    }
    else{
        return false;
    }
}
}

以下是在其中调用amazonSNS helper类的代码段。它除了创建String dataType消息并将其与topicARN一起发送外,什么也不做。

HashMap<String, String> variable_a = new HashMap<String, String>();
Gson gson = new Gson();

for (Object_a revoke : Object_a) {
    Object_a operation = someMethod1(revoke);
    String serializedOperation = gson.toJson(operation);

    variable_a.put(revoke.someMethod2(), serializedOperation);
    String message = gson.toJson(variable_a);

    LOG.info(String.format("SNS message: %s", message));
    this.awsSNS.sendMessages(topicARN, message);
}

所以基本上错误是从sendMessage内部抛出的。

1 个答案:

答案 0 :(得分:0)

找到了解决问题的方法。

AWS SNS主题具有固定的最大大小。因此,在发布大小大于最大大小的消息时,将导致invalidParameterException和消息“消息太长”。

我的消息超出了该大小,这就是错误的原因。我粉碎了消息,直到大小不超过最大大小。