package com.alibaba.datax.plugin.writer.ocswriter.utils; import com.alibaba.datax.common.exception.DataXException; import com.alibaba.datax.common.util.Configuration; import com.alibaba.datax.plugin.writer.ocswriter.Key; import com.google.common.annotations.VisibleForTesting; import net.spy.memcached.AddrUtil; import net.spy.memcached.ConnectionFactoryBuilder; import net.spy.memcached.MemcachedClient; import net.spy.memcached.auth.AuthDescriptor; import net.spy.memcached.auth.PlainCallbackHandler; import org.apache.commons.lang3.EnumUtils; import org.apache.commons.lang3.StringUtils; public class ConfigurationChecker { public static void check(Configuration config) { paramCheck(config); hostReachableCheck(config); } public enum WRITE_MODE { set, add, replace, append, prepend } private enum WRITE_FORMAT { text } /** * 参数有效性基本检查 */ private static void paramCheck(Configuration config) { String proxy = config.getString(Key.PROXY); if (StringUtils.isBlank(proxy)) { throw DataXException.asDataXException(OcsWriterErrorCode.REQUIRED_VALUE, String.format("ocs服务地址%s不能设置为空", Key.PROXY)); } String user = config.getString(Key.USER); if (StringUtils.isBlank(user)) { throw DataXException.asDataXException(OcsWriterErrorCode.REQUIRED_VALUE, String.format("访问ocs的用户%s不能设置为空", Key.USER)); } String password = config.getString(Key.PASSWORD); if (StringUtils.isBlank(password)) { throw DataXException.asDataXException(OcsWriterErrorCode.REQUIRED_VALUE, String.format("访问ocs的用户%s不能设置为空", Key.PASSWORD)); } String port = config.getString(Key.PORT, "11211"); if (StringUtils.isBlank(port)) { throw DataXException.asDataXException(OcsWriterErrorCode.REQUIRED_VALUE, String.format("ocs端口%s不能设置为空", Key.PORT)); } String indexes = config.getString(Key.INDEXES, "0"); if (StringUtils.isBlank(indexes)) { throw DataXException.asDataXException(OcsWriterErrorCode.REQUIRED_VALUE, String.format("当做key的列编号%s不能为空", Key.INDEXES)); } for (String index : indexes.split(",")) { try { if (Integer.parseInt(index) < 0) { throw DataXException.asDataXException(OcsWriterErrorCode.ILLEGAL_PARAM_VALUE, String.format("列编号%s必须为逗号分隔的非负整数", Key.INDEXES)); } } catch (NumberFormatException e) { throw DataXException.asDataXException(OcsWriterErrorCode.ILLEGAL_PARAM_VALUE, String.format("列编号%s必须为逗号分隔的非负整数", Key.INDEXES)); } } String writerMode = config.getString(Key.WRITE_MODE); if (StringUtils.isBlank(writerMode)) { throw DataXException.asDataXException(OcsWriterErrorCode.REQUIRED_VALUE, String.format("操作方式%s不能为空", Key.WRITE_MODE)); } if (!EnumUtils.isValidEnum(WRITE_MODE.class, writerMode.toLowerCase())) { throw DataXException.asDataXException(OcsWriterErrorCode.ILLEGAL_PARAM_VALUE, String.format("不支持操作方式%s,仅支持%s", writerMode, StringUtils.join(WRITE_MODE.values(), ","))); } String writerFormat = config.getString(Key.WRITE_FORMAT, "text"); if (StringUtils.isBlank(writerFormat)) { throw DataXException.asDataXException(OcsWriterErrorCode.REQUIRED_VALUE, String.format("写入格式%s不能为空", Key.WRITE_FORMAT)); } if (!EnumUtils.isValidEnum(WRITE_FORMAT.class, writerFormat.toLowerCase())) { throw DataXException.asDataXException(OcsWriterErrorCode.ILLEGAL_PARAM_VALUE, String.format("不支持写入格式%s,仅支持%s", writerFormat, StringUtils.join(WRITE_FORMAT.values(), ","))); } int expireTime = config.getInt(Key.EXPIRE_TIME, 0); if (expireTime < 0) { throw DataXException.asDataXException(OcsWriterErrorCode.ILLEGAL_PARAM_VALUE, String.format("数据过期时间设置%s不能小于0", Key.EXPIRE_TIME)); } int batchSiz = config.getInt(Key.BATCH_SIZE, 100); if (batchSiz <= 0) { throw DataXException.asDataXException(OcsWriterErrorCode.ILLEGAL_PARAM_VALUE, String.format("批量写入大小设置%s必须大于0", Key.BATCH_SIZE)); } //fieldDelimiter不需要检查,默认为\u0001 } /** * 检查ocs服务器网络是否可达 */ private static void hostReachableCheck(Configuration config) { String proxy = config.getString(Key.PROXY); String port = config.getString(Key.PORT); String username = config.getString(Key.USER); String password = config.getString(Key.PASSWORD); AuthDescriptor ad = new AuthDescriptor(new String[] { "PLAIN" }, new PlainCallbackHandler(username, password)); try { MemcachedClient client = new MemcachedClient( new ConnectionFactoryBuilder() .setProtocol( ConnectionFactoryBuilder.Protocol.BINARY) .setAuthDescriptor(ad).build(), AddrUtil.getAddresses(proxy + ":" + port)); client.get("for_check_connectivity"); client.getVersions(); if (client.getAvailableServers().isEmpty()) { throw new RuntimeException( "没有可用的Servers: getAvailableServers() -> is empty"); } client.shutdown(); } catch (Exception e) { throw DataXException.asDataXException( OcsWriterErrorCode.HOST_UNREACHABLE, String.format("OCS[%s]服务不可用", proxy), e); } } /** * 以下为测试使用 */ @VisibleForTesting public static void paramCheck_test(Configuration configuration) { paramCheck(configuration); } @VisibleForTesting public static void hostReachableCheck_test(Configuration configuration) { hostReachableCheck(configuration); } }