繁体   English   中英

什么是对AWS用户处理java.net.UnknownHostException的最佳方法?

[英]What can be the best approach to handle java.net.UnknownHostException for AWS users?

我的应用程序将消息发送到Amazon Simple Notification Service(SNS)主题,但有时(6/10)我收到java.net.UnknownHostException:sqs.ap-southeast-1.amazonaws.com。 亚马逊Web服务讨论论坛中描述了异常原因,请查看: https : //forums.aws.amazon.com/thread.jspa?messageID=499290&#499290

我的问题类似于在亚马逊论坛中描述的问题,但是我将消息发布到主题的速度非常动态。 它可以是1条消息/秒或1条消息/分钟,或者一小时内没有消息。 我正在寻找一种更清洁,更好和安全的方法,以确保将消息发送到SNS主题。

问题的详细描述:

Topic_Arn =有关应用程序要在其中发布消息的SNS主题的信息

msg =要发送的主题消息

// Just a sample example which publish message to Amazon SNS topic
class SimpleNotificationService {
    AmazonSNSClient mSnsClient = null;

    static {
        createSnsClient()
    }

    private void static createSnsClient() {
        Region region = Region.getRegion(Regions.AP_SOUTHEAST_1);
        AWSCredentials credentials = new 
                BasicAWSCredentials(AwsPropertyLoader.getInstance().getAccessKey(),        
                        AwsPropertyLoader.getInstance().getSecretKey());
        mSqsClient = new AmazonSQSClient(credentials);
        mSqsClient.setRegion(region);
    }

    public void static publishMessage(String Topic_Arn, String msg) {
        PublishRequest req = new PublishRequest(Topic_Arn, msg);
        mSnsClient.publish(req);
    }
}

调用SimpleNotificationService的类

class MessagingManager {

     public void sendMessage(String message) {
           String topic_arn = "arn:of:amazon:sns:topic";
           SimpleNotificationService.publishMessage(topic_arn, message);
     }
}

请注意,这是示例代码,而不是我的实际代码。 这可能是课程设计问题,但如果与问题无关,请忽略这些问题。

我的想法是说sendMessage内有try-catch块,所以当我们捕获UnknownHostException时,再次重试,但我不确定如何以更安全,更干净和更好的方式编写此代码。

因此,MessagingManager类将如下所示:

class MessagingManager {

     public void sendMessage(String message) {
           String topic_arn = "arn:of:amazon:sns:topic";
           try {
               SimpleNotificationService.publishMessage(topic_arn, message);
           } catch (UnknownHostException uhe) { 
               // I need to catch AmazonClientException as aws throws
               //AmazonClientException when sees UnknownHostException. 
               // I am mentioning UnknownHostException for non-aws user to understand
               // my problem in better way.
               sendMessage(message); // Isn't unsafe? - may falls into infinite loop
           }
     }
}

我愿意接受这样的答案: java.net.UnknownHostException:服务器的无效主机名:本地,但是我担心的是依赖于应用程序代码级别的解决方案,而较少依赖于对计算机的更改。 由于我的服务器应用程序将在许多设备中运行(开发人员设备,测试设备或生产设备)。 如果仅保证机器主机文件或其他内容的更改是解决方案,那么我宁愿将其包含在代码级更改中。

每个AWS开发工具包均实现自动重试逻辑。 适用于Java的AWS开发工具包会自动重试请求,您可以使用ClientConfiguration类配置重试设置。

下面是创建SNS客户端的示例示例。 如果遇到UnKnownHostException,它将重试25次。 它使用默认的BackOff和重试策略。 如果要拥有自己的接口,则需要实现这两个接口: http : //docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/retry/RetryPolicy.html

private void static createSnsClient() {
    Region region = Region.getRegion(Regions.AP_SOUTHEAST_1);
    AWSCredentials credentials = new 
            BasicAWSCredentials(AwsPropertyLoader.getInstance().getAccessKey(),        
                    AwsPropertyLoader.getInstance().getSecretKey());
        ClientConfiguration clientConfiguration = new ClientConfiguration();
        clientConfiguration.setMaxErrorRetry(25);
        clientConfiguration.setRetryPolicy(new RetryPolicy(null, null, 25, true));
        mSnsClient = new AmazonSNSClient(credentials, clientConfiguration);
        mSnsClient.setRegion(region);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM