You need to enable JavaScript to run this app.
导航

管理事件通知(Java SDK)

最近更新时间2024.02.04 18:31:05

首次发布时间2023.03.15 15:27:55

TOS 支持将部分事件的变动投递到函数服务。如果您希望实时掌握在 TOS 中的资源变动,可以设置事件通知规则。本文介绍事件通知的示例代码。
关于函数服务的详细信息,请参见什么是函数服务

设置事件通知规则

您可以通过 TOS Java SDK 的 putBucketNotification 接口配置指定桶的事件通知规则。

注意

  • 要配置桶的事件通知规则,您必须是桶 Owner。
  • 设置事件通知需要依赖函数服务,您需要提前在火山引擎中创建函数服务并发布。
  • 一个存储桶最多只能创建 10 个事件通知规则。
  • 一个事件通知规则只能选择一个推送目标,即一个函数服务。

示例代码

以下代码展示如何设置桶的事件通知规则。

import com.volcengine.tos.TOSV2;
import com.volcengine.tos.TOSV2ClientBuilder;
import com.volcengine.tos.TosClientException;
import com.volcengine.tos.TosServerException;
import com.volcengine.tos.model.bucket.*;

import java.util.ArrayList;
import java.util.List;

public class PutBucketNotificationExample {
    public static void main(String[] args) {
        String endpoint = "your endpoint";
        String region = "your region";
        String accessKey = System.getenv("TOS_ACCESS_KEY");
        String secretKey = System.getenv("TOS_SECRET_KEY"); 

        String bucketName = "bucket-example";

        // 事件通知名称
        String id = "event notification id";
        // 设置订阅事件的函数服务
        String cloudFunction = "your cloud function";

        String event = "tos:ObjectCreated:Put";

        TOSV2 tos = new TOSV2ClientBuilder().build(region, endpoint, accessKey, secretKey);

        try{
            // 需要订阅的事件,以下仅为示例,含义是上传对象事件
            List<String> events = new ArrayList<>();
            events.add(event);
            FilterRule rule = new FilterRule().setName("prefix").setValue("test-");
            List<FilterRule> rules = new ArrayList<>();
            rules.add(rule);
            Filter filter = new Filter().setKey(new FilterKey().setRules(rules));
            CloudFunctionConfiguration configuration = new CloudFunctionConfiguration()
                    .setId(id).setCloudFunction(cloudFunction)
                    .setEvents(events)
                    // 设置匹配对象的前缀信息和后缀信息
                    .setFilter(filter);
            List<CloudFunctionConfiguration> configurations = new ArrayList<>();
            configurations.add(configuration);
            PutBucketNotificationInput input = new PutBucketNotificationInput().setBucket(bucketName)
                    .setCloudFunctionConfigurations(configurations);
            PutBucketNotificationOutput output = tos.putBucketNotification(input);
            System.out.println("putBucketNotification succeed");
        } catch (TosClientException e) {
            // 操作失败,捕获客户端异常,一般情况是请求参数错误,此时请求并未发送
            System.out.println("putBucketNotification failed");
            System.out.println("Message: " + e.getMessage());
            if (e.getCause() != null) {
                e.getCause().printStackTrace();
            }
        } catch (TosServerException e) {
            // 操作失败,捕获服务端异常,可以获取到从服务端返回的详细错误信息
            System.out.println("putBucketNotification failed");
            System.out.println("StatusCode: " + e.getStatusCode());
            System.out.println("Code: " + e.getCode());
            System.out.println("Message: " + e.getMessage());
            System.out.println("RequestID: " + e.getRequestID());
        } catch (Throwable t) {
            // 作为兜底捕获其他异常,一般不会执行到这里
            System.out.println("putBucketNotification failed");
            System.out.println("unexpected exception, message: " + t.getMessage());
        }
    }
}

获取事件通知规则

您可以通过 TOS Java SDK 的 getBucketNotification 接口获取指定桶配置的事件通知规则。

注意

要获取桶的事件通知规则,默认您必须为桶 Owner。

示例代码

以下代码展示如何获取桶的事件通知规则。

import com.volcengine.tos.TOSV2;
import com.volcengine.tos.TOSV2ClientBuilder;
import com.volcengine.tos.TosClientException;
import com.volcengine.tos.TosServerException;
import com.volcengine.tos.model.bucket.CloudFunctionConfiguration;
import com.volcengine.tos.model.bucket.GetBucketNotificationInput;
import com.volcengine.tos.model.bucket.GetBucketNotificationOutput;

public class GetBucketNotificationExample {
    public static void main(String[] args) {
        String endpoint = "your endpoint";
        String region = "your region";
        String accessKey = System.getenv("TOS_ACCESS_KEY");
        String secretKey = System.getenv("TOS_SECRET_KEY"); 

        String bucketName = "bucket-example";

        TOSV2 tos = new TOSV2ClientBuilder().build(region, endpoint, accessKey, secretKey);

        try{
            GetBucketNotificationInput input = new GetBucketNotificationInput().setBucket(bucketName);
            GetBucketNotificationOutput output = tos.getBucketNotification(input);
            System.out.println("getBucketNotification succeed");
            if (output.getCloudFunctionConfiguration() != null) {
                System.out.println("this bucket has " + output.getCloudFunctionConfiguration().size() + " notification rules");
                for (int i = 0; i < output.getCloudFunctionConfiguration().size(); i++){
                    CloudFunctionConfiguration conf = output.getCloudFunctionConfiguration().get(i);
                    // 事件通知名称
                    System.out.println("Cloud Function Configuration ID:" + conf.getId());
                    // 订阅的事件
                    if (conf.getEvents() != null && conf.getEvents().size() > 0) {
                        for(int j = 0; j < conf.getEvents().size(); j++) {
                            System.out.println("Cloud Function Configuration Events " + j + " is " + conf.getEvents().get(j));
                        }
                    }
                    // 设置匹配对象的前缀信息和后缀信息
                    System.out.println("Cloud Function Configuration Filter " + conf.getFilter());
                    // 设置订阅事件的函数服务
                    System.out.println("Cloud Function Configuration CloudFunction " + conf.getCloudFunction());
                }
            }
        } catch (TosClientException e) {
            // 操作失败,捕获客户端异常,一般情况是请求参数错误,此时请求并未发送
            System.out.println("getBucketNotification failed");
            System.out.println("Message: " + e.getMessage());
            if (e.getCause() != null) {
                e.getCause().printStackTrace();
            }
        } catch (TosServerException e) {
            // 操作失败,捕获服务端异常,可以获取到从服务端返回的详细错误信息
            System.out.println("getBucketNotification failed");
            System.out.println("StatusCode: " + e.getStatusCode());
            System.out.println("Code: " + e.getCode());
            System.out.println("Message: " + e.getMessage());
            System.out.println("RequestID: " + e.getRequestID());
        } catch (Throwable t) {
            // 作为兜底捕获其他异常,一般不会执行到这里
            System.out.println("getBucketNotification failed");
            System.out.println("unexpected exception, message: " + t.getMessage());
        }
    }
}

相关文档

关于事件通知配置的更多信息,请参见事件通知