TOS 支持将部分事件的变动投递到函数服务。如果您希望实时掌握在 TOS 中的资源变动,可以设置事件通知规则。本文介绍事件通知的示例代码。
关于函数服务的详细信息,请参见什么是函数服务。
您可以通过 TOS Java SDK 的 putBucketNotification
接口配置指定桶的事件通知规则。
注意
以下代码展示如何设置桶的事件通知规则。
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()); } } }
关于事件通知配置的更多信息,请参见事件通知。