diff --git a/admin/admin-web/src/main/java/com/alibaba/otter/canal/admin/common/Threads.java b/admin/admin-web/src/main/java/com/alibaba/otter/canal/admin/common/Threads.java index 5a2a558d..9d2f6f25 100644 --- a/admin/admin-web/src/main/java/com/alibaba/otter/canal/admin/common/Threads.java +++ b/admin/admin-web/src/main/java/com/alibaba/otter/canal/admin/common/Threads.java @@ -12,6 +12,6 @@ public class Threads { pool, 0L, TimeUnit.MILLISECONDS, - new ArrayBlockingQueue(pool * 20), + new ArrayBlockingQueue<>(pool * 20), DaemonThreadFactory.daemonThreadFactory); } diff --git a/admin/admin-web/src/main/java/com/alibaba/otter/canal/admin/model/Pager.java b/admin/admin-web/src/main/java/com/alibaba/otter/canal/admin/model/Pager.java index e274c87b..b125bbce 100644 --- a/admin/admin-web/src/main/java/com/alibaba/otter/canal/admin/model/Pager.java +++ b/admin/admin-web/src/main/java/com/alibaba/otter/canal/admin/model/Pager.java @@ -9,7 +9,7 @@ public class Pager implements Serializable { private static final long serialVersionUID = -986577815091763517L; private Long count = 0L; - private List items = new ArrayList(); + private List items = new ArrayList<>(); private Integer page = 1; private Integer size = 20; private Long offset = 0L; diff --git a/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/YmlConfigBinder.java b/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/YmlConfigBinder.java index 837b1ab4..59a48d61 100644 --- a/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/YmlConfigBinder.java +++ b/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/YmlConfigBinder.java @@ -140,7 +140,7 @@ public class YmlConfigBinder { MutablePropertySources propertySources = new MutablePropertySources(); propertySources.addFirst(propertySource); - PropertiesConfigurationFactory factory = new PropertiesConfigurationFactory(target); + PropertiesConfigurationFactory factory = new PropertiesConfigurationFactory<>(target); factory.setPropertySources(propertySources); factory.setIgnoreInvalidFields(true); factory.setIgnoreUnknownFields(true); diff --git a/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/bind/DefaultPropertyNamePatternsMatcher.java b/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/bind/DefaultPropertyNamePatternsMatcher.java index 0b63ed2c..9f7ffe2e 100644 --- a/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/bind/DefaultPropertyNamePatternsMatcher.java +++ b/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/bind/DefaultPropertyNamePatternsMatcher.java @@ -25,7 +25,7 @@ class DefaultPropertyNamePatternsMatcher implements PropertyNamePatternsMatcher } protected DefaultPropertyNamePatternsMatcher(char[] delimiters, boolean ignoreCase, String... names){ - this(delimiters, ignoreCase, new HashSet(Arrays.asList(names))); + this(delimiters, ignoreCase, new HashSet<>(Arrays.asList(names))); } DefaultPropertyNamePatternsMatcher(char[] delimiters, boolean ignoreCase, Set names){ diff --git a/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/bind/PropertiesConfigurationFactory.java b/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/bind/PropertiesConfigurationFactory.java index 76a97c0b..e8162efa 100644 --- a/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/bind/PropertiesConfigurationFactory.java +++ b/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/bind/PropertiesConfigurationFactory.java @@ -277,7 +277,7 @@ public class PropertiesConfigurationFactory implements FactoryBean, Applic } private Set getNames(Iterable prefixes) { - Set names = new LinkedHashSet(); + Set names = new LinkedHashSet<>(); if (this.target != null) { PropertyDescriptor[] descriptors = BeanUtils.getPropertyDescriptors(this.target.getClass()); for (PropertyDescriptor descriptor : descriptors) { @@ -318,7 +318,7 @@ public class PropertiesConfigurationFactory implements FactoryBean, Applic // We can filter properties to those starting with the target name, but // we can't do a complete filter since we need to trigger the // unknown fields check - Set relaxedNames = new HashSet(); + Set relaxedNames = new HashSet<>(); for (String relaxedTargetName : relaxedTargetNames) { relaxedNames.add(relaxedTargetName); } diff --git a/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/bind/PropertyNamePatternsMatcher.java b/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/bind/PropertyNamePatternsMatcher.java index 0d7d4fe4..47d8a780 100644 --- a/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/bind/PropertyNamePatternsMatcher.java +++ b/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/bind/PropertyNamePatternsMatcher.java @@ -9,23 +9,9 @@ package com.alibaba.otter.canal.client.adapter.config.bind; */ interface PropertyNamePatternsMatcher { - PropertyNamePatternsMatcher ALL = new PropertyNamePatternsMatcher() { + PropertyNamePatternsMatcher ALL = propertyName -> true; - @Override - public boolean matches(String propertyName) { - return true; - } - - }; - - PropertyNamePatternsMatcher NONE = new PropertyNamePatternsMatcher() { - - @Override - public boolean matches(String propertyName) { - return false; - } - - }; + PropertyNamePatternsMatcher NONE = propertyName -> false; /** * Return {@code true} of the property name matches. diff --git a/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/bind/PropertySourcesPropertyValues.java b/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/bind/PropertySourcesPropertyValues.java index d41cb27b..70ad5731 100644 --- a/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/bind/PropertySourcesPropertyValues.java +++ b/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/bind/PropertySourcesPropertyValues.java @@ -37,9 +37,9 @@ public class PropertySourcesPropertyValues implements PropertyValues { private final PropertyNamePatternsMatcher includes; - private final Map propertyValues = new LinkedHashMap(); + private final Map propertyValues = new LinkedHashMap<>(); - private final ConcurrentHashMap> collectionOwners = new ConcurrentHashMap>(); + private final ConcurrentHashMap> collectionOwners = new ConcurrentHashMap<>(); private final boolean resolvePlaceholders; diff --git a/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/bind/RelaxedDataBinder.java b/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/bind/RelaxedDataBinder.java index dbcc7130..7723eb0f 100644 --- a/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/bind/RelaxedDataBinder.java +++ b/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/bind/RelaxedDataBinder.java @@ -32,7 +32,7 @@ public class RelaxedDataBinder extends DataBinder { private static final Set> EXCLUDED_EDITORS; static { - Set> excluded = new HashSet>(); + Set> excluded = new HashSet<>(); excluded.add(FileEditor.class); EXCLUDED_EDITORS = Collections.unmodifiableSet(excluded); } @@ -43,7 +43,7 @@ public class RelaxedDataBinder extends DataBinder { private boolean ignoreNestedProperties; - private MultiValueMap nameAliases = new LinkedMultiValueMap(); + private MultiValueMap nameAliases = new LinkedMultiValueMap<>(); /** * Create a new {@link RelaxedDataBinder} instance. @@ -89,7 +89,7 @@ public class RelaxedDataBinder extends DataBinder { * @param aliases a map of property name to aliases */ public void setNameAliases(Map> aliases) { - this.nameAliases = new LinkedMultiValueMap(aliases); + this.nameAliases = new LinkedMultiValueMap<>(aliases); } /** @@ -129,8 +129,8 @@ public class RelaxedDataBinder extends DataBinder { BeanWrapper wrapper = new BeanWrapperImpl(target); wrapper.setConversionService(new RelaxedConversionService(getConversionService())); wrapper.setAutoGrowNestedPaths(true); - List sortedValues = new ArrayList(); - Set modifiedNames = new HashSet(); + List sortedValues = new ArrayList<>(); + Set modifiedNames = new HashSet<>(); List sortedNames = getSortedPropertyNames(propertyValues); for (String name : sortedNames) { PropertyValue propertyValue = propertyValues.getPropertyValue(name); @@ -143,7 +143,7 @@ public class RelaxedDataBinder extends DataBinder { } private List getSortedPropertyNames(MutablePropertyValues propertyValues) { - List names = new LinkedList(); + List names = new LinkedList<>(); for (PropertyValue propertyValue : propertyValues.getPropertyValueList()) { names.add(propertyValue.getName()); } @@ -161,7 +161,7 @@ public class RelaxedDataBinder extends DataBinder { * @param names the names to sort */ private void sortPropertyNames(List names) { - for (String name : new ArrayList(names)) { + for (String name : new ArrayList<>(names)) { int propertyIndex = names.indexOf(name); RelaxedDataBinder.BeanPath path = new RelaxedDataBinder.BeanPath(name); for (String prefix : path.prefixes()) { @@ -319,7 +319,7 @@ public class RelaxedDataBinder extends DataBinder { } Object extend = new LinkedHashMap(); if (!elementDescriptor.isMap() && path.isArrayIndex(index)) { - extend = new ArrayList(); + extend = new ArrayList<>(); } wrapper.setPropertyValue(path.prefix(index + 1), extend); } @@ -347,7 +347,7 @@ public class RelaxedDataBinder extends DataBinder { } Object extend = new LinkedHashMap(); if (descriptor.isCollection()) { - extend = new ArrayList(); + extend = new ArrayList<>(); } if (descriptor.getType().equals(Object.class) && path.isLastNode(index)) { extend = BLANK; @@ -411,7 +411,7 @@ public class RelaxedDataBinder extends DataBinder { if (aliases == null) { return Collections.singleton(name); } - List nameAndAliases = new ArrayList(aliases.size() + 1); + List nameAndAliases = new ArrayList<>(aliases.size() + 1); nameAndAliases.add(name); nameAndAliases.addAll(aliases); return nameAndAliases; @@ -473,7 +473,7 @@ public class RelaxedDataBinder extends DataBinder { } public List prefixes() { - List prefixes = new ArrayList(); + List prefixes = new ArrayList<>(); for (int index = 1; index < this.nodes.size(); index++) { prefixes.add(prefix(index)); } @@ -485,7 +485,7 @@ public class RelaxedDataBinder extends DataBinder { } private List splitPath(String path) { - List nodes = new ArrayList(); + List nodes = new ArrayList<>(); String current = extractIndexedPaths(path, nodes); for (String name : StringUtils.delimitedListToStringArray(current, ".")) { if (StringUtils.hasText(name)) { @@ -518,7 +518,7 @@ public class RelaxedDataBinder extends DataBinder { } public void collapseKeys(int index) { - List revised = new ArrayList(); + List revised = new ArrayList<>(); for (int i = 0; i < index; i++) { revised.add(this.nodes.get(i)); } @@ -668,7 +668,7 @@ public class RelaxedDataBinder extends DataBinder { private static final Set BENIGN_PROPERTY_SOURCE_NAMES; static { - Set names = new HashSet(); + Set names = new HashSet<>(); names.add(StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME); names.add(StandardEnvironment.SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME); BENIGN_PROPERTY_SOURCE_NAMES = Collections.unmodifiableSet(names); diff --git a/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/bind/RelaxedNames.java b/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/bind/RelaxedNames.java index f1b1628f..2c9dd70c 100644 --- a/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/bind/RelaxedNames.java +++ b/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/bind/RelaxedNames.java @@ -24,7 +24,7 @@ public final class RelaxedNames implements Iterable { private final String name; - private final Set values = new LinkedHashSet(); + private final Set values = new LinkedHashSet<>(); /** * Create a new {@link RelaxedNames} instance. diff --git a/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/common/CompositePropertySource.java b/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/common/CompositePropertySource.java index 106f8f90..a6096207 100644 --- a/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/common/CompositePropertySource.java +++ b/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/common/CompositePropertySource.java @@ -22,7 +22,7 @@ import org.springframework.util.StringUtils; */ public class CompositePropertySource extends EnumerablePropertySource { - private final Set> propertySources = new LinkedHashSet>(); + private final Set> propertySources = new LinkedHashSet<>(); /** * Create a new {@code CompositePropertySource}. @@ -56,7 +56,7 @@ public class CompositePropertySource extends EnumerablePropertySource { @Override public String[] getPropertyNames() { - Set names = new LinkedHashSet(); + Set names = new LinkedHashSet<>(); for (PropertySource propertySource : this.propertySources) { if (!(propertySource instanceof EnumerablePropertySource)) { throw new IllegalStateException( @@ -83,7 +83,7 @@ public class CompositePropertySource extends EnumerablePropertySource { * @since 4.1 */ public void addFirstPropertySource(PropertySource propertySource) { - List> existing = new ArrayList>(this.propertySources); + List> existing = new ArrayList<>(this.propertySources); this.propertySources.clear(); this.propertySources.add(propertySource); this.propertySources.addAll(existing); diff --git a/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/common/MutablePropertySources.java b/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/common/MutablePropertySources.java index d8f32d3c..78de18c0 100644 --- a/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/common/MutablePropertySources.java +++ b/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/common/MutablePropertySources.java @@ -28,7 +28,7 @@ public class MutablePropertySources implements PropertySources { private final Log logger; - private final List> propertySourceList = new CopyOnWriteArrayList>(); + private final List> propertySourceList = new CopyOnWriteArrayList<>(); /** * Create a new {@link MutablePropertySources} diff --git a/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/common/SpringProfileDocumentMatcher.java b/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/common/SpringProfileDocumentMatcher.java index f59c6983..df25eba1 100644 --- a/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/common/SpringProfileDocumentMatcher.java +++ b/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/common/SpringProfileDocumentMatcher.java @@ -31,7 +31,7 @@ public class SpringProfileDocumentMatcher implements YamlProcessor.DocumentMatch } public void addActiveProfiles(String... profiles) { - LinkedHashSet set = new LinkedHashSet(Arrays.asList(this.activeProfiles)); + LinkedHashSet set = new LinkedHashSet<>(Arrays.asList(this.activeProfiles)); Collections.addAll(set, profiles); this.activeProfiles = set.toArray(new String[set.size()]); } @@ -67,14 +67,14 @@ public class SpringProfileDocumentMatcher implements YamlProcessor.DocumentMatch private ProfilesMatcher getProfilesMatcher() { return (this.activeProfiles.length != 0 ? new ActiveProfilesMatcher( - new HashSet(Arrays.asList(this.activeProfiles))) : new EmptyProfilesMatcher()); + new HashSet<>(Arrays.asList(this.activeProfiles))) : new EmptyProfilesMatcher()); } private Set extractProfiles(List profiles, ProfileType type) { if (CollectionUtils.isEmpty(profiles)) { return null; } - Set extractedProfiles = new HashSet(); + Set extractedProfiles = new HashSet<>(); for (String candidate : profiles) { ProfileType candidateType = ProfileType.POSITIVE; if (candidate.startsWith("!")) { @@ -167,7 +167,7 @@ public class SpringProfileDocumentMatcher implements YamlProcessor.DocumentMatch */ static class SpringProperties { - private List profiles = new ArrayList(); + private List profiles = new ArrayList<>(); public List getProfiles() { return this.profiles; diff --git a/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/common/YamlProcessor.java b/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/common/YamlProcessor.java index c8dbdbaf..0ee6d855 100644 --- a/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/common/YamlProcessor.java +++ b/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/common/YamlProcessor.java @@ -166,7 +166,7 @@ public abstract class YamlProcessor { @SuppressWarnings("unchecked") private Map asMap(Object object) { // YAML can have numbers as keys - Map result = new LinkedHashMap(); + Map result = new LinkedHashMap<>(); if (!(object instanceof Map)) { // A document can be a text literal result.put("document", object); @@ -249,7 +249,7 @@ public abstract class YamlProcessor { * @since 4.1.3 */ protected final Map getFlattenedMap(Map source) { - Map result = new LinkedHashMap(); + Map result = new LinkedHashMap<>(); buildFlattenedMap(result, source, null); return result; } diff --git a/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/common/YamlPropertySourceLoader.java b/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/common/YamlPropertySourceLoader.java index 936bdba6..c04ea718 100644 --- a/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/common/YamlPropertySourceLoader.java +++ b/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/config/common/YamlPropertySourceLoader.java @@ -72,14 +72,8 @@ public class YamlPropertySourceLoader implements PropertySourceLoader { } public Map process() { - final Map result = new LinkedHashMap(); - process(new MatchCallback() { - - @Override - public void process(Properties properties, Map map) { - result.putAll(getFlattenedMap(map)); - } - }); + final Map result = new LinkedHashMap<>(); + process((properties, map) -> result.putAll(getFlattenedMap(map))); return result; } diff --git a/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/support/ExtensionLoader.java b/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/support/ExtensionLoader.java index bb73cb54..f7238eeb 100644 --- a/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/support/ExtensionLoader.java +++ b/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/support/ExtensionLoader.java @@ -259,7 +259,7 @@ public class ExtensionLoader { } } - Map> extensionClasses = new HashMap>(); + Map> extensionClasses = new HashMap<>(); // 1. plugin folder,customized extension classLoader (jar_dir/plugin) String dir = File.separator + this.getJarDirectoryPath() + File.separator + "plugin"; diff --git a/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/support/MessageUtil.java b/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/support/MessageUtil.java index d0b42951..c137fb8a 100644 --- a/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/support/MessageUtil.java +++ b/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/support/MessageUtil.java @@ -4,7 +4,6 @@ import java.util.*; import com.alibaba.otter.canal.connector.core.consumer.CommonMessage; import com.alibaba.otter.canal.protocol.CanalEntry; -import com.alibaba.otter.canal.protocol.FlatMessage; import com.alibaba.otter.canal.protocol.Message; /** @@ -20,7 +19,7 @@ public class MessageUtil { return null; } List entries = message.getEntries(); - List dmls = new ArrayList(entries.size()); + List dmls = new ArrayList<>(entries.size()); for (CanalEntry.Entry entry : entries) { if (entry.getEntryType() == CanalEntry.EntryType.TRANSACTIONBEGIN || entry.getEntryType() == CanalEntry.EntryType.TRANSACTIONEND) { @@ -136,7 +135,7 @@ public class MessageUtil { if (commonMessages == null) { return new ArrayList<>(); } - List dmls = new ArrayList(commonMessages.size()); + List dmls = new ArrayList<>(commonMessages.size()); for (CommonMessage commonMessage : commonMessages) { Dml dml = flatMessage2Dml(destination, groupId, commonMessage); if (dml != null) { diff --git a/client-adapter/common/src/test/java/com/alibaba/otter/canal/client/adapter/support/JdbcTypeUtilTest.java b/client-adapter/common/src/test/java/com/alibaba/otter/canal/client/adapter/support/JdbcTypeUtilTest.java index a4089bf9..fe8f612c 100644 --- a/client-adapter/common/src/test/java/com/alibaba/otter/canal/client/adapter/support/JdbcTypeUtilTest.java +++ b/client-adapter/common/src/test/java/com/alibaba/otter/canal/client/adapter/support/JdbcTypeUtilTest.java @@ -1,24 +1,13 @@ package com.alibaba.otter.canal.client.adapter.support; -import static org.mockito.AdditionalMatchers.or; -import static org.mockito.Matchers.isA; -import static org.mockito.Matchers.isNull; -import static org.powermock.api.mockito.PowerMockito.mockStatic; - -import com.alibaba.otter.canal.client.adapter.support.JdbcTypeUtil; -import com.alibaba.otter.canal.client.adapter.support.Util; import org.junit.Assert; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.rules.Timeout; import org.junit.runner.RunWith; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; -import java.lang.reflect.Array; - @RunWith(PowerMockRunner.class) public class JdbcTypeUtilTest { diff --git a/client-adapter/common/src/test/java/com/alibaba/otter/canal/client/adapter/support/UtilTest.java b/client-adapter/common/src/test/java/com/alibaba/otter/canal/client/adapter/support/UtilTest.java index 6f7595e8..86ae27f4 100644 --- a/client-adapter/common/src/test/java/com/alibaba/otter/canal/client/adapter/support/UtilTest.java +++ b/client-adapter/common/src/test/java/com/alibaba/otter/canal/client/adapter/support/UtilTest.java @@ -3,9 +3,7 @@ package com.alibaba.otter.canal.client.adapter.support; import static org.mockito.AdditionalMatchers.or; import static org.mockito.Matchers.isA; import static org.mockito.Matchers.isNull; -import static org.powermock.api.mockito.PowerMockito.mockStatic; -import com.alibaba.otter.canal.client.adapter.support.Util; import com.diffblue.deeptestutils.mock.DTUMemberMatcher; import org.apache.commons.lang.StringUtils; import org.junit.Assert; diff --git a/client/src/main/java/com/alibaba/otter/canal/client/impl/ClusterNodeAccessStrategy.java b/client/src/main/java/com/alibaba/otter/canal/client/impl/ClusterNodeAccessStrategy.java index 269d99dc..f58e7588 100644 --- a/client/src/main/java/com/alibaba/otter/canal/client/impl/ClusterNodeAccessStrategy.java +++ b/client/src/main/java/com/alibaba/otter/canal/client/impl/ClusterNodeAccessStrategy.java @@ -28,19 +28,14 @@ public class ClusterNodeAccessStrategy implements CanalNodeAccessStrategy { private IZkChildListener childListener; // 监听所有的服务器列表 private IZkDataListener dataListener; // 监听当前的工作节点 private ZkClientx zkClient; - private volatile List currentAddress = new ArrayList(); + private volatile List currentAddress = new ArrayList<>(); private volatile InetSocketAddress runningAddress = null; public ClusterNodeAccessStrategy(String destination, ZkClientx zkClient){ this.destination = destination; this.zkClient = zkClient; - childListener = new IZkChildListener() { - - public void handleChildChange(String parentPath, List currentChilds) throws Exception { - initClusters(currentChilds); - } - - }; + // handleChildChange + childListener = (parentPath, currentChilds) -> initClusters(currentChilds); dataListener = new IZkDataListener() { @@ -80,9 +75,9 @@ public class ClusterNodeAccessStrategy implements CanalNodeAccessStrategy { private void initClusters(List currentChilds) { if (currentChilds == null || currentChilds.isEmpty()) { - currentAddress = new ArrayList(); + currentAddress = new ArrayList<>(); } else { - List addresses = new ArrayList(); + List addresses = new ArrayList<>(); for (String address : currentChilds) { String[] strs = StringUtils.split(address, ":"); if (strs != null && strs.length == 2) { diff --git a/client/src/main/java/com/alibaba/otter/canal/client/impl/SimpleCanalConnector.java b/client/src/main/java/com/alibaba/otter/canal/client/impl/SimpleCanalConnector.java index ea537f3c..0e60f720 100644 --- a/client/src/main/java/com/alibaba/otter/canal/client/impl/SimpleCanalConnector.java +++ b/client/src/main/java/com/alibaba/otter/canal/client/impl/SimpleCanalConnector.java @@ -64,7 +64,7 @@ public class SimpleCanalConnector implements CanalConnector { private SocketChannel channel; private ReadableByteChannel readableChannel; private WritableByteChannel writableChannel; - private List supportedCompressions = new ArrayList(); + private List supportedCompressions = new ArrayList<>(); private ClientIdentity clientIdentity; private ClientRunningMonitor runningMonitor; // 运行控制 private ZkClientx zkClientx; diff --git a/client/src/main/java/com/alibaba/otter/canal/client/impl/SimpleNodeAccessStrategy.java b/client/src/main/java/com/alibaba/otter/canal/client/impl/SimpleNodeAccessStrategy.java index 1363ab87..5e43bb05 100644 --- a/client/src/main/java/com/alibaba/otter/canal/client/impl/SimpleNodeAccessStrategy.java +++ b/client/src/main/java/com/alibaba/otter/canal/client/impl/SimpleNodeAccessStrategy.java @@ -14,7 +14,7 @@ import com.alibaba.otter.canal.client.CanalNodeAccessStrategy; */ public class SimpleNodeAccessStrategy implements CanalNodeAccessStrategy { - private List nodes = new ArrayList(); + private List nodes = new ArrayList<>(); private int index = 0; public SimpleNodeAccessStrategy(List nodes){ diff --git a/client/src/main/java/com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.java b/client/src/main/java/com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.java index 9de7f4ee..48b29d59 100644 --- a/client/src/main/java/com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.java +++ b/client/src/main/java/com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.java @@ -72,12 +72,7 @@ public class ClientRunningMonitor extends AbstractCanalLifeCycle { initRunning(); } else { // 否则就是等待delayTime,避免因网络瞬端或者zk异常,导致出现频繁的切换操作 - delayExector.schedule(new Runnable() { - - public void run() { - initRunning(); - } - }, delayTime, TimeUnit.SECONDS); + delayExector.schedule(() -> initRunning(), delayTime, TimeUnit.SECONDS); } } diff --git a/client/src/main/java/com/alibaba/otter/canal/client/kafka/KafkaCanalConnector.java b/client/src/main/java/com/alibaba/otter/canal/client/kafka/KafkaCanalConnector.java index 771a4ad0..aa8c41f8 100644 --- a/client/src/main/java/com/alibaba/otter/canal/client/kafka/KafkaCanalConnector.java +++ b/client/src/main/java/com/alibaba/otter/canal/client/kafka/KafkaCanalConnector.java @@ -80,11 +80,11 @@ public class KafkaCanalConnector implements CanalMQConnector { connected = true; if (kafkaConsumer == null && !flatMessage) { - kafkaConsumer = new KafkaConsumer(properties); + kafkaConsumer = new KafkaConsumer<>(properties); } if (kafkaConsumer2 == null && flatMessage) { - kafkaConsumer2 = new KafkaConsumer(properties); + kafkaConsumer2 = new KafkaConsumer<>(properties); } } diff --git a/client/src/test/java/com/alibaba/otter/canal/client/running/ClientRunningTest.java b/client/src/test/java/com/alibaba/otter/canal/client/running/ClientRunningTest.java index 3ea75c90..3ca36862 100644 --- a/client/src/test/java/com/alibaba/otter/canal/client/running/ClientRunningTest.java +++ b/client/src/test/java/com/alibaba/otter/canal/client/running/ClientRunningTest.java @@ -59,49 +59,37 @@ public class ClientRunningTest extends AbstractZkTest { final ClientRunningMonitor runningMonitor2 = buildClientRunning(countLatch, clientId, 2089); final ClientRunningMonitor runningMonitor3 = buildClientRunning(countLatch, clientId, 2090); final ExecutorService executor = Executors.newFixedThreadPool(3); - executor.submit(new Runnable() { - - public void run() { - for (int i = 0; i < 10; i++) { - if (!runningMonitor1.isStart()) { - runningMonitor1.start(); - } - sleep(2000L + RandomUtils.nextInt(500)); - runningMonitor1.stop(); - sleep(2000L + RandomUtils.nextInt(500)); + executor.submit(() -> { + for (int i = 0; i < 10; i++) { + if (!runningMonitor1.isStart()) { + runningMonitor1.start(); } + sleep(2000L + RandomUtils.nextInt(500)); + runningMonitor1.stop(); + sleep(2000L + RandomUtils.nextInt(500)); } - }); - executor.submit(new Runnable() { - - public void run() { - for (int i = 0; i < 10; i++) { - if (!runningMonitor2.isStart()) { - runningMonitor2.start(); - } - sleep(2000L + RandomUtils.nextInt(500)); - runningMonitor2.stop(); - sleep(2000L + RandomUtils.nextInt(500)); + executor.submit(() -> { + for (int i = 0; i < 10; i++) { + if (!runningMonitor2.isStart()) { + runningMonitor2.start(); } + sleep(2000L + RandomUtils.nextInt(500)); + runningMonitor2.stop(); + sleep(2000L + RandomUtils.nextInt(500)); } - }); - executor.submit(new Runnable() { - - public void run() { - for (int i = 0; i < 10; i++) { - if (!runningMonitor3.isStart()) { - runningMonitor3.start(); - } - sleep(2000L + RandomUtils.nextInt(500)); - runningMonitor3.stop(); - sleep(2000L + RandomUtils.nextInt(500)); + executor.submit(() -> { + for (int i = 0; i < 10; i++) { + if (!runningMonitor3.isStart()) { + runningMonitor3.start(); } + sleep(2000L + RandomUtils.nextInt(500)); + runningMonitor3.stop(); + sleep(2000L + RandomUtils.nextInt(500)); } - }); sleep(30000L); diff --git a/common/src/main/java/com/alibaba/otter/canal/common/utils/ExecutorTemplate.java b/common/src/main/java/com/alibaba/otter/canal/common/utils/ExecutorTemplate.java index dfe68069..13811d0f 100644 --- a/common/src/main/java/com/alibaba/otter/canal/common/utils/ExecutorTemplate.java +++ b/common/src/main/java/com/alibaba/otter/canal/common/utils/ExecutorTemplate.java @@ -34,7 +34,7 @@ public class ExecutorTemplate { private volatile List futures = null; public ExecutorTemplate(ThreadPoolExecutor executor){ - this.futures = Collections.synchronizedList(new ArrayList()); + this.futures = Collections.synchronizedList(new ArrayList<>()); this.executor = executor; } diff --git a/common/src/main/java/com/alibaba/otter/canal/common/utils/JsonUtils.java b/common/src/main/java/com/alibaba/otter/canal/common/utils/JsonUtils.java index 618f8a78..e430e583 100644 --- a/common/src/main/java/com/alibaba/otter/canal/common/utils/JsonUtils.java +++ b/common/src/main/java/com/alibaba/otter/canal/common/utils/JsonUtils.java @@ -75,13 +75,7 @@ public class JsonUtils { SerializeWriter out = new SerializeWriter(); try { JSONSerializer serializer = new JSONSerializer(out); - serializer.getPropertyFilters().add(new PropertyFilter() { - - public boolean apply(Object source, String name, Object value) { - return !propertyFliters.contains(name); - } - - }); + serializer.getPropertyFilters().add((source, name, value) -> !propertyFliters.contains(name)); serializer.write(obj); return out.toString(); } finally { diff --git a/common/src/main/java/com/alibaba/otter/canal/common/utils/NamedThreadFactory.java b/common/src/main/java/com/alibaba/otter/canal/common/utils/NamedThreadFactory.java index eeb94c4a..f06cf11d 100644 --- a/common/src/main/java/com/alibaba/otter/canal/common/utils/NamedThreadFactory.java +++ b/common/src/main/java/com/alibaba/otter/canal/common/utils/NamedThreadFactory.java @@ -19,18 +19,14 @@ public class NamedThreadFactory implements ThreadFactory { final private boolean daemon; final private ThreadGroup group; final private AtomicInteger threadNumber = new AtomicInteger(0); - final static UncaughtExceptionHandler uncaughtExceptionHandler = new UncaughtExceptionHandler() { + final static UncaughtExceptionHandler uncaughtExceptionHandler = (t, e) -> { + if (e instanceof InterruptedException + || (e.getCause() != null && e.getCause() instanceof InterruptedException)) { + return; + } - public void uncaughtException(Thread t, - Throwable e) { - if (e instanceof InterruptedException - || (e.getCause() != null && e.getCause() instanceof InterruptedException)) { - return; - } - - logger.error("from " + t.getName(), e); - } - }; + logger.error("from " + t.getName(), e); + }; public NamedThreadFactory(){ this(DEFAULT_NAME, true); diff --git a/common/src/main/java/com/alibaba/otter/canal/common/utils/UriUtils.java b/common/src/main/java/com/alibaba/otter/canal/common/utils/UriUtils.java index 130666b6..829daec1 100644 --- a/common/src/main/java/com/alibaba/otter/canal/common/utils/UriUtils.java +++ b/common/src/main/java/com/alibaba/otter/canal/common/utils/UriUtils.java @@ -53,7 +53,7 @@ public final class UriUtils { return Collections.EMPTY_MAP; } String query = uri.getRawQuery(); - HashMap params = new HashMap(); + HashMap params = new HashMap<>(); @SuppressWarnings("resource") Scanner scan = new Scanner(query); scan.useDelimiter(SPLIT); diff --git a/common/src/main/java/com/alibaba/otter/canal/common/zookeeper/ZkClientx.java b/common/src/main/java/com/alibaba/otter/canal/common/zookeeper/ZkClientx.java index 268d32d2..1c6b6165 100644 --- a/common/src/main/java/com/alibaba/otter/canal/common/zookeeper/ZkClientx.java +++ b/common/src/main/java/com/alibaba/otter/canal/common/zookeeper/ZkClientx.java @@ -23,12 +23,7 @@ import com.google.common.collect.MigrateMap; public class ZkClientx extends ZkClient { // 对于zkclient进行一次缓存,避免一个jvm内部使用多个zk connection - private static Map clients = MigrateMap.makeComputingMap(new Function() { - - public ZkClientx apply(String servers) { - return new ZkClientx(servers); - } - }); + private static Map clients = MigrateMap.makeComputingMap(ZkClientx::new); public static ZkClientx getZkClient(String servers) { return clients.get(servers); diff --git a/common/src/main/java/com/alibaba/otter/canal/common/zookeeper/running/ServerRunningMonitor.java b/common/src/main/java/com/alibaba/otter/canal/common/zookeeper/running/ServerRunningMonitor.java index 3d6dc79a..fe983dc2 100644 --- a/common/src/main/java/com/alibaba/otter/canal/common/zookeeper/running/ServerRunningMonitor.java +++ b/common/src/main/java/com/alibaba/otter/canal/common/zookeeper/running/ServerRunningMonitor.java @@ -73,12 +73,7 @@ public class ServerRunningMonitor extends AbstractCanalLifeCycle { initRunning(); } else { // 否则就是等待delayTime,避免因网络瞬端或者zk异常,导致出现频繁的切换操作 - delayExector.schedule(new Runnable() { - - public void run() { - initRunning(); - } - }, delayTime, TimeUnit.SECONDS); + delayExector.schedule(() -> initRunning(), delayTime, TimeUnit.SECONDS); } } diff --git a/common/src/main/java/com/google/common/collect/MigrateMap.java b/common/src/main/java/com/google/common/collect/MigrateMap.java index 402bffaf..506c0130 100644 --- a/common/src/main/java/com/google/common/collect/MigrateMap.java +++ b/common/src/main/java/com/google/common/collect/MigrateMap.java @@ -24,7 +24,7 @@ public class MigrateMap { } }); - return new MigrateConcurrentMap(computingCache); + return new MigrateConcurrentMap<>(computingCache); } public static ConcurrentMap makeComputingMap(Function computingFunction) { diff --git a/common/src/test/java/com/alibaba/otter/canal/common/ServerRunningTest.java b/common/src/test/java/com/alibaba/otter/canal/common/ServerRunningTest.java index 06f843f1..942ab81b 100644 --- a/common/src/test/java/com/alibaba/otter/canal/common/ServerRunningTest.java +++ b/common/src/test/java/com/alibaba/otter/canal/common/ServerRunningTest.java @@ -57,55 +57,43 @@ public class ServerRunningTest extends AbstractZkTest { final ServerRunningMonitor runningMonitor2 = buildServerRunning(countLatch, "127.0.0.1", 2089); final ServerRunningMonitor runningMonitor3 = buildServerRunning(countLatch, "127.0.0.1", 2090); final ExecutorService executor = Executors.newFixedThreadPool(3); - executor.submit(new Runnable() { - - public void run() { - for (int i = 0; i < 10; i++) { - if (!runningMonitor1.isStart()) { - runningMonitor1.start(); - } - sleep(2000L + RandomUtils.nextInt(500)); - if (runningMonitor1.check()) { - runningMonitor1.stop(); - } - sleep(2000L + RandomUtils.nextInt(500)); + executor.submit(() -> { + for (int i = 0; i < 10; i++) { + if (!runningMonitor1.isStart()) { + runningMonitor1.start(); } + sleep(2000L + RandomUtils.nextInt(500)); + if (runningMonitor1.check()) { + runningMonitor1.stop(); + } + sleep(2000L + RandomUtils.nextInt(500)); } - }); - executor.submit(new Runnable() { - - public void run() { - for (int i = 0; i < 10; i++) { - if (!runningMonitor2.isStart()) { - runningMonitor2.start(); - } - sleep(2000L + RandomUtils.nextInt(500)); - if (runningMonitor2.check()) { - runningMonitor2.stop(); - } - sleep(2000L + RandomUtils.nextInt(500)); + executor.submit(() -> { + for (int i = 0; i < 10; i++) { + if (!runningMonitor2.isStart()) { + runningMonitor2.start(); } + sleep(2000L + RandomUtils.nextInt(500)); + if (runningMonitor2.check()) { + runningMonitor2.stop(); + } + sleep(2000L + RandomUtils.nextInt(500)); } - }); - executor.submit(new Runnable() { - - public void run() { - for (int i = 0; i < 10; i++) { - if (!runningMonitor3.isStart()) { - runningMonitor3.start(); - } - sleep(2000L + RandomUtils.nextInt(500)); - if (runningMonitor3.check()) { - runningMonitor3.stop(); - } - sleep(2000L + RandomUtils.nextInt(500)); + executor.submit(() -> { + for (int i = 0; i < 10; i++) { + if (!runningMonitor3.isStart()) { + runningMonitor3.start(); } + sleep(2000L + RandomUtils.nextInt(500)); + if (runningMonitor3.check()) { + runningMonitor3.stop(); + } + sleep(2000L + RandomUtils.nextInt(500)); } - }); sleep(30000L); diff --git a/connector/core/src/main/java/com/alibaba/otter/canal/connector/core/filter/AviaterRegexFilter.java b/connector/core/src/main/java/com/alibaba/otter/canal/connector/core/filter/AviaterRegexFilter.java index 77bb6fff..1a370cf1 100644 --- a/connector/core/src/main/java/com/alibaba/otter/canal/connector/core/filter/AviaterRegexFilter.java +++ b/connector/core/src/main/java/com/alibaba/otter/canal/connector/core/filter/AviaterRegexFilter.java @@ -42,7 +42,7 @@ public class AviaterRegexFilter { this.defaultEmptyValue = defaultEmptyValue; List list = null; if (StringUtils.isEmpty(pattern)) { - list = new ArrayList(); + list = new ArrayList<>(); } else { String[] ss = StringUtils.split(pattern, SPLIT); list = Arrays.asList(ss); @@ -66,7 +66,7 @@ public class AviaterRegexFilter { return defaultEmptyValue; } - Map env = new HashMap(); + Map env = new HashMap<>(); env.put("pattern", pattern); env.put("target", filtered.toLowerCase()); return (Boolean) exp.execute(env); @@ -112,7 +112,7 @@ public class AviaterRegexFilter { */ private List completionPattern(List patterns) { - List result = new ArrayList(); + List result = new ArrayList<>(); for (String pattern : patterns) { StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append("^"); diff --git a/connector/core/src/main/java/com/alibaba/otter/canal/connector/core/producer/AbstractMQProducer.java b/connector/core/src/main/java/com/alibaba/otter/canal/connector/core/producer/AbstractMQProducer.java index 940e8fc5..0334e4d7 100644 --- a/connector/core/src/main/java/com/alibaba/otter/canal/connector/core/producer/AbstractMQProducer.java +++ b/connector/core/src/main/java/com/alibaba/otter/canal/connector/core/producer/AbstractMQProducer.java @@ -35,7 +35,7 @@ public abstract class AbstractMQProducer implements CanalMQProducer { parallelBuildThreadSize, 0, TimeUnit.SECONDS, - new ArrayBlockingQueue(parallelBuildThreadSize * 2), + new ArrayBlockingQueue<>(parallelBuildThreadSize * 2), new NamedThreadFactory("MQ-Parallel-Builder"), new ThreadPoolExecutor.CallerRunsPolicy()); @@ -44,7 +44,7 @@ public abstract class AbstractMQProducer implements CanalMQProducer { parallelSendThreadSize, 0, TimeUnit.SECONDS, - new ArrayBlockingQueue(parallelSendThreadSize * 2), + new ArrayBlockingQueue<>(parallelSendThreadSize * 2), new NamedThreadFactory("MQ-Parallel-Sender"), new ThreadPoolExecutor.CallerRunsPolicy()); } diff --git a/connector/core/src/main/java/com/alibaba/otter/canal/connector/core/producer/MQMessageUtils.java b/connector/core/src/main/java/com/alibaba/otter/canal/connector/core/producer/MQMessageUtils.java index 1c3b39c8..49b7c21f 100644 --- a/connector/core/src/main/java/com/alibaba/otter/canal/connector/core/producer/MQMessageUtils.java +++ b/connector/core/src/main/java/com/alibaba/otter/canal/connector/core/producer/MQMessageUtils.java @@ -75,64 +75,58 @@ public class MQMessageUtils { private static Map> dynamicTopicDatas = MigrateMap.makeComputingMap(CacheBuilder.newBuilder() .softValues(), - new Function>() { + pkHashConfigs -> { + List datas = Lists.newArrayList(); + String[] dynamicTopicArray = StringUtils.split(StringUtils.replace(pkHashConfigs, + ",", + ";"), + ";"); + // schema.table + for (String dynamicTopic : dynamicTopicArray) { + DynamicTopicData data = new DynamicTopicData(); - public List apply(String pkHashConfigs) { - List datas = Lists.newArrayList(); - String[] dynamicTopicArray = StringUtils.split(StringUtils.replace(pkHashConfigs, - ",", - ";"), - ";"); - // schema.table - for (String dynamicTopic : dynamicTopicArray) { - DynamicTopicData data = new DynamicTopicData(); + if (!isWildCard(dynamicTopic)) { + data.simpleName = dynamicTopic; + } else { + if (dynamicTopic.contains("\\.")) { + data.tableRegexFilter = new AviaterRegexFilter(dynamicTopic); + } else { + data.schemaRegexFilter = new AviaterRegexFilter(dynamicTopic); + } + } + datas.add(data); + } - if (!isWildCard(dynamicTopic)) { - data.simpleName = dynamicTopic; - } else { - if (dynamicTopic.contains("\\.")) { - data.tableRegexFilter = new AviaterRegexFilter(dynamicTopic); - } else { - data.schemaRegexFilter = new AviaterRegexFilter(dynamicTopic); - } - } - datas.add(data); - } - - return datas; - } - }); + return datas; + }); private static Map> topicPartitionDatas = MigrateMap.makeComputingMap(CacheBuilder.newBuilder() .softValues(), - new Function>() { - - public List apply(String tPConfigs) { - List datas = Lists.newArrayList(); - String[] tPArray = StringUtils.split(StringUtils.replace(tPConfigs, - ",", - ";"), - ";"); - for (String tPConfig : tPArray) { - TopicPartitionData data = new TopicPartitionData(); - int i = tPConfig.lastIndexOf(":"); - if (i > 0) { - String tStr = tPConfig.substring(0, i); - String pStr = tPConfig.substring(i + 1); - if (!isWildCard(tStr)) { - data.simpleName = tStr; - } else { - data.regexFilter = new AviaterRegexFilter(tStr); - } - if (!StringUtils.isEmpty(pStr) && StringUtils.isNumeric(pStr)) { - data.partitionNum = Integer.valueOf(pStr); - } - datas.add(data); + tPConfigs -> { + List datas = Lists.newArrayList(); + String[] tPArray = StringUtils.split(StringUtils.replace(tPConfigs, + ",", + ";"), + ";"); + for (String tPConfig : tPArray) { + TopicPartitionData data = new TopicPartitionData(); + int i = tPConfig.lastIndexOf(":"); + if (i > 0) { + String tStr = tPConfig.substring(0, i); + String pStr = tPConfig.substring(i + 1); + if (!isWildCard(tStr)) { + data.simpleName = tStr; + } else { + data.regexFilter = new AviaterRegexFilter(tStr); } + if (!StringUtils.isEmpty(pStr) && StringUtils.isNumeric(pStr)) { + data.partitionNum = Integer.valueOf(pStr); + } + datas.add(data); } - - return datas; } + + return datas; }); /** @@ -206,19 +200,15 @@ public class MQMessageUtils { int i = 0; for (ByteString byteString : rawEntries) { final int index = i; - template.submit(new Runnable() { - - @Override - public void run() { - try { - Entry entry = Entry.parseFrom(byteString); - CanalEntry.RowChange rowChange = CanalEntry.RowChange.parseFrom(entry.getStoreValue()); - datas[index] = new EntryRowData(); - datas[index].entry = entry; - datas[index].rowChange = rowChange; - } catch (InvalidProtocolBufferException e) { - throw new RuntimeException(e); - } + template.submit(() -> { + try { + Entry entry = Entry.parseFrom(byteString); + RowChange rowChange = RowChange.parseFrom(entry.getStoreValue()); + datas[index] = new EntryRowData(); + datas[index].entry = entry; + datas[index].rowChange = rowChange; + } catch (InvalidProtocolBufferException e) { + throw new RuntimeException(e); } }); @@ -232,18 +222,14 @@ public class MQMessageUtils { int i = 0; for (Entry entry : message.getEntries()) { final int index = i; - template.submit(new Runnable() { - - @Override - public void run() { - try { - CanalEntry.RowChange rowChange = CanalEntry.RowChange.parseFrom(entry.getStoreValue()); - datas[index] = new EntryRowData(); - datas[index].entry = entry; - datas[index].rowChange = rowChange; - } catch (InvalidProtocolBufferException e) { - throw new RuntimeException(e); - } + template.submit(() -> { + try { + RowChange rowChange = RowChange.parseFrom(entry.getStoreValue()); + datas[index] = new EntryRowData(); + datas[index].entry = entry; + datas[index].rowChange = rowChange; + } catch (InvalidProtocolBufferException e) { + throw new RuntimeException(e); } }); @@ -679,7 +665,7 @@ public class MQMessageUtils { CanalEntry.Entry entry) { Message message = messageMap.get(topicName); if (message == null) { - message = new Message(messageId, new ArrayList()); + message = new Message(messageId, new ArrayList<>()); messageMap.put(topicName, message); } message.getEntries().add(entry); diff --git a/connector/rabbitmq-connector/src/main/java/com/alibaba/otter/canal/connector/rabbitmq/producer/CanalRabbitMQProducer.java b/connector/rabbitmq-connector/src/main/java/com/alibaba/otter/canal/connector/rabbitmq/producer/CanalRabbitMQProducer.java index 36e795e4..7fd48e50 100644 --- a/connector/rabbitmq-connector/src/main/java/com/alibaba/otter/canal/connector/rabbitmq/producer/CanalRabbitMQProducer.java +++ b/connector/rabbitmq-connector/src/main/java/com/alibaba/otter/canal/connector/rabbitmq/producer/CanalRabbitMQProducer.java @@ -120,13 +120,7 @@ public class CanalRabbitMQProducer extends AbstractMQProducer implements CanalMQ final String topicName = entry.getKey().replace('.', '_'); final com.alibaba.otter.canal.protocol.Message messageSub = entry.getValue(); - template.submit(new Runnable() { - - @Override - public void run() { - send(destination, topicName, messageSub); - } - }); + template.submit(() -> send(destination, topicName, messageSub)); } template.waitForResult(); diff --git a/dbsync/src/main/java/com/taobao/tddl/dbsync/binlog/JsonDiffConversion.java b/dbsync/src/main/java/com/taobao/tddl/dbsync/binlog/JsonDiffConversion.java index 223b5d9c..878a0751 100644 --- a/dbsync/src/main/java/com/taobao/tddl/dbsync/binlog/JsonDiffConversion.java +++ b/dbsync/src/main/java/com/taobao/tddl/dbsync/binlog/JsonDiffConversion.java @@ -37,7 +37,7 @@ public class JsonDiffConversion { public static StringBuilder print_json_diff(LogBuffer buffer, long len, String columnName, int columnIndex, String charsetName) { int position = buffer.position(); - List operation_names = new ArrayList(); + List operation_names = new ArrayList<>(); while (buffer.hasRemaining()) { int operation_int = buffer.getUint8(); if (operation_int >= JSON_DIFF_OPERATION_COUNT) { diff --git a/dbsync/src/main/java/com/taobao/tddl/dbsync/binlog/LogContext.java b/dbsync/src/main/java/com/taobao/tddl/dbsync/binlog/LogContext.java index 0668ac4e..eeef858e 100644 --- a/dbsync/src/main/java/com/taobao/tddl/dbsync/binlog/LogContext.java +++ b/dbsync/src/main/java/com/taobao/tddl/dbsync/binlog/LogContext.java @@ -16,7 +16,7 @@ import com.taobao.tddl.dbsync.binlog.event.TableMapLogEvent; */ public final class LogContext { - private final Map mapOfTable = new HashMap(); + private final Map mapOfTable = new HashMap<>(); private FormatDescriptionLogEvent formatDescription; diff --git a/dbsync/src/main/java/com/taobao/tddl/dbsync/binlog/event/TableMapLogEvent.java b/dbsync/src/main/java/com/taobao/tddl/dbsync/binlog/event/TableMapLogEvent.java index 79fa4147..27651c6e 100644 --- a/dbsync/src/main/java/com/taobao/tddl/dbsync/binlog/event/TableMapLogEvent.java +++ b/dbsync/src/main/java/com/taobao/tddl/dbsync/binlog/event/TableMapLogEvent.java @@ -601,7 +601,7 @@ public final class TableMapLogEvent extends LogEvent { private void parse_signedness(LogBuffer buffer, int length) { // stores the signedness flags extracted from field - List datas = new ArrayList(); + List datas = new ArrayList<>(); for (int i = 0; i < length; i++) { int ut = buffer.getUint8(); for (int c = 0x80; c != 0; c >>= 1) { @@ -622,7 +622,7 @@ public final class TableMapLogEvent extends LogEvent { // stores collation numbers extracted from field. int limit = buffer.position() + length; this.default_charset = (int) buffer.getPackedLong(); - List datas = new ArrayList(); + List datas = new ArrayList<>(); while (buffer.hasRemaining() && buffer.position() < limit) { int col_index = (int) buffer.getPackedLong(); int col_charset = (int) buffer.getPackedLong(); @@ -639,7 +639,7 @@ public final class TableMapLogEvent extends LogEvent { private List parse_column_charset(LogBuffer buffer, int length) { // stores collation numbers extracted from field. int limit = buffer.position() + length; - List datas = new ArrayList(); + List datas = new ArrayList<>(); while (buffer.hasRemaining() && buffer.position() < limit) { int col_charset = (int) buffer.getPackedLong(); datas.add(col_charset); @@ -664,10 +664,10 @@ public final class TableMapLogEvent extends LogEvent { // into a string separate vector. All of them are stored // in 'vec'. int limit = buffer.position() + length; - List> datas = new ArrayList>(); + List> datas = new ArrayList<>(); while (buffer.hasRemaining() && buffer.position() < limit) { int count = (int) buffer.getPackedLong(); - List data = new ArrayList(count); + List data = new ArrayList<>(count); for (int i = 0; i < count; i++) { int len1 = (int) buffer.getPackedLong(); data.add(buffer.getFixString(len1)); @@ -694,7 +694,7 @@ public final class TableMapLogEvent extends LogEvent { // stores geometry column's types extracted from field. int limit = buffer.position() + length; - List datas = new ArrayList(); + List datas = new ArrayList<>(); while (buffer.hasRemaining() && buffer.position() < limit) { int col_type = (int) buffer.getPackedLong(); datas.add(col_type); diff --git a/dbsync/src/test/java/com/taobao/tddl/dbsync/binlog/event/LogHeaderTest.java b/dbsync/src/test/java/com/taobao/tddl/dbsync/binlog/event/LogHeaderTest.java index 8392b07f..4e89b829 100644 --- a/dbsync/src/test/java/com/taobao/tddl/dbsync/binlog/event/LogHeaderTest.java +++ b/dbsync/src/test/java/com/taobao/tddl/dbsync/binlog/event/LogHeaderTest.java @@ -30,7 +30,7 @@ public class LogHeaderTest { final LogHeader objectUnderTest = new LogHeader(type); // Assert side effects - final HashMap hashMap = new HashMap(); + final HashMap hashMap = new HashMap<>(); Assert.assertEquals(hashMap, objectUnderTest.gtidMap); } diff --git a/deployer/src/main/java/com/alibaba/otter/canal/deployer/CanalController.java b/deployer/src/main/java/com/alibaba/otter/canal/deployer/CanalController.java index 0a0a3980..02421ca8 100644 --- a/deployer/src/main/java/com/alibaba/otter/canal/deployer/CanalController.java +++ b/deployer/src/main/java/com/alibaba/otter/canal/deployer/CanalController.java @@ -74,12 +74,7 @@ public class CanalController { } public CanalController(final Properties properties){ - managerClients = MigrateMap.makeComputingMap(new Function() { - - public PlainCanalConfigClient apply(String managerAddress) { - return getManagerClient(managerAddress); - } - }); + managerClients = MigrateMap.makeComputingMap(this::getManagerClient); // 初始化全局参数设置 globalInstanceConfig = initGlobalConfig(properties); @@ -147,85 +142,82 @@ public class CanalController { final ServerRunningData serverData = new ServerRunningData(registerIp + ":" + port); ServerRunningMonitors.setServerData(serverData); - ServerRunningMonitors.setRunningMonitors(MigrateMap.makeComputingMap(new Function() { + ServerRunningMonitors.setRunningMonitors(MigrateMap.makeComputingMap((Function) destination -> { + ServerRunningMonitor runningMonitor = new ServerRunningMonitor(serverData); + runningMonitor.setDestination(destination); + runningMonitor.setListener(new ServerRunningListener() { - public ServerRunningMonitor apply(final String destination) { - ServerRunningMonitor runningMonitor = new ServerRunningMonitor(serverData); - runningMonitor.setDestination(destination); - runningMonitor.setListener(new ServerRunningListener() { - - public void processActiveEnter() { - try { - MDC.put(CanalConstants.MDC_DESTINATION, String.valueOf(destination)); - embededCanalServer.start(destination); - if (canalMQStarter != null) { - canalMQStarter.startDestination(destination); - } - } finally { - MDC.remove(CanalConstants.MDC_DESTINATION); + public void processActiveEnter() { + try { + MDC.put(CanalConstants.MDC_DESTINATION, String.valueOf(destination)); + embededCanalServer.start(destination); + if (canalMQStarter != null) { + canalMQStarter.startDestination(destination); } + } finally { + MDC.remove(CanalConstants.MDC_DESTINATION); } - - public void processActiveExit() { - try { - MDC.put(CanalConstants.MDC_DESTINATION, String.valueOf(destination)); - if (canalMQStarter != null) { - canalMQStarter.stopDestination(destination); - } - embededCanalServer.stop(destination); - } finally { - MDC.remove(CanalConstants.MDC_DESTINATION); - } - } - - public void processStart() { - try { - if (zkclientx != null) { - final String path = ZookeeperPathUtils.getDestinationClusterNode(destination, - registerIp + ":" + port); - initCid(path); - zkclientx.subscribeStateChanges(new IZkStateListener() { - - public void handleStateChanged(KeeperState state) throws Exception { - - } - - public void handleNewSession() throws Exception { - initCid(path); - } - - @Override - public void handleSessionEstablishmentError(Throwable error) throws Exception { - logger.error("failed to connect to zookeeper", error); - } - }); - } - } finally { - MDC.remove(CanalConstants.MDC_DESTINATION); - } - } - - public void processStop() { - try { - MDC.put(CanalConstants.MDC_DESTINATION, String.valueOf(destination)); - if (zkclientx != null) { - final String path = ZookeeperPathUtils.getDestinationClusterNode(destination, - registerIp + ":" + port); - releaseCid(path); - } - } finally { - MDC.remove(CanalConstants.MDC_DESTINATION); - } - } - - }); - if (zkclientx != null) { - runningMonitor.setZkClient(zkclientx); } - // 触发创建一下cid节点 - runningMonitor.init(); - return runningMonitor; + + public void processActiveExit() { + try { + MDC.put(CanalConstants.MDC_DESTINATION, String.valueOf(destination)); + if (canalMQStarter != null) { + canalMQStarter.stopDestination(destination); + } + embededCanalServer.stop(destination); + } finally { + MDC.remove(CanalConstants.MDC_DESTINATION); + } + } + + public void processStart() { + try { + if (zkclientx != null) { + final String path = ZookeeperPathUtils.getDestinationClusterNode(destination, + registerIp + ":" + port); + initCid(path); + zkclientx.subscribeStateChanges(new IZkStateListener() { + + public void handleStateChanged(KeeperState state) throws Exception { + + } + + public void handleNewSession() throws Exception { + initCid(path); + } + + @Override + public void handleSessionEstablishmentError(Throwable error) throws Exception { + logger.error("failed to connect to zookeeper", error); + } + }); + } + } finally { + MDC.remove(CanalConstants.MDC_DESTINATION); + } + } + + public void processStop() { + try { + MDC.put(CanalConstants.MDC_DESTINATION, String.valueOf(destination)); + if (zkclientx != null) { + final String path = ZookeeperPathUtils.getDestinationClusterNode(destination, + registerIp + ":" + port); + releaseCid(path); + } + } finally { + MDC.remove(CanalConstants.MDC_DESTINATION); + } + } + + }); + if (zkclientx != null) { + runningMonitor.setZkClient(zkclientx); } + // 触发创建一下cid节点 + runningMonitor.init(); + return runningMonitor; })); // 初始化monitor机制 @@ -303,40 +295,37 @@ public class CanalController { } }; - instanceConfigMonitors = MigrateMap.makeComputingMap(new Function() { + instanceConfigMonitors = MigrateMap.makeComputingMap(mode -> { + int scanInterval = Integer.valueOf(getProperty(properties, + CanalConstants.CANAL_AUTO_SCAN_INTERVAL, + "5")); - public InstanceConfigMonitor apply(InstanceMode mode) { - int scanInterval = Integer.valueOf(getProperty(properties, - CanalConstants.CANAL_AUTO_SCAN_INTERVAL, - "5")); - - if (mode.isSpring()) { - SpringInstanceConfigMonitor monitor = new SpringInstanceConfigMonitor(); - monitor.setScanIntervalInSecond(scanInterval); - monitor.setDefaultAction(defaultAction); - // 设置conf目录,默认是user.dir + conf目录组成 - String rootDir = getProperty(properties, CanalConstants.CANAL_CONF_DIR); - if (StringUtils.isEmpty(rootDir)) { - rootDir = "../conf"; - } - - if (StringUtils.equals("otter-canal", System.getProperty("appName"))) { - monitor.setRootConf(rootDir); - } else { - // eclipse debug模式 - monitor.setRootConf("src/main/resources/"); - } - return monitor; - } else if (mode.isManager()) { - ManagerInstanceConfigMonitor monitor = new ManagerInstanceConfigMonitor(); - monitor.setScanIntervalInSecond(scanInterval); - monitor.setDefaultAction(defaultAction); - String managerAddress = getProperty(properties, CanalConstants.CANAL_ADMIN_MANAGER); - monitor.setConfigClient(getManagerClient(managerAddress)); - return monitor; - } else { - throw new UnsupportedOperationException("unknow mode :" + mode + " for monitor"); + if (mode.isSpring()) { + SpringInstanceConfigMonitor monitor = new SpringInstanceConfigMonitor(); + monitor.setScanIntervalInSecond(scanInterval); + monitor.setDefaultAction(defaultAction); + // 设置conf目录,默认是user.dir + conf目录组成 + String rootDir = getProperty(properties, CanalConstants.CANAL_CONF_DIR); + if (StringUtils.isEmpty(rootDir)) { + rootDir = "../conf"; } + + if (StringUtils.equals("otter-canal", System.getProperty("appName"))) { + monitor.setRootConf(rootDir); + } else { + // eclipse debug模式 + monitor.setRootConf("src/main/resources/"); + } + return monitor; + } else if (mode.isManager()) { + ManagerInstanceConfigMonitor monitor = new ManagerInstanceConfigMonitor(); + monitor.setScanIntervalInSecond(scanInterval); + monitor.setDefaultAction(defaultAction); + String managerAddress = getProperty(properties, CanalConstants.CANAL_ADMIN_MANAGER); + monitor.setConfigClient(getManagerClient(managerAddress)); + return monitor; + } else { + throw new UnsupportedOperationException("unknow mode :" + mode + " for monitor"); } }); } @@ -373,27 +362,23 @@ public class CanalController { globalConfig.setSpringXml(springXml); } - instanceGenerator = new CanalInstanceGenerator() { - - public CanalInstance generate(String destination) { - InstanceConfig config = instanceConfigs.get(destination); - if (config == null) { - throw new CanalServerException("can't find destination:" + destination); - } - - if (config.getMode().isManager()) { - PlainCanalInstanceGenerator instanceGenerator = new PlainCanalInstanceGenerator(properties); - instanceGenerator.setCanalConfigClient(managerClients.get(config.getManagerAddress())); - instanceGenerator.setSpringXml(config.getSpringXml()); - return instanceGenerator.generate(destination); - } else if (config.getMode().isSpring()) { - SpringCanalInstanceGenerator instanceGenerator = new SpringCanalInstanceGenerator(); - instanceGenerator.setSpringXml(config.getSpringXml()); - return instanceGenerator.generate(destination); - } else { - throw new UnsupportedOperationException("unknow mode :" + config.getMode()); - } + instanceGenerator = destination -> { + InstanceConfig config = instanceConfigs.get(destination); + if (config == null) { + throw new CanalServerException("can't find destination:" + destination); + } + if (config.getMode().isManager()) { + PlainCanalInstanceGenerator instanceGenerator = new PlainCanalInstanceGenerator(properties); + instanceGenerator.setCanalConfigClient(managerClients.get(config.getManagerAddress())); + instanceGenerator.setSpringXml(config.getSpringXml()); + return instanceGenerator.generate(destination); + } else if (config.getMode().isSpring()) { + SpringCanalInstanceGenerator instanceGenerator = new SpringCanalInstanceGenerator(); + instanceGenerator.setSpringXml(config.getSpringXml()); + return instanceGenerator.generate(destination); + } else { + throw new UnsupportedOperationException("unknow mode :" + config.getMode()); } }; diff --git a/deployer/src/main/java/com/alibaba/otter/canal/deployer/CanalLauncher.java b/deployer/src/main/java/com/alibaba/otter/canal/deployer/CanalLauncher.java index a2b6a3b1..add34634 100644 --- a/deployer/src/main/java/com/alibaba/otter/canal/deployer/CanalLauncher.java +++ b/deployer/src/main/java/com/alibaba/otter/canal/deployer/CanalLauncher.java @@ -121,13 +121,7 @@ public class CanalLauncher { } private static void setGlobalUncaughtExceptionHandler() { - Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { - - @Override - public void uncaughtException(Thread t, Throwable e) { - logger.error("UnCaughtException", e); - } - }); + Thread.setDefaultUncaughtExceptionHandler((t, e) -> logger.error("UnCaughtException", e)); } } diff --git a/deployer/src/main/java/com/alibaba/otter/canal/deployer/CanalStarter.java b/deployer/src/main/java/com/alibaba/otter/canal/deployer/CanalStarter.java index e95dd554..386cc85f 100644 --- a/deployer/src/main/java/com/alibaba/otter/canal/deployer/CanalStarter.java +++ b/deployer/src/main/java/com/alibaba/otter/canal/deployer/CanalStarter.java @@ -88,21 +88,17 @@ public class CanalStarter { controller = new CanalController(properties); controller.start(); logger.info("## the canal server is running now ......"); - shutdownThread = new Thread() { - - public void run() { - try { - logger.info("## stop the canal server"); - controller.stop(); - CanalLauncher.runningLatch.countDown(); - } catch (Throwable e) { - logger.warn("##something goes wrong when stopping canal Server:", e); - } finally { - logger.info("## canal server is down."); - } + shutdownThread = new Thread(() -> { + try { + logger.info("## stop the canal server"); + controller.stop(); + CanalLauncher.runningLatch.countDown(); + } catch (Throwable e) { + logger.warn("##something goes wrong when stopping canal Server:", e); + } finally { + logger.info("## canal server is down."); } - - }; + }); Runtime.getRuntime().addShutdownHook(shutdownThread); if (canalMQProducer != null) { diff --git a/deployer/src/main/java/com/alibaba/otter/canal/deployer/admin/CanalAdminController.java b/deployer/src/main/java/com/alibaba/otter/canal/deployer/admin/CanalAdminController.java index 5144e7f7..29cee67c 100644 --- a/deployer/src/main/java/com/alibaba/otter/canal/deployer/admin/CanalAdminController.java +++ b/deployer/src/main/java/com/alibaba/otter/canal/deployer/admin/CanalAdminController.java @@ -106,7 +106,7 @@ public class CanalAdminController implements CanalAdmin { public String getRunningInstances() { try { Map instances = CanalServerWithEmbedded.instance().getCanalInstances(); - List runningInstances = new ArrayList(); + List runningInstances = new ArrayList<>(); instances.forEach((destination, instance) -> { if (instance.isStart()) { runningInstances.add(destination); diff --git a/deployer/src/main/java/com/alibaba/otter/canal/deployer/monitor/ManagerInstanceConfigMonitor.java b/deployer/src/main/java/com/alibaba/otter/canal/deployer/monitor/ManagerInstanceConfigMonitor.java index c9e99593..b884e206 100644 --- a/deployer/src/main/java/com/alibaba/otter/canal/deployer/monitor/ManagerInstanceConfigMonitor.java +++ b/deployer/src/main/java/com/alibaba/otter/canal/deployer/monitor/ManagerInstanceConfigMonitor.java @@ -32,12 +32,7 @@ public class ManagerInstanceConfigMonitor extends AbstractCanalLifeCycle impleme private long scanIntervalInSecond = 5; private InstanceAction defaultAction = null; private Map actions = new MapMaker().makeMap(); - private Map configs = MigrateMap.makeComputingMap(new Function() { - - public PlainCanal apply(String destination) { - return new PlainCanal(); - } - }); + private Map configs = MigrateMap.makeComputingMap(destination -> new PlainCanal()); private ScheduledExecutorService executor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("canal-instance-scan")); @@ -46,19 +41,15 @@ public class ManagerInstanceConfigMonitor extends AbstractCanalLifeCycle impleme public void start() { super.start(); - executor.scheduleWithFixedDelay(new Runnable() { - - public void run() { - try { - scan(); - if (isFirst) { - isFirst = false; - } - } catch (Throwable e) { - logger.error("scan failed", e); + executor.scheduleWithFixedDelay(() -> { + try { + scan(); + if (isFirst) { + isFirst = false; } + } catch (Throwable e) { + logger.error("scan failed", e); } - }, 0, scanIntervalInSecond, TimeUnit.SECONDS); } diff --git a/deployer/src/main/java/com/alibaba/otter/canal/deployer/monitor/SpringInstanceConfigMonitor.java b/deployer/src/main/java/com/alibaba/otter/canal/deployer/monitor/SpringInstanceConfigMonitor.java index c4535dc4..6fc1263e 100644 --- a/deployer/src/main/java/com/alibaba/otter/canal/deployer/monitor/SpringInstanceConfigMonitor.java +++ b/deployer/src/main/java/com/alibaba/otter/canal/deployer/monitor/SpringInstanceConfigMonitor.java @@ -39,12 +39,7 @@ public class SpringInstanceConfigMonitor extends AbstractCanalLifeCycle implemen private long scanIntervalInSecond = 5; private InstanceAction defaultAction = null; private Map actions = new MapMaker().makeMap(); - private Map lastFiles = MigrateMap.makeComputingMap(new Function() { - - public InstanceConfigFiles apply(String destination) { - return new InstanceConfigFiles(destination); - } - }); + private Map lastFiles = MigrateMap.makeComputingMap(InstanceConfigFiles::new); private ScheduledExecutorService executor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("canal-instance-scan")); @@ -58,19 +53,15 @@ public class SpringInstanceConfigMonitor extends AbstractCanalLifeCycle implemen super.start(); Assert.notNull(rootConf, "root conf dir is null!"); - executor.scheduleWithFixedDelay(new Runnable() { - - public void run() { - try { - scan(); - if (isFirst) { - isFirst = false; - } - } catch (Throwable e) { - logger.error("scan failed", e); + executor.scheduleWithFixedDelay(() -> { + try { + scan(); + if (isFirst) { + isFirst = false; } + } catch (Throwable e) { + logger.error("scan failed", e); } - }, 0, scanIntervalInSecond, TimeUnit.SECONDS); } @@ -103,29 +94,22 @@ public class SpringInstanceConfigMonitor extends AbstractCanalLifeCycle implemen return; } - File[] instanceDirs = rootdir.listFiles(new FileFilter() { - - public boolean accept(File pathname) { - String filename = pathname.getName(); - return pathname.isDirectory() && !"spring".equalsIgnoreCase(filename); - } + File[] instanceDirs = rootdir.listFiles(pathname -> { + String filename = pathname.getName(); + return pathname.isDirectory() && !"spring".equalsIgnoreCase(filename); }); // 扫描目录的新增 - Set currentInstanceNames = new HashSet(); + Set currentInstanceNames = new HashSet<>(); // 判断目录内文件的变化 for (File instanceDir : instanceDirs) { String destination = instanceDir.getName(); currentInstanceNames.add(destination); - File[] instanceConfigs = instanceDir.listFiles(new FilenameFilter() { - - public boolean accept(File dir, String name) { - // return !StringUtils.endsWithIgnoreCase(name, ".dat"); - // 限制一下,只针对instance.properties文件,避免因为.svn或者其他生成的临时文件导致出现reload - return StringUtils.equalsIgnoreCase(name, "instance.properties"); - } - + File[] instanceConfigs = instanceDir.listFiles((dir, name) -> { + // return !StringUtils.endsWithIgnoreCase(name, ".dat"); + // 限制一下,只针对instance.properties文件,避免因为.svn或者其他生成的临时文件导致出现reload + return StringUtils.equalsIgnoreCase(name, "instance.properties"); }); if (!actions.containsKey(destination) && instanceConfigs.length > 0) { @@ -150,7 +134,7 @@ public class SpringInstanceConfigMonitor extends AbstractCanalLifeCycle implemen if (hasChanged || CollectionUtils.isEmpty(lastFile.getInstanceFiles())) { // 更新内容 - List newFileInfo = new ArrayList(); + List newFileInfo = new ArrayList<>(); for (File instanceConfig : instanceConfigs) { newFileInfo.add(new FileInfo(instanceConfig.getName(), instanceConfig.lastModified())); } @@ -163,7 +147,7 @@ public class SpringInstanceConfigMonitor extends AbstractCanalLifeCycle implemen } // 判断目录是否删除 - Set deleteInstanceNames = new HashSet(); + Set deleteInstanceNames = new HashSet<>(); for (String destination : actions.keySet()) { if (!currentInstanceNames.contains(destination)) { deleteInstanceNames.add(destination); @@ -181,7 +165,7 @@ public class SpringInstanceConfigMonitor extends AbstractCanalLifeCycle implemen // 启动成功后记录配置文件信息 InstanceConfigFiles lastFile = lastFiles.get(destination); - List newFileInfo = new ArrayList(); + List newFileInfo = new ArrayList<>(); for (File instanceConfig : instanceConfigs) { newFileInfo.add(new FileInfo(instanceConfig.getName(), instanceConfig.lastModified())); } @@ -243,10 +227,10 @@ public class SpringInstanceConfigMonitor extends AbstractCanalLifeCycle implemen private String destination; // instance // name - private List springFile = new ArrayList(); // spring的instance + private List springFile = new ArrayList<>(); // spring的instance // xml private FileInfo rootFile; // canal.properties - private List instanceFiles = new ArrayList(); // instance对应的配置 + private List instanceFiles = new ArrayList<>(); // instance对应的配置 public InstanceConfigFiles(String destination){ this.destination = destination; diff --git a/driver/src/main/java/com/alibaba/otter/canal/parse/driver/mysql/MysqlQueryExecutor.java b/driver/src/main/java/com/alibaba/otter/canal/parse/driver/mysql/MysqlQueryExecutor.java index 6d30bd4f..b412a96b 100644 --- a/driver/src/main/java/com/alibaba/otter/canal/parse/driver/mysql/MysqlQueryExecutor.java +++ b/driver/src/main/java/com/alibaba/otter/canal/parse/driver/mysql/MysqlQueryExecutor.java @@ -64,7 +64,7 @@ public class MysqlQueryExecutor { ResultSetHeaderPacket rsHeader = new ResultSetHeaderPacket(); rsHeader.fromBytes(body); - List fields = new ArrayList(); + List fields = new ArrayList<>(); for (int i = 0; i < rsHeader.getColumnCount(); i++) { FieldPacket fp = new FieldPacket(); fp.fromBytes(readNextPacket()); @@ -73,7 +73,7 @@ public class MysqlQueryExecutor { readEofPacket(); - List rowData = new ArrayList(); + List rowData = new ArrayList<>(); while (true) { body = readNextPacket(); if (body[0] == -2) { @@ -99,7 +99,7 @@ public class MysqlQueryExecutor { cmd.setQueryString(queryString); byte[] bodyBytes = cmd.toBytes(); PacketManager.writeBody(channel, bodyBytes); - List resultSets = new ArrayList(); + List resultSets = new ArrayList<>(); boolean moreResult = true; while (moreResult) { byte[] body = readNextPacket(); @@ -112,7 +112,7 @@ public class MysqlQueryExecutor { ResultSetHeaderPacket rsHeader = new ResultSetHeaderPacket(); rsHeader.fromBytes(body); - List fields = new ArrayList(); + List fields = new ArrayList<>(); for (int i = 0; i < rsHeader.getColumnCount(); i++) { FieldPacket fp = new FieldPacket(); fp.fromBytes(readNextPacket()); @@ -121,7 +121,7 @@ public class MysqlQueryExecutor { moreResult = readEofPacket(); - List rowData = new ArrayList(); + List rowData = new ArrayList<>(); while (true) { body = readNextPacket(); if (body[0] == -2) { diff --git a/driver/src/main/java/com/alibaba/otter/canal/parse/driver/mysql/packets/MysqlGTIDSet.java b/driver/src/main/java/com/alibaba/otter/canal/parse/driver/mysql/packets/MysqlGTIDSet.java index f5128e23..23629559 100644 --- a/driver/src/main/java/com/alibaba/otter/canal/parse/driver/mysql/packets/MysqlGTIDSet.java +++ b/driver/src/main/java/com/alibaba/otter/canal/parse/driver/mysql/packets/MysqlGTIDSet.java @@ -84,11 +84,11 @@ public class MysqlGTIDSet implements GTIDSet { Map m; if (gtidData == null || gtidData.length() < 1) { - m = new HashMap(); + m = new HashMap<>(); } else { // 存在多个GTID时会有回车符 String[] uuidStrs = gtidData.replaceAll("\n", "").split(","); - m = new HashMap(uuidStrs.length); + m = new HashMap<>(uuidStrs.length); for (int i = 0; i < uuidStrs.length; i++) { UUIDSet uuidSet = UUIDSet.parse(uuidStrs[i]); m.put(uuidSet.SID.toString(), uuidSet); diff --git a/driver/src/main/java/com/alibaba/otter/canal/parse/driver/mysql/packets/UUIDSet.java b/driver/src/main/java/com/alibaba/otter/canal/parse/driver/mysql/packets/UUIDSet.java index 5b2f9b30..e6908a92 100644 --- a/driver/src/main/java/com/alibaba/otter/canal/parse/driver/mysql/packets/UUIDSet.java +++ b/driver/src/main/java/com/alibaba/otter/canal/parse/driver/mysql/packets/UUIDSet.java @@ -105,7 +105,7 @@ public class UUIDSet { throw new RuntimeException(String.format("parseUUIDSet failed due to wrong format: %s", str)); } - List intervals = new ArrayList(); + List intervals = new ArrayList<>(); for (int i = 1; i < ss.length; i++) { intervals.add(parseInterval(ss[i])); } @@ -172,7 +172,7 @@ public class UUIDSet { * @return */ public static List combine(List intervals) { - List combined = new ArrayList(); + List combined = new ArrayList<>(); Collections.sort(intervals); int len = intervals.size(); for (int i = 0; i < len; i++) { diff --git a/driver/src/main/java/com/alibaba/otter/canal/parse/driver/mysql/packets/server/ResultSetPacket.java b/driver/src/main/java/com/alibaba/otter/canal/parse/driver/mysql/packets/server/ResultSetPacket.java index ed538dee..7386c34f 100644 --- a/driver/src/main/java/com/alibaba/otter/canal/parse/driver/mysql/packets/server/ResultSetPacket.java +++ b/driver/src/main/java/com/alibaba/otter/canal/parse/driver/mysql/packets/server/ResultSetPacket.java @@ -7,8 +7,8 @@ import java.util.List; public class ResultSetPacket { private SocketAddress sourceAddress; - private List fieldDescriptors = new ArrayList(); - private List fieldValues = new ArrayList(); + private List fieldDescriptors = new ArrayList<>(); + private List fieldValues = new ArrayList<>(); public void setFieldDescriptors(List fieldDescriptors) { this.fieldDescriptors = fieldDescriptors; diff --git a/driver/src/main/java/com/alibaba/otter/canal/parse/driver/mysql/packets/server/RowDataPacket.java b/driver/src/main/java/com/alibaba/otter/canal/parse/driver/mysql/packets/server/RowDataPacket.java index 1f6a45eb..c1aa5539 100644 --- a/driver/src/main/java/com/alibaba/otter/canal/parse/driver/mysql/packets/server/RowDataPacket.java +++ b/driver/src/main/java/com/alibaba/otter/canal/parse/driver/mysql/packets/server/RowDataPacket.java @@ -9,7 +9,7 @@ import com.alibaba.otter.canal.parse.driver.mysql.utils.LengthCodedStringReader; public class RowDataPacket extends PacketWithHeaderPacket { - private List columns = new ArrayList(); + private List columns = new ArrayList<>(); public void fromBytes(byte[] data) throws IOException { int index = 0; diff --git a/driver/src/main/java/com/alibaba/otter/canal/parse/driver/mysql/socket/NettySocketChannelPool.java b/driver/src/main/java/com/alibaba/otter/canal/parse/driver/mysql/socket/NettySocketChannelPool.java index 4a8ece1b..529135c2 100644 --- a/driver/src/main/java/com/alibaba/otter/canal/parse/driver/mysql/socket/NettySocketChannelPool.java +++ b/driver/src/main/java/com/alibaba/otter/canal/parse/driver/mysql/socket/NettySocketChannelPool.java @@ -31,7 +31,7 @@ public abstract class NettySocketChannelPool { private static EventLoopGroup group = new NioEventLoopGroup(); // 非阻塞IO线程组 private static Bootstrap boot = new Bootstrap(); // 主 - private static Map chManager = new ConcurrentHashMap(); + private static Map chManager = new ConcurrentHashMap<>(); private static final Logger logger = LoggerFactory.getLogger(NettySocketChannelPool.class); static { diff --git a/driver/src/main/java/com/alibaba/otter/canal/parse/driver/mysql/utils/CharsetUtil.java b/driver/src/main/java/com/alibaba/otter/canal/parse/driver/mysql/utils/CharsetUtil.java index ba98a87f..b8a08628 100644 --- a/driver/src/main/java/com/alibaba/otter/canal/parse/driver/mysql/utils/CharsetUtil.java +++ b/driver/src/main/java/com/alibaba/otter/canal/parse/driver/mysql/utils/CharsetUtil.java @@ -14,7 +14,7 @@ import org.apache.commons.lang.StringUtils; public class CharsetUtil { private static final String[] INDEX_TO_CHARSET = new String[2048]; - private static final Map CHARSET_TO_INDEX = new HashMap(); + private static final Map CHARSET_TO_INDEX = new HashMap<>(); static { INDEX_TO_CHARSET[1] = "big5"; INDEX_TO_CHARSET[84] = "big5"; diff --git a/driver/src/test/java/com/alibaba/otter/canal/parse/driver/mysql/MysqlGTIDSetTest.java b/driver/src/test/java/com/alibaba/otter/canal/parse/driver/mysql/MysqlGTIDSetTest.java index f423686d..26103611 100644 --- a/driver/src/test/java/com/alibaba/otter/canal/parse/driver/mysql/MysqlGTIDSetTest.java +++ b/driver/src/test/java/com/alibaba/otter/canal/parse/driver/mysql/MysqlGTIDSetTest.java @@ -38,7 +38,7 @@ public class MysqlGTIDSetTest { @Test public void testParse() { - Map cases = new HashMap(5); + Map cases = new HashMap<>(5); cases.put("726757ad-4455-11e8-ae04-0242ac110002:1", buildForTest(new Material("726757ad-4455-11e8-ae04-0242ac110002", 1, 2))); cases.put("726757ad-4455-11e8-ae04-0242ac110002:1-3", @@ -89,12 +89,12 @@ public class MysqlGTIDSetTest { } private MysqlGTIDSet buildForTest(List materials) { - Map sets = new HashMap(); + Map sets = new HashMap<>(); for (Material a : materials) { UUIDSet.Interval interval = new UUIDSet.Interval(); interval.start = a.start; interval.stop = a.stop; - List intervals = new ArrayList(); + List intervals = new ArrayList<>(); intervals.add(interval); if (a.start1 > 0 && a.stop1 > 0) { diff --git a/driver/src/test/java/com/alibaba/otter/canal/parse/driver/mysql/UUIDSetTest.java b/driver/src/test/java/com/alibaba/otter/canal/parse/driver/mysql/UUIDSetTest.java index 4ed025dc..bdeb7423 100644 --- a/driver/src/test/java/com/alibaba/otter/canal/parse/driver/mysql/UUIDSetTest.java +++ b/driver/src/test/java/com/alibaba/otter/canal/parse/driver/mysql/UUIDSetTest.java @@ -16,7 +16,7 @@ public class UUIDSetTest { @Test public void testToString() { - Map cases = new HashMap(4); + Map cases = new HashMap<>(4); cases.put("726757ad-4455-11e8-ae04-0242ac110002:1", "726757ad-4455-11e8-ae04-0242ac110002:1"); cases.put("726757ad-4455-11e8-ae04-0242ac110002:1-3", "726757ad-4455-11e8-ae04-0242ac110002:1-3"); cases.put("726757ad-4455-11e8-ae04-0242ac110002:1-3:4-6", "726757ad-4455-11e8-ae04-0242ac110002:1-6"); diff --git a/example/src/main/java/com/alibaba/otter/canal/example/AbstractCanalClientTest.java b/example/src/main/java/com/alibaba/otter/canal/example/AbstractCanalClientTest.java index 25746a26..6be86591 100644 --- a/example/src/main/java/com/alibaba/otter/canal/example/AbstractCanalClientTest.java +++ b/example/src/main/java/com/alibaba/otter/canal/example/AbstractCanalClientTest.java @@ -25,12 +25,7 @@ public class AbstractCanalClientTest extends BaseCanalClientTest { protected void start() { Assert.notNull(connector, "connector is null"); - thread = new Thread(new Runnable() { - - public void run() { - process(); - } - }); + thread = new Thread(this::process); thread.setUncaughtExceptionHandler(handler); running = true; diff --git a/example/src/main/java/com/alibaba/otter/canal/example/BaseCanalClientTest.java b/example/src/main/java/com/alibaba/otter/canal/example/BaseCanalClientTest.java index 94e2375f..235b3b84 100644 --- a/example/src/main/java/com/alibaba/otter/canal/example/BaseCanalClientTest.java +++ b/example/src/main/java/com/alibaba/otter/canal/example/BaseCanalClientTest.java @@ -31,12 +31,7 @@ public class BaseCanalClientTest { protected static final String SEP = SystemUtils.LINE_SEPARATOR; protected static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; protected volatile boolean running = false; - protected Thread.UncaughtExceptionHandler handler = new Thread.UncaughtExceptionHandler() { - - public void uncaughtException(Thread t, Throwable e) { - logger.error("parse events has an error", e); - } - }; + protected Thread.UncaughtExceptionHandler handler = (t, e) -> logger.error("parse events has an error", e); protected Thread thread = null; protected CanalConnector connector; protected static String context_format = null; diff --git a/example/src/main/java/com/alibaba/otter/canal/example/ClusterCanalClientTest.java b/example/src/main/java/com/alibaba/otter/canal/example/ClusterCanalClientTest.java index 43d81825..1654ed56 100644 --- a/example/src/main/java/com/alibaba/otter/canal/example/ClusterCanalClientTest.java +++ b/example/src/main/java/com/alibaba/otter/canal/example/ClusterCanalClientTest.java @@ -32,19 +32,15 @@ public class ClusterCanalClientTest extends AbstractCanalClientTest { clientTest.setConnector(connector); clientTest.start(); - Runtime.getRuntime().addShutdownHook(new Thread() { - - public void run() { - try { - logger.info("## stop the canal client"); - clientTest.stop(); - } catch (Throwable e) { - logger.warn("##something goes wrong when stopping canal:", e); - } finally { - logger.info("## canal client is down."); - } + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + try { + logger.info("## stop the canal client"); + clientTest.stop(); + } catch (Throwable e) { + logger.warn("##something goes wrong when stopping canal:", e); + } finally { + logger.info("## canal client is down."); } - - }); + })); } } diff --git a/example/src/main/java/com/alibaba/otter/canal/example/SimpleCanalClientPermanceTest.java b/example/src/main/java/com/alibaba/otter/canal/example/SimpleCanalClientPermanceTest.java index db61f98c..2831ad72 100644 --- a/example/src/main/java/com/alibaba/otter/canal/example/SimpleCanalClientPermanceTest.java +++ b/example/src/main/java/com/alibaba/otter/canal/example/SimpleCanalClientPermanceTest.java @@ -20,23 +20,19 @@ public class SimpleCanalClientPermanceTest { int perSum = 0; long start = System.currentTimeMillis(); long end = 0; - final ArrayBlockingQueue queue = new ArrayBlockingQueue(100); + final ArrayBlockingQueue queue = new ArrayBlockingQueue<>(100); try { final CanalConnector connector = CanalConnectors.newSingleConnector(new InetSocketAddress(ip, 11111), destination, "canal", "canal"); - Thread ackThread = new Thread(new Runnable() { - - @Override - public void run() { - while (true) { - try { - long batchId = queue.take(); - connector.ack(batchId); - } catch (InterruptedException e) { - } + Thread ackThread = new Thread(() -> { + while (true) { + try { + long batchId = queue.take(); + connector.ack(batchId); + } catch (InterruptedException e) { } } }); diff --git a/example/src/main/java/com/alibaba/otter/canal/example/SimpleCanalClientTest.java b/example/src/main/java/com/alibaba/otter/canal/example/SimpleCanalClientTest.java index d277c3a1..089161f2 100644 --- a/example/src/main/java/com/alibaba/otter/canal/example/SimpleCanalClientTest.java +++ b/example/src/main/java/com/alibaba/otter/canal/example/SimpleCanalClientTest.java @@ -30,20 +30,16 @@ public class SimpleCanalClientTest extends AbstractCanalClientTest { final SimpleCanalClientTest clientTest = new SimpleCanalClientTest(destination); clientTest.setConnector(connector); clientTest.start(); - Runtime.getRuntime().addShutdownHook(new Thread() { - - public void run() { - try { - logger.info("## stop the canal client"); - clientTest.stop(); - } catch (Throwable e) { - logger.warn("##something goes wrong when stopping canal:", e); - } finally { - logger.info("## canal client is down."); - } + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + try { + logger.info("## stop the canal client"); + clientTest.stop(); + } catch (Throwable e) { + logger.warn("##something goes wrong when stopping canal:", e); + } finally { + logger.info("## canal client is down."); } - - }); + })); } } diff --git a/example/src/main/java/com/alibaba/otter/canal/example/kafka/CanalKafkaClientExample.java b/example/src/main/java/com/alibaba/otter/canal/example/kafka/CanalKafkaClientExample.java index 83757aec..dfc63179 100644 --- a/example/src/main/java/com/alibaba/otter/canal/example/kafka/CanalKafkaClientExample.java +++ b/example/src/main/java/com/alibaba/otter/canal/example/kafka/CanalKafkaClientExample.java @@ -26,12 +26,7 @@ public class CanalKafkaClientExample { private Thread thread = null; - private Thread.UncaughtExceptionHandler handler = new Thread.UncaughtExceptionHandler() { - - public void uncaughtException(Thread t, Throwable e) { - logger.error("parse events has an error", e); - } - }; + private Thread.UncaughtExceptionHandler handler = (t, e) -> logger.error("parse events has an error", e); public CanalKafkaClientExample(String zkServers, String servers, String topic, Integer partition, String groupId){ connector = new KafkaCanalConnector(servers, topic, partition, groupId, null, false); @@ -47,20 +42,16 @@ public class CanalKafkaClientExample { logger.info("## start the kafka consumer: {}-{}", AbstractKafkaTest.topic, AbstractKafkaTest.groupId); kafkaCanalClientExample.start(); logger.info("## the canal kafka consumer is running now ......"); - Runtime.getRuntime().addShutdownHook(new Thread() { - - public void run() { - try { - logger.info("## stop the kafka consumer"); - kafkaCanalClientExample.stop(); - } catch (Throwable e) { - logger.warn("##something goes wrong when stopping kafka consumer:", e); - } finally { - logger.info("## kafka consumer is down."); - } + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + try { + logger.info("## stop the kafka consumer"); + kafkaCanalClientExample.stop(); + } catch (Throwable e) { + logger.warn("##something goes wrong when stopping kafka consumer:", e); + } finally { + logger.info("## kafka consumer is down."); } - - }); + })); while (running) ; } catch (Throwable e) { @@ -71,12 +62,7 @@ public class CanalKafkaClientExample { public void start() { Assert.notNull(connector, "connector is null"); - thread = new Thread(new Runnable() { - - public void run() { - process(); - } - }); + thread = new Thread(this::process); thread.setUncaughtExceptionHandler(handler); thread.start(); running = true; diff --git a/example/src/main/java/com/alibaba/otter/canal/example/kafka/CanalKafkaClientFlatMessageExample.java b/example/src/main/java/com/alibaba/otter/canal/example/kafka/CanalKafkaClientFlatMessageExample.java index 60b798ac..03c5fe8c 100644 --- a/example/src/main/java/com/alibaba/otter/canal/example/kafka/CanalKafkaClientFlatMessageExample.java +++ b/example/src/main/java/com/alibaba/otter/canal/example/kafka/CanalKafkaClientFlatMessageExample.java @@ -26,12 +26,7 @@ public class CanalKafkaClientFlatMessageExample { private Thread thread = null; - private Thread.UncaughtExceptionHandler handler = new Thread.UncaughtExceptionHandler() { - - public void uncaughtException(Thread t, Throwable e) { - logger.error("parse events has an error", e); - } - }; + private Thread.UncaughtExceptionHandler handler = (t, e) -> logger.error("parse events has an error", e); public CanalKafkaClientFlatMessageExample(String zkServers, String servers, String topic, Integer partition, String groupId){ @@ -48,20 +43,16 @@ public class CanalKafkaClientFlatMessageExample { logger.info("## start the kafka consumer: {}-{}", AbstractKafkaTest.topic, AbstractKafkaTest.groupId); kafkaCanalClientExample.start(); logger.info("## the canal kafka consumer is running now ......"); - Runtime.getRuntime().addShutdownHook(new Thread() { - - public void run() { - try { - logger.info("## stop the kafka consumer"); - kafkaCanalClientExample.stop(); - } catch (Throwable e) { - logger.warn("##something goes wrong when stopping kafka consumer:", e); - } finally { - logger.info("## kafka consumer is down."); - } + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + try { + logger.info("## stop the kafka consumer"); + kafkaCanalClientExample.stop(); + } catch (Throwable e) { + logger.warn("##something goes wrong when stopping kafka consumer:", e); + } finally { + logger.info("## kafka consumer is down."); } - - }); + })); while (running) ; } catch (Throwable e) { @@ -72,12 +63,7 @@ public class CanalKafkaClientFlatMessageExample { public void start() { Assert.notNull(connector, "connector is null"); - thread = new Thread(new Runnable() { - - public void run() { - process(); - } - }); + thread = new Thread(this::process); thread.setUncaughtExceptionHandler(handler); thread.start(); running = true; diff --git a/example/src/main/java/com/alibaba/otter/canal/example/kafka/CanalKafkaOffsetClientExample.java b/example/src/main/java/com/alibaba/otter/canal/example/kafka/CanalKafkaOffsetClientExample.java index 22f6e772..e5732f52 100644 --- a/example/src/main/java/com/alibaba/otter/canal/example/kafka/CanalKafkaOffsetClientExample.java +++ b/example/src/main/java/com/alibaba/otter/canal/example/kafka/CanalKafkaOffsetClientExample.java @@ -35,12 +35,7 @@ public class CanalKafkaOffsetClientExample { private Thread thread = null; - private Thread.UncaughtExceptionHandler handler = new Thread.UncaughtExceptionHandler() { - - public void uncaughtException(Thread t, Throwable e) { - logger.error("parse events has an error", e); - } - }; + private Thread.UncaughtExceptionHandler handler = (t, e) -> logger.error("parse events has an error", e); public CanalKafkaOffsetClientExample(String servers, String topic, Integer partition, String groupId){ connector = new KafkaOffsetCanalConnector(servers, topic, partition, groupId, false); @@ -55,20 +50,16 @@ public class CanalKafkaOffsetClientExample { logger.info("## start the kafka consumer: {}-{}", AbstractKafkaTest.topic, AbstractKafkaTest.groupId); kafkaCanalClientExample.start(); logger.info("## the canal kafka consumer is running now ......"); - Runtime.getRuntime().addShutdownHook(new Thread() { - - public void run() { - try { - logger.info("## stop the kafka consumer"); - kafkaCanalClientExample.stop(); - } catch (Throwable e) { - logger.warn("##something goes wrong when stopping kafka consumer:", e); - } finally { - logger.info("## kafka consumer is down."); - } + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + try { + logger.info("## stop the kafka consumer"); + kafkaCanalClientExample.stop(); + } catch (Throwable e) { + logger.warn("##something goes wrong when stopping kafka consumer:", e); + } finally { + logger.info("## kafka consumer is down."); } - - }); + })); while (running) ; } catch (Throwable e) { @@ -79,12 +70,7 @@ public class CanalKafkaOffsetClientExample { public void start() { Assert.notNull(connector, "connector is null"); - thread = new Thread(new Runnable() { - - public void run() { - process(); - } - }); + thread = new Thread(this::process); thread.setUncaughtExceptionHandler(handler); thread.start(); running = true; diff --git a/example/src/main/java/com/alibaba/otter/canal/example/kafka/KafkaClientRunningTest.java b/example/src/main/java/com/alibaba/otter/canal/example/kafka/KafkaClientRunningTest.java index f1e12cd8..ca8bd39a 100644 --- a/example/src/main/java/com/alibaba/otter/canal/example/kafka/KafkaClientRunningTest.java +++ b/example/src/main/java/com/alibaba/otter/canal/example/kafka/KafkaClientRunningTest.java @@ -26,22 +26,18 @@ public class KafkaClientRunningTest extends AbstractKafkaTest { public void testKafkaConsumer() { final ExecutorService executor = Executors.newFixedThreadPool(1); final KafkaCanalConnector connector = new KafkaCanalConnector(servers, topic, partition, groupId, null, false); - executor.submit(new Runnable() { - - @Override - public void run() { - connector.connect(); - connector.subscribe(); - while (running) { - List messages = connector.getList(3L, TimeUnit.SECONDS); - if (messages != null) { - System.out.println(messages); - } - connector.ack(); + executor.submit(() -> { + connector.connect(); + connector.subscribe(); + while (running) { + List messages = connector.getList(3L, TimeUnit.SECONDS); + if (messages != null) { + System.out.println(messages); } - connector.unsubscribe(); - connector.disconnect(); + connector.ack(); } + connector.unsubscribe(); + connector.disconnect(); }); sleep(60000); diff --git a/example/src/main/java/com/alibaba/otter/canal/example/rocketmq/CanalRocketMQClientExample.java b/example/src/main/java/com/alibaba/otter/canal/example/rocketmq/CanalRocketMQClientExample.java index 3c88900e..91a21811 100644 --- a/example/src/main/java/com/alibaba/otter/canal/example/rocketmq/CanalRocketMQClientExample.java +++ b/example/src/main/java/com/alibaba/otter/canal/example/rocketmq/CanalRocketMQClientExample.java @@ -24,12 +24,7 @@ public class CanalRocketMQClientExample extends AbstractRocektMQTest { private Thread thread = null; - private Thread.UncaughtExceptionHandler handler = new Thread.UncaughtExceptionHandler() { - - public void uncaughtException(Thread t, Throwable e) { - logger.error("parse events has an error", e); - } - }; + private Thread.UncaughtExceptionHandler handler = (t, e) -> logger.error("parse events has an error", e); public CanalRocketMQClientExample(String nameServers, String topic, String groupId) { connector = new RocketMQCanalConnector(nameServers, topic, groupId, 500, false); @@ -55,20 +50,16 @@ public class CanalRocketMQClientExample extends AbstractRocektMQTest { logger.info("## Start the rocketmq consumer: {}-{}", topic, groupId); rocketMQClientExample.start(); logger.info("## The canal rocketmq consumer is running now ......"); - Runtime.getRuntime().addShutdownHook(new Thread() { - - public void run() { - try { - logger.info("## Stop the rocketmq consumer"); - rocketMQClientExample.stop(); - } catch (Throwable e) { - logger.warn("## Something goes wrong when stopping rocketmq consumer:", e); - } finally { - logger.info("## Rocketmq consumer is down."); - } + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + try { + logger.info("## Stop the rocketmq consumer"); + rocketMQClientExample.stop(); + } catch (Throwable e) { + logger.warn("## Something goes wrong when stopping rocketmq consumer:", e); + } finally { + logger.info("## Rocketmq consumer is down."); } - - }); + })); while (running) ; } catch (Throwable e) { @@ -79,12 +70,7 @@ public class CanalRocketMQClientExample extends AbstractRocektMQTest { public void start() { Assert.notNull(connector, "connector is null"); - thread = new Thread(new Runnable() { - - public void run() { - process(); - } - }); + thread = new Thread(this::process); thread.setUncaughtExceptionHandler(handler); thread.start(); running = true; diff --git a/example/src/main/java/com/alibaba/otter/canal/example/rocketmq/CanalRocketMQClientFlatMessageExample.java b/example/src/main/java/com/alibaba/otter/canal/example/rocketmq/CanalRocketMQClientFlatMessageExample.java index 5abcadfe..afe7d524 100644 --- a/example/src/main/java/com/alibaba/otter/canal/example/rocketmq/CanalRocketMQClientFlatMessageExample.java +++ b/example/src/main/java/com/alibaba/otter/canal/example/rocketmq/CanalRocketMQClientFlatMessageExample.java @@ -26,12 +26,7 @@ public class CanalRocketMQClientFlatMessageExample extends AbstractRocektMQTest private Thread thread = null; - private Thread.UncaughtExceptionHandler handler = new Thread.UncaughtExceptionHandler() { - - public void uncaughtException(Thread t, Throwable e) { - logger.error("parse events has an error", e); - } - }; + private Thread.UncaughtExceptionHandler handler = (t, e) -> logger.error("parse events has an error", e); public CanalRocketMQClientFlatMessageExample(String nameServers, String topic, String groupId){ connector = new RocketMQCanalConnector(nameServers, topic, groupId, 500, true); @@ -45,20 +40,16 @@ public class CanalRocketMQClientFlatMessageExample extends AbstractRocektMQTest logger.info("## Start the rocketmq consumer: {}-{}", topic, groupId); rocketMQClientExample.start(); logger.info("## The canal rocketmq consumer is running now ......"); - Runtime.getRuntime().addShutdownHook(new Thread() { - - public void run() { - try { - logger.info("## Stop the rocketmq consumer"); - rocketMQClientExample.stop(); - } catch (Throwable e) { - logger.warn("## Something goes wrong when stopping rocketmq consumer:", e); - } finally { - logger.info("## Rocketmq consumer is down."); - } + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + try { + logger.info("## Stop the rocketmq consumer"); + rocketMQClientExample.stop(); + } catch (Throwable e) { + logger.warn("## Something goes wrong when stopping rocketmq consumer:", e); + } finally { + logger.info("## Rocketmq consumer is down."); } - - }); + })); while (running) ; } catch (Throwable e) { @@ -69,12 +60,7 @@ public class CanalRocketMQClientFlatMessageExample extends AbstractRocektMQTest public void start() { Assert.notNull(connector, "connector is null"); - thread = new Thread(new Runnable() { - - public void run() { - process(); - } - }); + thread = new Thread(this::process); thread.setUncaughtExceptionHandler(handler); thread.start(); running = true; diff --git a/filter/src/main/java/com/alibaba/otter/canal/filter/PatternUtils.java b/filter/src/main/java/com/alibaba/otter/canal/filter/PatternUtils.java index b8650c9a..646f81dc 100644 --- a/filter/src/main/java/com/alibaba/otter/canal/filter/PatternUtils.java +++ b/filter/src/main/java/com/alibaba/otter/canal/filter/PatternUtils.java @@ -14,20 +14,17 @@ import com.google.common.collect.MigrateMap; public class PatternUtils { private static Map patterns = MigrateMap.makeComputingMap(CacheBuilder.newBuilder().softValues(), - new Function() { - - public Pattern apply(String pattern) { - try { - PatternCompiler pc = new Perl5Compiler(); - return pc.compile(pattern, - Perl5Compiler.CASE_INSENSITIVE_MASK - | Perl5Compiler.READ_ONLY_MASK - | Perl5Compiler.SINGLELINE_MASK); - } catch (MalformedPatternException e) { - throw new RuntimeException(e); - } - } - }); + pattern -> { + try { + PatternCompiler pc = new Perl5Compiler(); + return pc.compile(pattern, + Perl5Compiler.CASE_INSENSITIVE_MASK + | Perl5Compiler.READ_ONLY_MASK + | Perl5Compiler.SINGLELINE_MASK); + } catch (MalformedPatternException e) { + throw new RuntimeException(e); + } + }); public static Pattern getPattern(String pattern) { return patterns.get(pattern); diff --git a/filter/src/main/java/com/alibaba/otter/canal/filter/aviater/AviaterELFilter.java b/filter/src/main/java/com/alibaba/otter/canal/filter/aviater/AviaterELFilter.java index 84b21cc7..d951481f 100644 --- a/filter/src/main/java/com/alibaba/otter/canal/filter/aviater/AviaterELFilter.java +++ b/filter/src/main/java/com/alibaba/otter/canal/filter/aviater/AviaterELFilter.java @@ -29,7 +29,7 @@ public class AviaterELFilter implements CanalEventFilter { return true; } - Map env = new HashMap(); + Map env = new HashMap<>(); env.put(ROOT_KEY, entry); return (Boolean) AviatorEvaluator.execute(expression, env); } diff --git a/filter/src/main/java/com/alibaba/otter/canal/filter/aviater/AviaterRegexFilter.java b/filter/src/main/java/com/alibaba/otter/canal/filter/aviater/AviaterRegexFilter.java index 4eb0dffa..de1d3710 100644 --- a/filter/src/main/java/com/alibaba/otter/canal/filter/aviater/AviaterRegexFilter.java +++ b/filter/src/main/java/com/alibaba/otter/canal/filter/aviater/AviaterRegexFilter.java @@ -44,7 +44,7 @@ public class AviaterRegexFilter implements CanalEventFilter { this.defaultEmptyValue = defaultEmptyValue; List list = null; if (StringUtils.isEmpty(pattern)) { - list = new ArrayList(); + list = new ArrayList<>(); } else { String[] ss = StringUtils.split(pattern, SPLIT); list = Arrays.asList(ss); @@ -68,7 +68,7 @@ public class AviaterRegexFilter implements CanalEventFilter { return defaultEmptyValue; } - Map env = new HashMap(); + Map env = new HashMap<>(); env.put("pattern", pattern); env.put("target", filtered.toLowerCase()); return (Boolean) exp.execute(env); @@ -114,7 +114,7 @@ public class AviaterRegexFilter implements CanalEventFilter { */ private List completionPattern(List patterns) { - List result = new ArrayList(); + List result = new ArrayList<>(); for (String pattern : patterns) { StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append("^"); diff --git a/filter/src/main/java/com/alibaba/otter/canal/filter/aviater/AviaterSimpleFilter.java b/filter/src/main/java/com/alibaba/otter/canal/filter/aviater/AviaterSimpleFilter.java index ac7dab4e..ea61438a 100644 --- a/filter/src/main/java/com/alibaba/otter/canal/filter/aviater/AviaterSimpleFilter.java +++ b/filter/src/main/java/com/alibaba/otter/canal/filter/aviater/AviaterSimpleFilter.java @@ -30,7 +30,7 @@ public class AviaterSimpleFilter implements CanalEventFilter { public AviaterSimpleFilter(String filterExpression){ if (StringUtils.isEmpty(filterExpression)) { - list = new ArrayList(); + list = new ArrayList<>(); } else { String[] ss = filterExpression.toLowerCase().split(SPLIT); list = Arrays.asList(ss); @@ -44,7 +44,7 @@ public class AviaterSimpleFilter implements CanalEventFilter { if (StringUtils.isEmpty(filtered)) { return true; } - Map env = new HashMap(); + Map env = new HashMap<>(); env.put("list", list); env.put("target", filtered.toLowerCase()); return (Boolean) exp.execute(env); diff --git a/filter/src/test/java/com/alibaba/otter/canal/filter/MutliAviaterFilterTest.java b/filter/src/test/java/com/alibaba/otter/canal/filter/MutliAviaterFilterTest.java index ecf7bfbf..e001ff0b 100644 --- a/filter/src/test/java/com/alibaba/otter/canal/filter/MutliAviaterFilterTest.java +++ b/filter/src/test/java/com/alibaba/otter/canal/filter/MutliAviaterFilterTest.java @@ -21,22 +21,19 @@ public class MutliAviaterFilterTest { final CountDownLatch countDown = new CountDownLatch(count); final AtomicInteger successed = new AtomicInteger(0); for (int i = 0; i < count; i++) { - executor.submit(new Runnable() { - - public void run() { - try { - for (int i = 0; i < 100; i++) { - doRegexTest(); - // try { - // Thread.sleep(10); - // } catch (InterruptedException e) { - // } - } - - successed.incrementAndGet(); - } finally { - countDown.countDown(); + executor.submit(() -> { + try { + for (int i1 = 0; i1 < 100; i1++) { + doRegexTest(); + // try { + // Thread.sleep(10); + // } catch (InterruptedException e) { + // } } + + successed.incrementAndGet(); + } finally { + countDown.countDown(); } }); } diff --git a/instance/manager/src/main/java/com/alibaba/otter/canal/instance/manager/CanalInstanceWithManager.java b/instance/manager/src/main/java/com/alibaba/otter/canal/instance/manager/CanalInstanceWithManager.java index 8a35326d..88713f0b 100644 --- a/instance/manager/src/main/java/com/alibaba/otter/canal/instance/manager/CanalInstanceWithManager.java +++ b/instance/manager/src/main/java/com/alibaba/otter/canal/instance/manager/CanalInstanceWithManager.java @@ -118,13 +118,7 @@ public class CanalInstanceWithManager extends AbstractCanalInstance { } else { try { File externalLibDir = new File(alarmHandlerPluginDir); - File[] jarFiles = externalLibDir.listFiles(new FilenameFilter() { - - @Override - public boolean accept(File dir, String name) { - return name.endsWith(".jar"); - } - }); + File[] jarFiles = externalLibDir.listFiles((dir, name) -> name.endsWith(".jar")); if (jarFiles == null || jarFiles.length == 0) { throw new IllegalStateException(String.format("alarmHandlerPluginDir [%s] can't find any name endswith \".jar\" file.", alarmHandlerPluginDir)); @@ -242,9 +236,9 @@ public class CanalInstanceWithManager extends AbstractCanalInstance { List> groupDbAddresses = parameters.getGroupDbAddresses(); if (!CollectionUtils.isEmpty(groupDbAddresses)) { int size = groupDbAddresses.get(0).size();// 取第一个分组的数量,主备分组的数量必须一致 - List eventParsers = new ArrayList(); + List eventParsers = new ArrayList<>(); for (int i = 0; i < size; i++) { - List dbAddress = new ArrayList(); + List dbAddress = new ArrayList<>(); SourcingType lastType = null; for (List groupDbAddress : groupDbAddresses) { if (lastType != null && !lastType.equals(groupDbAddress.get(i).getType())) { @@ -270,7 +264,7 @@ public class CanalInstanceWithManager extends AbstractCanalInstance { } } else { // 创建一个空数据库地址的parser,可能使用了tddl指定地址,启动的时候才会从tddl获取地址 - this.eventParser = doInitEventParser(type, new ArrayList()); + this.eventParser = doInitEventParser(type, new ArrayList<>()); } logger.info("init eventParser end! \n\t load CanalEventParser:{}", eventParser.getClass().getName()); @@ -494,7 +488,7 @@ public class CanalInstanceWithManager extends AbstractCanalInstance { private synchronized ZkClientx getZkclientx() { // 做一下排序,保证相同的机器只使用同一个链接 - List zkClusters = new ArrayList(parameters.getZkClusters()); + List zkClusters = new ArrayList<>(parameters.getZkClusters()); Collections.sort(zkClusters); return ZkClientx.getZkClient(StringUtils.join(zkClusters, ";")); diff --git a/instance/manager/src/main/java/com/alibaba/otter/canal/instance/manager/model/CanalParameter.java b/instance/manager/src/main/java/com/alibaba/otter/canal/instance/manager/model/CanalParameter.java index 1a6cb99f..bc5b5803 100644 --- a/instance/manager/src/main/java/com/alibaba/otter/canal/instance/manager/model/CanalParameter.java +++ b/instance/manager/src/main/java/com/alibaba/otter/canal/instance/manager/model/CanalParameter.java @@ -661,7 +661,7 @@ public class CanalParameter implements Serializable { public List getDbAddresses() { if (dbAddresses == null) { - dbAddresses = new ArrayList(); + dbAddresses = new ArrayList<>(); if (masterAddress != null) { dbAddresses.add(masterAddress); } @@ -675,22 +675,22 @@ public class CanalParameter implements Serializable { public List> getGroupDbAddresses() { if (groupDbAddresses == null) { - groupDbAddresses = new ArrayList>(); + groupDbAddresses = new ArrayList<>(); if (dbAddresses != null) { for (InetSocketAddress address : dbAddresses) { - List groupAddresses = new ArrayList(); + List groupAddresses = new ArrayList<>(); groupAddresses.add(new DataSourcing(sourcingType, address)); groupDbAddresses.add(groupAddresses); } } else { if (masterAddress != null) { - List groupAddresses = new ArrayList(); + List groupAddresses = new ArrayList<>(); groupAddresses.add(new DataSourcing(sourcingType, masterAddress)); groupDbAddresses.add(groupAddresses); } if (standbyAddress != null) { - List groupAddresses = new ArrayList(); + List groupAddresses = new ArrayList<>(); groupAddresses.add(new DataSourcing(sourcingType, standbyAddress)); groupDbAddresses.add(groupAddresses); } @@ -731,7 +731,7 @@ public class CanalParameter implements Serializable { public List getPositions() { if (positions == null) { - positions = new ArrayList(); + positions = new ArrayList<>(); String masterPosition = buildPosition(masterLogfileName, masterLogfileOffest, masterTimestamp); if (masterPosition != null) { positions.add(masterPosition); diff --git a/instance/manager/src/main/java/com/alibaba/otter/canal/instance/manager/plain/HttpHelper.java b/instance/manager/src/main/java/com/alibaba/otter/canal/instance/manager/plain/HttpHelper.java index af8dcf34..39b42f1c 100644 --- a/instance/manager/src/main/java/com/alibaba/otter/canal/instance/manager/plain/HttpHelper.java +++ b/instance/manager/src/main/java/com/alibaba/otter/canal/instance/manager/plain/HttpHelper.java @@ -57,13 +57,7 @@ public class HttpHelper { // 创建支持忽略证书的https try { - SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() { - - @Override - public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { - return true; - } - }).build(); + SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, (x509Certificates, s) -> true).build(); httpclient = HttpClientBuilder.create() .setSSLContext(sslContext) diff --git a/instance/spring/src/main/java/com/alibaba/otter/canal/instance/spring/support/PropertyPlaceholderConfigurer.java b/instance/spring/src/main/java/com/alibaba/otter/canal/instance/spring/support/PropertyPlaceholderConfigurer.java index f4b7be5b..80b0ae31 100644 --- a/instance/spring/src/main/java/com/alibaba/otter/canal/instance/spring/support/PropertyPlaceholderConfigurer.java +++ b/instance/spring/src/main/java/com/alibaba/otter/canal/instance/spring/support/PropertyPlaceholderConfigurer.java @@ -23,14 +23,7 @@ public class PropertyPlaceholderConfigurer extends org.springframework.beans.fac private static final String PLACEHOLDER_PREFIX = "${"; private static final String PLACEHOLDER_SUFFIX = "}"; - public static ThreadLocal propertiesLocal = new ThreadLocal() { - - @Override - protected Properties initialValue() { - return new Properties(); - } - - }; + public static ThreadLocal propertiesLocal = ThreadLocal.withInitial(Properties::new); private ResourceLoader loader; private String[] locationNames; @@ -57,7 +50,7 @@ public class PropertyPlaceholderConfigurer extends org.springframework.beans.fac } if (locationNames != null) { - List resources = new ArrayList(locationNames.length); + List resources = new ArrayList<>(locationNames.length); for (String location : locationNames) { location = trimToNull(location); diff --git a/meta/src/main/java/com/alibaba/otter/canal/meta/FileMixedMetaManager.java b/meta/src/main/java/com/alibaba/otter/canal/meta/FileMixedMetaManager.java index 28826989..23dee9b9 100644 --- a/meta/src/main/java/com/alibaba/otter/canal/meta/FileMixedMetaManager.java +++ b/meta/src/main/java/com/alibaba/otter/canal/meta/FileMixedMetaManager.java @@ -3,6 +3,7 @@ package com.alibaba.otter.canal.meta; import java.io.File; import java.io.IOException; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; @@ -43,7 +44,7 @@ import com.google.common.collect.MigrateMap; public class FileMixedMetaManager extends MemoryMetaManager implements CanalMetaManager { private static final Logger logger = LoggerFactory.getLogger(FileMixedMetaManager.class); - private static final Charset charset = Charset.forName("UTF-8"); + private static final Charset charset = StandardCharsets.UTF_8; private File dataDir; private String dataFileName = "meta.dat"; private Map dataFileCaches; @@ -69,58 +70,41 @@ public class FileMixedMetaManager extends MemoryMetaManager implements CanalMeta throw new CanalMetaManagerException("dir[" + dataDir.getPath() + "] can not read/write"); } - dataFileCaches = MigrateMap.makeComputingMap(new Function() { - - public File apply(String destination) { - return getDataFile(destination); - } - }); + dataFileCaches = MigrateMap.makeComputingMap(this::getDataFile); executor = Executors.newScheduledThreadPool(1); - destinations = MigrateMap.makeComputingMap(new Function>() { + destinations = MigrateMap.makeComputingMap(this::loadClientIdentity); - public List apply(String destination) { - return loadClientIdentity(destination); + cursors = MigrateMap.makeComputingMap(clientIdentity -> { + Position position = loadCursor(clientIdentity.getDestination(), clientIdentity); + if (position == null) { + return nullCursor; // 返回一个空对象标识,避免出现异常 + } else { + return position; } }); - cursors = MigrateMap.makeComputingMap(new Function() { - - public Position apply(ClientIdentity clientIdentity) { - Position position = loadCursor(clientIdentity.getDestination(), clientIdentity); - if (position == null) { - return nullCursor; // 返回一个空对象标识,避免出现异常 - } else { - return position; - } - } - }); - - updateCursorTasks = Collections.synchronizedSet(new HashSet()); + updateCursorTasks = Collections.synchronizedSet(new HashSet<>()); // 启动定时工作任务 - executor.scheduleAtFixedRate(new Runnable() { - - public void run() { - List tasks = new ArrayList(updateCursorTasks); - for (ClientIdentity clientIdentity : tasks) { - MDC.put("destination", String.valueOf(clientIdentity.getDestination())); - try { - // 定时将内存中的最新值刷到file中,多次变更只刷一次 - if (logger.isInfoEnabled()) { - LogPosition cursor = (LogPosition) getCursor(clientIdentity); - logger.info("clientId:{} cursor:[{},{},{},{},{}] address[{}]", new Object[] { - clientIdentity.getClientId(), cursor.getPostion().getJournalName(), - cursor.getPostion().getPosition(), cursor.getPostion().getTimestamp(), - cursor.getPostion().getServerId(), cursor.getPostion().getGtid(), - cursor.getIdentity().getSourceAddress().toString() }); - } - flushDataToFile(clientIdentity.getDestination()); - updateCursorTasks.remove(clientIdentity); - } catch (Throwable e) { - // ignore - logger.error("period update" + clientIdentity.toString() + " curosr failed!", e); + executor.scheduleAtFixedRate(() -> { + List tasks = new ArrayList<>(updateCursorTasks); + for (ClientIdentity clientIdentity : tasks) { + MDC.put("destination", String.valueOf(clientIdentity.getDestination())); + try { + // 定时将内存中的最新值刷到file中,多次变更只刷一次 + if (logger.isInfoEnabled()) { + LogPosition cursor = (LogPosition) getCursor(clientIdentity); + logger.info("clientId:{} cursor:[{},{},{},{},{}] address[{}]", clientIdentity.getClientId(), cursor.getPostion().getJournalName(), + cursor.getPostion().getPosition(), cursor.getPostion().getTimestamp(), + cursor.getPostion().getServerId(), cursor.getPostion().getGtid(), + cursor.getIdentity().getSourceAddress().toString()); } + flushDataToFile(clientIdentity.getDestination()); + updateCursorTasks.remove(clientIdentity); + } catch (Throwable e) { + // ignore + logger.error("period update" + clientIdentity.toString() + " curosr failed!", e); } } }, @@ -142,24 +126,14 @@ public class FileMixedMetaManager extends MemoryMetaManager implements CanalMeta super.subscribe(clientIdentity); // 订阅信息频率发生比较低,不需要做定时merge处理 - executor.submit(new Runnable() { - - public void run() { - flushDataToFile(clientIdentity.getDestination()); - } - }); + executor.submit(() -> flushDataToFile(clientIdentity.getDestination())); } public void unsubscribe(final ClientIdentity clientIdentity) throws CanalMetaManagerException { super.unsubscribe(clientIdentity); // 订阅信息频率发生比较低,不需要做定时merge处理 - executor.submit(new Runnable() { - - public void run() { - flushDataToFile(clientIdentity.getDestination()); - } - }); + executor.submit(() -> flushDataToFile(clientIdentity.getDestination())); } public void updateCursor(ClientIdentity clientIdentity, Position position) throws CanalMetaManagerException { diff --git a/meta/src/main/java/com/alibaba/otter/canal/meta/MemoryMetaManager.java b/meta/src/main/java/com/alibaba/otter/canal/meta/MemoryMetaManager.java index d5e040a6..7d8caa83 100644 --- a/meta/src/main/java/com/alibaba/otter/canal/meta/MemoryMetaManager.java +++ b/meta/src/main/java/com/alibaba/otter/canal/meta/MemoryMetaManager.java @@ -32,22 +32,11 @@ public class MemoryMetaManager extends AbstractCanalLifeCycle implements CanalMe public void start() { super.start(); - batches = MigrateMap.makeComputingMap(new Function() { - - public MemoryClientIdentityBatch apply(ClientIdentity clientIdentity) { - return MemoryClientIdentityBatch.create(clientIdentity); - } - - }); + batches = MigrateMap.makeComputingMap(MemoryClientIdentityBatch::create); cursors = new MapMaker().makeMap(); - destinations = MigrateMap.makeComputingMap(new Function>() { - - public List apply(String destination) { - return Lists.newArrayList(); - } - }); + destinations = MigrateMap.makeComputingMap(destination -> Lists.newArrayList()); } public void stop() { diff --git a/meta/src/main/java/com/alibaba/otter/canal/meta/MixedMetaManager.java b/meta/src/main/java/com/alibaba/otter/canal/meta/MixedMetaManager.java index 56b9ae71..48c76cf8 100644 --- a/meta/src/main/java/com/alibaba/otter/canal/meta/MixedMetaManager.java +++ b/meta/src/main/java/com/alibaba/otter/canal/meta/MixedMetaManager.java @@ -1,6 +1,5 @@ package com.alibaba.otter.canal.meta; -import java.util.List; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -11,7 +10,6 @@ import com.alibaba.otter.canal.meta.exception.CanalMetaManagerException; import com.alibaba.otter.canal.protocol.ClientIdentity; import com.alibaba.otter.canal.protocol.position.Position; import com.alibaba.otter.canal.protocol.position.PositionRange; -import com.google.common.base.Function; import com.google.common.collect.MigrateMap; /** @@ -37,36 +35,25 @@ public class MixedMetaManager extends MemoryMetaManager implements CanalMetaMana } executor = Executors.newFixedThreadPool(1); - destinations = MigrateMap.makeComputingMap(new Function>() { + destinations = MigrateMap.makeComputingMap(destination -> zooKeeperMetaManager.listAllSubscribeInfo(destination)); - public List apply(String destination) { - return zooKeeperMetaManager.listAllSubscribeInfo(destination); + cursors = MigrateMap.makeComputingMap(clientIdentity -> { + Position position = zooKeeperMetaManager.getCursor(clientIdentity); + if (position == null) { + return nullCursor; // 返回一个空对象标识,避免出现异常 + } else { + return position; } }); - cursors = MigrateMap.makeComputingMap(new Function() { - - public Position apply(ClientIdentity clientIdentity) { - Position position = zooKeeperMetaManager.getCursor(clientIdentity); - if (position == null) { - return nullCursor; // 返回一个空对象标识,避免出现异常 - } else { - return position; - } - } - }); - - batches = MigrateMap.makeComputingMap(new Function() { - - public MemoryClientIdentityBatch apply(ClientIdentity clientIdentity) { - // 读取一下zookeeper信息,初始化一次 - MemoryClientIdentityBatch batches = MemoryClientIdentityBatch.create(clientIdentity); - Map positionRanges = zooKeeperMetaManager.listAllBatchs(clientIdentity); - for (Map.Entry entry : positionRanges.entrySet()) { - batches.addPositionRange(entry.getValue(), entry.getKey()); // 添加记录到指定batchId - } - return batches; + batches = MigrateMap.makeComputingMap(clientIdentity -> { + // 读取一下zookeeper信息,初始化一次 + MemoryClientIdentityBatch batches = MemoryClientIdentityBatch.create(clientIdentity); + Map positionRanges = zooKeeperMetaManager.listAllBatchs(clientIdentity); + for (Map.Entry entry : positionRanges.entrySet()) { + batches.addPositionRange(entry.getValue(), entry.getKey()); // 添加记录到指定batchId } + return batches; }); } @@ -85,23 +72,13 @@ public class MixedMetaManager extends MemoryMetaManager implements CanalMetaMana public void subscribe(final ClientIdentity clientIdentity) throws CanalMetaManagerException { super.subscribe(clientIdentity); - executor.submit(new Runnable() { - - public void run() { - zooKeeperMetaManager.subscribe(clientIdentity); - } - }); + executor.submit(() -> zooKeeperMetaManager.subscribe(clientIdentity)); } public void unsubscribe(final ClientIdentity clientIdentity) throws CanalMetaManagerException { super.unsubscribe(clientIdentity); - executor.submit(new Runnable() { - - public void run() { - zooKeeperMetaManager.unsubscribe(clientIdentity); - } - }); + executor.submit(() -> zooKeeperMetaManager.unsubscribe(clientIdentity)); } public void updateCursor(final ClientIdentity clientIdentity, final Position position) @@ -109,12 +86,7 @@ public class MixedMetaManager extends MemoryMetaManager implements CanalMetaMana super.updateCursor(clientIdentity, position); // 异步刷新 - executor.submit(new Runnable() { - - public void run() { - zooKeeperMetaManager.updateCursor(clientIdentity, position); - } - }); + executor.submit(() -> zooKeeperMetaManager.updateCursor(clientIdentity, position)); } @Override @@ -131,12 +103,7 @@ public class MixedMetaManager extends MemoryMetaManager implements CanalMetaMana throws CanalMetaManagerException { final Long batchId = super.addBatch(clientIdentity, positionRange); // 异步刷新 - executor.submit(new Runnable() { - - public void run() { - zooKeeperMetaManager.addBatch(clientIdentity, positionRange, batchId); - } - }); + executor.submit(() -> zooKeeperMetaManager.addBatch(clientIdentity, positionRange, batchId)); return batchId; } @@ -144,23 +111,15 @@ public class MixedMetaManager extends MemoryMetaManager implements CanalMetaMana throws CanalMetaManagerException { super.addBatch(clientIdentity, positionRange, batchId); // 异步刷新 - executor.submit(new Runnable() { - - public void run() { - zooKeeperMetaManager.addBatch(clientIdentity, positionRange, batchId); - } - }); + executor.submit(() -> zooKeeperMetaManager.addBatch(clientIdentity, positionRange, batchId)); } public PositionRange removeBatch(final ClientIdentity clientIdentity, final Long batchId) throws CanalMetaManagerException { PositionRange positionRange = super.removeBatch(clientIdentity, batchId); // 异步刷新 - executor.submit(new Runnable() { - - public void run() { - zooKeeperMetaManager.removeBatch(clientIdentity, batchId); - } + executor.submit(() -> { + zooKeeperMetaManager.removeBatch(clientIdentity, batchId); }); return positionRange; @@ -170,12 +129,7 @@ public class MixedMetaManager extends MemoryMetaManager implements CanalMetaMana super.clearAllBatchs(clientIdentity); // 异步刷新 - executor.submit(new Runnable() { - - public void run() { - zooKeeperMetaManager.clearAllBatchs(clientIdentity); - } - }); + executor.submit(() -> zooKeeperMetaManager.clearAllBatchs(clientIdentity)); } // =============== setter / getter ================ diff --git a/meta/src/main/java/com/alibaba/otter/canal/meta/PeriodMixedMetaManager.java b/meta/src/main/java/com/alibaba/otter/canal/meta/PeriodMixedMetaManager.java index f3d8c5d0..55180bd4 100644 --- a/meta/src/main/java/com/alibaba/otter/canal/meta/PeriodMixedMetaManager.java +++ b/meta/src/main/java/com/alibaba/otter/canal/meta/PeriodMixedMetaManager.java @@ -18,7 +18,6 @@ import com.alibaba.otter.canal.meta.exception.CanalMetaManagerException; import com.alibaba.otter.canal.protocol.ClientIdentity; import com.alibaba.otter.canal.protocol.position.Position; import com.alibaba.otter.canal.protocol.position.PositionRange; -import com.google.common.base.Function; import com.google.common.collect.MigrateMap; /** @@ -52,54 +51,40 @@ public class PeriodMixedMetaManager extends MemoryMetaManager implements CanalMe } executor = Executors.newScheduledThreadPool(1); - destinations = MigrateMap.makeComputingMap(new Function>() { + destinations = MigrateMap.makeComputingMap(destination -> zooKeeperMetaManager.listAllSubscribeInfo(destination)); - public List apply(String destination) { - return zooKeeperMetaManager.listAllSubscribeInfo(destination); + cursors = MigrateMap.makeComputingMap(clientIdentity -> { + Position position = zooKeeperMetaManager.getCursor(clientIdentity); + if (position == null) { + return nullCursor; // 返回一个空对象标识,避免出现异常 + } else { + return position; } }); - cursors = MigrateMap.makeComputingMap(new Function() { - - public Position apply(ClientIdentity clientIdentity) { - Position position = zooKeeperMetaManager.getCursor(clientIdentity); - if (position == null) { - return nullCursor; // 返回一个空对象标识,避免出现异常 - } else { - return position; - } + batches = MigrateMap.makeComputingMap(clientIdentity -> { + // 读取一下zookeeper信息,初始化一次 + MemoryClientIdentityBatch batches = MemoryClientIdentityBatch.create(clientIdentity); + Map positionRanges = zooKeeperMetaManager.listAllBatchs(clientIdentity); + for (Map.Entry entry : positionRanges.entrySet()) { + batches.addPositionRange(entry.getValue(), entry.getKey()); // 添加记录到指定batchId } + return batches; }); - batches = MigrateMap.makeComputingMap(new Function() { - - public MemoryClientIdentityBatch apply(ClientIdentity clientIdentity) { - // 读取一下zookeeper信息,初始化一次 - MemoryClientIdentityBatch batches = MemoryClientIdentityBatch.create(clientIdentity); - Map positionRanges = zooKeeperMetaManager.listAllBatchs(clientIdentity); - for (Map.Entry entry : positionRanges.entrySet()) { - batches.addPositionRange(entry.getValue(), entry.getKey()); // 添加记录到指定batchId - } - return batches; - } - }); - - updateCursorTasks = Collections.synchronizedSet(new HashSet()); + updateCursorTasks = Collections.synchronizedSet(new HashSet<>()); // 启动定时工作任务 - executor.scheduleAtFixedRate(new Runnable() { - - public void run() { - List tasks = new ArrayList(updateCursorTasks); - for (ClientIdentity clientIdentity : tasks) { - try { - // 定时将内存中的最新值刷到zookeeper中,多次变更只刷一次 - zooKeeperMetaManager.updateCursor(clientIdentity, getCursor(clientIdentity)); - updateCursorTasks.remove(clientIdentity); - } catch (Throwable e) { - // ignore - logger.error("period update" + clientIdentity.toString() + " curosr failed!", e); - } + executor.scheduleAtFixedRate(() -> { + List tasks = new ArrayList<>(updateCursorTasks); + for (ClientIdentity clientIdentity : tasks) { + try { + // 定时将内存中的最新值刷到zookeeper中,多次变更只刷一次 + zooKeeperMetaManager.updateCursor(clientIdentity, getCursor(clientIdentity)); + updateCursorTasks.remove(clientIdentity); + } catch (Throwable e) { + // ignore + logger.error("period update" + clientIdentity.toString() + " curosr failed!", e); } } }, period, period, TimeUnit.MILLISECONDS); @@ -121,24 +106,14 @@ public class PeriodMixedMetaManager extends MemoryMetaManager implements CanalMe super.subscribe(clientIdentity); // 订阅信息频率发生比较低,不需要做定时merge处理 - executor.submit(new Runnable() { - - public void run() { - zooKeeperMetaManager.subscribe(clientIdentity); - } - }); + executor.submit(() -> zooKeeperMetaManager.subscribe(clientIdentity)); } public void unsubscribe(final ClientIdentity clientIdentity) throws CanalMetaManagerException { super.unsubscribe(clientIdentity); // 订阅信息频率发生比较低,不需要做定时merge处理 - executor.submit(new Runnable() { - - public void run() { - zooKeeperMetaManager.unsubscribe(clientIdentity); - } - }); + executor.submit(() -> zooKeeperMetaManager.unsubscribe(clientIdentity)); } public void updateCursor(ClientIdentity clientIdentity, Position position) throws CanalMetaManagerException { diff --git a/meta/src/main/java/com/alibaba/otter/canal/meta/ZooKeeperMetaManager.java b/meta/src/main/java/com/alibaba/otter/canal/meta/ZooKeeperMetaManager.java index 2e3fdde5..255b98a7 100644 --- a/meta/src/main/java/com/alibaba/otter/canal/meta/ZooKeeperMetaManager.java +++ b/meta/src/main/java/com/alibaba/otter/canal/meta/ZooKeeperMetaManager.java @@ -103,7 +103,7 @@ public class ZooKeeperMetaManager extends AbstractCanalLifeCycle implements Cana public List listAllSubscribeInfo(String destination) throws CanalMetaManagerException { if (zkClientx == null) { //重新加载时可能为空 - return new ArrayList(); + return new ArrayList<>(); } String path = ZookeeperPathUtils.getDestinationPath(destination); List childs = null; @@ -114,9 +114,9 @@ public class ZooKeeperMetaManager extends AbstractCanalLifeCycle implements Cana } if (CollectionUtils.isEmpty(childs)) { - return new ArrayList(); + return new ArrayList<>(); } - List clientIds = new ArrayList(); + List clientIds = new ArrayList<>(); for (String child : childs) { if (StringUtils.isNumeric(child)) { clientIds.add(ZookeeperPathUtils.getClientId(child)); @@ -252,7 +252,7 @@ public class ZooKeeperMetaManager extends AbstractCanalLifeCycle implements Cana return null; } // 找到最大的Id - ArrayList batchIds = new ArrayList(nodes.size()); + ArrayList batchIds = new ArrayList<>(nodes.size()); for (String batchIdString : nodes) { batchIds.add(Long.valueOf(batchIdString)); } @@ -279,7 +279,7 @@ public class ZooKeeperMetaManager extends AbstractCanalLifeCycle implements Cana return null; } // 找到最小的Id - ArrayList batchIds = new ArrayList(nodes.size()); + ArrayList batchIds = new ArrayList<>(nodes.size()); for (String batchIdString : nodes) { batchIds.add(Long.valueOf(batchIdString)); } @@ -306,7 +306,7 @@ public class ZooKeeperMetaManager extends AbstractCanalLifeCycle implements Cana return Maps.newHashMap(); } // 找到最大的Id - ArrayList batchIds = new ArrayList(nodes.size()); + ArrayList batchIds = new ArrayList<>(nodes.size()); for (String batchIdString : nodes) { batchIds.add(Long.valueOf(batchIdString)); } diff --git a/meta/src/test/java/com/alibaba/otter/canal/meta/AbstractMetaManagerTest.java b/meta/src/test/java/com/alibaba/otter/canal/meta/AbstractMetaManagerTest.java index 9f4582e7..62011c52 100644 --- a/meta/src/test/java/com/alibaba/otter/canal/meta/AbstractMetaManagerTest.java +++ b/meta/src/test/java/com/alibaba/otter/canal/meta/AbstractMetaManagerTest.java @@ -20,7 +20,7 @@ import org.junit.Test; public class AbstractMetaManagerTest extends AbstractZkTest { private static final String MYSQL_ADDRESS = "127.0.0.1"; - protected ClientIdentity clientIdentity = new ClientIdentity(destination, (short) 1); ; + protected ClientIdentity clientIdentity = new ClientIdentity(destination, (short) 1); @Test public void doSubscribeTest(CanalMetaManager metaManager) { @@ -116,6 +116,6 @@ public class AbstractMetaManagerTest extends AbstractZkTest { LogPosition end = new LogPosition(); end.setIdentity(new LogIdentity(new InetSocketAddress(MYSQL_ADDRESS, 3306), 1234L)); end.setPostion(new EntryPosition("mysql-bin.000000" + (number + 1), 106L, (new Date().getTime()) + 1000 * 1000L)); - return new PositionRange(start, end); + return new PositionRange<>(start, end); } } diff --git a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/AbstractEventParser.java b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/AbstractEventParser.java index 74ffee02..694e999e 100644 --- a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/AbstractEventParser.java +++ b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/AbstractEventParser.java @@ -80,14 +80,8 @@ public abstract class AbstractEventParser extends AbstractCanalLifeCycle protected Thread parseThread = null; - protected Thread.UncaughtExceptionHandler handler = new Thread.UncaughtExceptionHandler() { - - public void uncaughtException(Thread t, - Throwable e) { - logger.error("parse events has an error", - e); - } - }; + protected Thread.UncaughtExceptionHandler handler = (t, e) -> logger.error("parse events has an error", + e); protected EventTransactionBuffer transactionBuffer; protected int transactionSize = 1024; @@ -134,22 +128,19 @@ public abstract class AbstractEventParser extends AbstractCanalLifeCycle public AbstractEventParser(){ // 初始化一下 - transactionBuffer = new EventTransactionBuffer(new TransactionFlushCallback() { + transactionBuffer = new EventTransactionBuffer(transaction -> { + boolean successed = consumeTheEventAndProfilingIfNecessary(transaction); + if (!running) { + return; + } - public void flush(List transaction) throws InterruptedException { - boolean successed = consumeTheEventAndProfilingIfNecessary(transaction); - if (!running) { - return; - } + if (!successed) { + throw new CanalParseException("consume failed!"); + } - if (!successed) { - throw new CanalParseException("consume failed!"); - } - - LogPosition position = buildLastTransactionPosition(transaction); - if (position != null) { // 可能position为空 - logPositionManager.persistLogPosition(AbstractEventParser.this.destination, position); - } + LogPosition position = buildLastTransactionPosition(transaction); + if (position != null) { // 可能position为空 + logPositionManager.persistLogPosition(AbstractEventParser.this.destination, position); } }); } @@ -542,7 +533,7 @@ public abstract class AbstractEventParser extends AbstractCanalLifeCycle */ private Map> parseFieldFilterMap(String config) { - Map> map = new HashMap>(); + Map> map = new HashMap<>(); if (StringUtils.isNotBlank(config)) { for (String filter : config.split(",")) { diff --git a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/EventTransactionBuffer.java b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/EventTransactionBuffer.java index 8034d078..45248bed 100644 --- a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/EventTransactionBuffer.java +++ b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/EventTransactionBuffer.java @@ -115,7 +115,7 @@ public class EventTransactionBuffer extends AbstractCanalLifeCycle { long end = this.putSequence.get(); if (start <= end) { - List transaction = new ArrayList(); + List transaction = new ArrayList<>(); for (long next = start; next <= end; next++) { transaction.add(this.entries[getIndex(next)]); } diff --git a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/TableMeta.java b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/TableMeta.java index 68915ae4..6a2b7aa8 100644 --- a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/TableMeta.java +++ b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/TableMeta.java @@ -23,7 +23,7 @@ public class TableMeta { private String schema; private String table; - private List fields = new ArrayList(); + private List fields = new ArrayList<>(); private String ddl; // 表结构的DDL语句 public TableMeta(){ @@ -75,7 +75,7 @@ public class TableMeta { } public List getPrimaryFields() { - List primarys = new ArrayList(); + List primarys = new ArrayList<>(); for (FieldMeta meta : fields) { if (meta.isKey()) { primarys.add(meta); diff --git a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/group/GroupEventParser.java b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/group/GroupEventParser.java index b467afc6..00d09437 100644 --- a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/group/GroupEventParser.java +++ b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/group/GroupEventParser.java @@ -14,7 +14,7 @@ import com.alibaba.otter.canal.parse.CanalEventParser; */ public class GroupEventParser extends AbstractCanalLifeCycle implements CanalEventParser { - private List eventParsers = new ArrayList(); + private List eventParsers = new ArrayList<>(); public void start() { super.start(); diff --git a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/MysqlEventParser.java b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/MysqlEventParser.java index 1e621b3f..517a8247 100644 --- a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/MysqlEventParser.java +++ b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/MysqlEventParser.java @@ -714,7 +714,7 @@ public class MysqlEventParser extends AbstractMysqlEventParser implements CanalE } int i = 0; - Map maps = new HashMap(names.size(), 1f); + Map maps = new HashMap<>(names.size(), 1f); for (FieldPacket name : names) { maps.put(name.getName(), fields.get(i)); i++; diff --git a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/MysqlMultiStageCoprocessor.java b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/MysqlMultiStageCoprocessor.java index afe12ddc..10df2af5 100644 --- a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/MysqlMultiStageCoprocessor.java +++ b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/MysqlMultiStageCoprocessor.java @@ -98,9 +98,9 @@ public class MysqlMultiStageCoprocessor extends AbstractCanalLifeCycle implement ExceptionHandler exceptionHandler = new SimpleFatalExceptionHandler(); // stage 2 this.logContext = new LogContext(); - simpleParserStage = new BatchEventProcessor(disruptorMsgBuffer, - sequenceBarrier, - new SimpleParserStage(logContext)); + simpleParserStage = new BatchEventProcessor<>(disruptorMsgBuffer, + sequenceBarrier, + new SimpleParserStage(logContext)); simpleParserStage.setExceptionHandler(exceptionHandler); disruptorMsgBuffer.addGatingSequences(simpleParserStage.getSequence()); @@ -119,9 +119,9 @@ public class MysqlMultiStageCoprocessor extends AbstractCanalLifeCycle implement // stage 4 SequenceBarrier sinkSequenceBarrier = disruptorMsgBuffer.newBarrier(sequence); - sinkStoreStage = new BatchEventProcessor(disruptorMsgBuffer, - sinkSequenceBarrier, - new SinkStoreStage()); + sinkStoreStage = new BatchEventProcessor<>(disruptorMsgBuffer, + sinkSequenceBarrier, + new SinkStoreStage()); sinkStoreStage.setExceptionHandler(exceptionHandler); disruptorMsgBuffer.addGatingSequences(sinkStoreStage.getSequence()); diff --git a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/dbsync/LogEventConvert.java b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/dbsync/LogEventConvert.java index 69bd75ca..2c94711e 100644 --- a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/dbsync/LogEventConvert.java +++ b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/dbsync/LogEventConvert.java @@ -88,8 +88,8 @@ public class LogEventConvert extends AbstractCanalLifeCycle implements BinlogPar private volatile AviaterRegexFilter nameFilter; // 运行时引用可能会有变化,比如规则发生变化时 private volatile AviaterRegexFilter nameBlackFilter; - private Map> fieldFilterMap = new HashMap>(); - private Map> fieldBlackFilterMap = new HashMap>(); + private Map> fieldFilterMap = new HashMap<>(); + private Map> fieldBlackFilterMap = new HashMap<>(); private TableMetaCache tableMetaCache; private Charset charset = Charset.defaultCharset(); @@ -1040,7 +1040,7 @@ public class LogEventConvert extends AbstractCanalLifeCycle implements BinlogPar if (fieldFilterMap != null) { this.fieldFilterMap = fieldFilterMap; } else { - this.fieldFilterMap = new HashMap>(); + this.fieldFilterMap = new HashMap<>(); } for (Map.Entry> entry : this.fieldFilterMap.entrySet()) { @@ -1052,7 +1052,7 @@ public class LogEventConvert extends AbstractCanalLifeCycle implements BinlogPar if (fieldBlackFilterMap != null) { this.fieldBlackFilterMap = fieldBlackFilterMap; } else { - this.fieldBlackFilterMap = new HashMap>(); + this.fieldBlackFilterMap = new HashMap<>(); } for (Map.Entry> entry : this.fieldBlackFilterMap.entrySet()) { diff --git a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/dbsync/TableMetaCache.java b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/dbsync/TableMetaCache.java index 8c9d0e39..6afdefdb 100644 --- a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/dbsync/TableMetaCache.java +++ b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/dbsync/TableMetaCache.java @@ -105,7 +105,7 @@ public class TableMetaCache { TableMeta tableMeta = memoryTableMeta.find(schema, table); return tableMeta.getFields(); } else { - return new ArrayList(); + return new ArrayList<>(); } } @@ -113,7 +113,7 @@ public class TableMetaCache { * 处理desc table的结果 */ public static List parseTableMetaByDesc(ResultSetPacket packet) { - Map nameMaps = new HashMap(6, 1f); + Map nameMaps = new HashMap<>(6, 1f); int index = 0; for (FieldPacket fieldPacket : packet.getFieldDescriptors()) { nameMaps.put(fieldPacket.getOriginalName(), index++); @@ -121,7 +121,7 @@ public class TableMetaCache { int size = packet.getFieldDescriptors().size(); int count = packet.getFieldValues().size() / packet.getFieldDescriptors().size(); - List result = new ArrayList(); + List result = new ArrayList<>(); for (int i = 0; i < count; i++) { FieldMeta meta = new FieldMeta(); // 做一个优化,使用String.intern(),共享String对象,减少内存使用 diff --git a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/ddl/DruidDdlParser.java b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/ddl/DruidDdlParser.java index 1a5513ea..197f6252 100644 --- a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/ddl/DruidDdlParser.java +++ b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/ddl/DruidDdlParser.java @@ -56,7 +56,7 @@ public class DruidDdlParser { return Arrays.asList(ddlResult); } - List ddlResults = new ArrayList(); + List ddlResults = new ArrayList<>(); for (SQLStatement statement : stmtList) { if (statement instanceof SQLCreateTableStatement) { DdlResult ddlResult = new DdlResult(); diff --git a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/local/BinLogFileQueue.java b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/local/BinLogFileQueue.java index eb227303..ca09dccb 100644 --- a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/local/BinLogFileQueue.java +++ b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/local/BinLogFileQueue.java @@ -26,7 +26,7 @@ import com.alibaba.otter.canal.parse.exception.CanalParseException; public class BinLogFileQueue { private String baseName = "mysql-bin."; - private List binlogs = new ArrayList(); + private List binlogs = new ArrayList<>(); private File directory; private ReentrantLock lock = new ReentrantLock(); private Condition nextCondition = lock.newCondition(); @@ -177,7 +177,7 @@ public class BinLogFileQueue { * 获取当前所有binlog文件 */ public List currentBinlogs() { - return new ArrayList(binlogs); + return new ArrayList<>(binlogs); } public void destory() { @@ -216,7 +216,7 @@ public class BinLogFileQueue { } private List listBinlogFiles() { - List files = new ArrayList(); + List files = new ArrayList<>(); files.addAll(FileUtils.listFiles(directory, new IOFileFilter() { public boolean accept(File file) { @@ -230,13 +230,7 @@ public class BinLogFileQueue { } }, null)); // 排一下序列 - Collections.sort(files, new Comparator() { - - public int compare(File o1, File o2) { - return o1.getName().compareTo(o2.getName()); - } - - }); + Collections.sort(files, Comparator.comparing(File::getName)); return files; } diff --git a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/rds/BinlogDownloadQueue.java b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/rds/BinlogDownloadQueue.java index b90b89d5..ad8a590c 100644 --- a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/rds/BinlogDownloadQueue.java +++ b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/rds/BinlogDownloadQueue.java @@ -53,8 +53,8 @@ public class BinlogDownloadQueue { private static final Logger logger = LoggerFactory.getLogger(BinlogDownloadQueue.class); private static final int TIMEOUT = 10000; - private LinkedBlockingQueue downloadQueue = new LinkedBlockingQueue(); - private LinkedBlockingQueue taskQueue = new LinkedBlockingQueue(); + private LinkedBlockingQueue downloadQueue = new LinkedBlockingQueue<>(); + private LinkedBlockingQueue taskQueue = new LinkedBlockingQueue<>(); private LinkedList binlogList; private final int batchFileSize; private Thread downloadThread; @@ -78,13 +78,7 @@ public class BinlogDownloadQueue { String fileName = StringUtils.substringBetween(binlog.getDownloadLink(), "mysql-bin.", "?"); binlog.setFileName(fileName); } - Collections.sort(this.binlogList, new Comparator() { - - @Override - public int compare(BinlogFile o1, BinlogFile o2) { - return o1.getFileName().compareTo(o2.getFileName()); - } - }); + this.binlogList.sort(Comparator.comparing(BinlogFile::getFileName)); } public void cleanDir() throws IOException { @@ -187,13 +181,9 @@ public class BinlogDownloadQueue { builder.setMaxConnPerRoute(50); builder.setMaxConnTotal(100); // 创建支持忽略证书的https - final SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() { - - @Override - public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { - return true; - } - }).build(); + final SSLContext sslContext = new SSLContextBuilder() + .loadTrustMaterial(null, (x509Certificates, s) -> true) + .build(); httpClient = HttpClientBuilder.create() .setSSLContext(sslContext) diff --git a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/rds/HttpHelper.java b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/rds/HttpHelper.java index 9ed865fe..db73bafe 100644 --- a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/rds/HttpHelper.java +++ b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/rds/HttpHelper.java @@ -140,13 +140,9 @@ public class HttpHelper { CloseableHttpResponse response = null; try { // 创建支持忽略证书的https - final SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() { - - @Override - public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { - return true; - } - }).build(); + final SSLContext sslContext = new SSLContextBuilder() + .loadTrustMaterial(null, (x509Certificates, s) -> true) + .build(); CloseableHttpClient httpClient = HttpClientBuilder.create() .setSSLContext(sslContext) @@ -205,13 +201,9 @@ public class HttpHelper { CloseableHttpResponse response = null; try { // 创建支持忽略证书的https - final SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() { - - @Override - public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { - return true; - } - }).build(); + final SSLContext sslContext = new SSLContextBuilder() + .loadTrustMaterial(null, (x509Certificates, s) -> true) + .build(); CloseableHttpClient httpClient = HttpClientBuilder.create() .setSSLContext(sslContext) diff --git a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/rds/RdsBinlogEventParserProxy.java b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/rds/RdsBinlogEventParserProxy.java index 53b770ef..07e9da9b 100644 --- a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/rds/RdsBinlogEventParserProxy.java +++ b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/rds/RdsBinlogEventParserProxy.java @@ -30,16 +30,12 @@ public class RdsBinlogEventParserProxy extends MysqlEventParser { private int batchFileSize = 4; // 最多下载的binlog文件数量 private RdsLocalBinlogEventParser rdsLocalBinlogEventParser = null; - private ExecutorService executorService = Executors.newSingleThreadExecutor(new ThreadFactory() { - - @Override - public Thread newThread(Runnable r) { + private ExecutorService executorService = Executors.newSingleThreadExecutor(r -> { Thread t = new Thread(r, "rds-binlog-daemon-thread"); t.setDaemon(true); return t; - } - }); + }); @Override public void start() { @@ -79,32 +75,17 @@ public class RdsBinlogEventParserProxy extends MysqlEventParser { rdsLocalBinlogEventParser.setParallel(this.parallel); rdsLocalBinlogEventParser.setParallelBufferSize(this.parallelBufferSize); rdsLocalBinlogEventParser.setParallelThreadSize(this.parallelThreadSize); - rdsLocalBinlogEventParser.setFinishListener(new RdsLocalBinlogEventParser.ParseFinishListener() { - - @Override - public void onFinish() { - executorService.execute(new Runnable() { - - @Override - public void run() { - rdsLocalBinlogEventParser.stop(); - // empty the dump error count,or will go into local binlog mode again,with error - // position,never get out,fixed by bucketli - RdsBinlogEventParserProxy.this.setDumpErrorCount(0); - RdsBinlogEventParserProxy.this.start(); - } - }); - - } - }); - this.setParserExceptionHandler(new ParserExceptionHandler() { - - @Override - public void handle(Throwable e) { - handleMysqlParserException(e); - if (targetHandler != null) { - targetHandler.handle(e); - } + rdsLocalBinlogEventParser.setFinishListener(() -> executorService.execute(() -> { + rdsLocalBinlogEventParser.stop(); + // empty the dump error count,or will go into local binlog mode again,with error + // position,never get out,fixed by bucketli + RdsBinlogEventParserProxy.this.setDumpErrorCount(0); + RdsBinlogEventParserProxy.this.start(); + })); + this.setParserExceptionHandler(e -> { + handleMysqlParserException(e); + if (targetHandler != null) { + targetHandler.handle(e); } }); } @@ -115,29 +96,25 @@ public class RdsBinlogEventParserProxy extends MysqlEventParser { private void handleMysqlParserException(Throwable throwable) { if (throwable instanceof PositionNotFoundException) { logger.info("remove rds not found position, try download rds binlog!"); - executorService.execute(new Runnable() { + executorService.execute(() -> { + try { + logger.info("stop mysql parser!"); + RdsBinlogEventParserProxy rdsBinlogEventParserProxy = RdsBinlogEventParserProxy.this; + long serverId = rdsBinlogEventParserProxy.getServerId(); + rdsLocalBinlogEventParser.setServerId(serverId); + rdsBinlogEventParserProxy.stop(); + } catch (Throwable e) { + logger.info("handle exception failed", e); + } - @Override - public void run() { - try { - logger.info("stop mysql parser!"); - RdsBinlogEventParserProxy rdsBinlogEventParserProxy = RdsBinlogEventParserProxy.this; - long serverId = rdsBinlogEventParserProxy.getServerId(); - rdsLocalBinlogEventParser.setServerId(serverId); - rdsBinlogEventParserProxy.stop(); - } catch (Throwable e) { - logger.info("handle exception failed", e); - } - - try { - logger.info("start rds mysql binlog parser!"); - rdsLocalBinlogEventParser.start(); - } catch (Throwable e) { - logger.info("handle exception failed", e); - rdsLocalBinlogEventParser.stop(); - RdsBinlogEventParserProxy rdsBinlogEventParserProxy = RdsBinlogEventParserProxy.this; - rdsBinlogEventParserProxy.start();// 继续重试 - } + try { + logger.info("start rds mysql binlog parser!"); + rdsLocalBinlogEventParser.start(); + } catch (Throwable e) { + logger.info("handle exception failed", e); + rdsLocalBinlogEventParser.stop(); + RdsBinlogEventParserProxy rdsBinlogEventParserProxy = RdsBinlogEventParserProxy.this; + rdsBinlogEventParserProxy.start();// 继续重试 } }); } diff --git a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/rds/RdsLocalBinlogEventParser.java b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/rds/RdsLocalBinlogEventParser.java index 2e0960fe..0680f39c 100644 --- a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/rds/RdsLocalBinlogEventParser.java +++ b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/rds/RdsLocalBinlogEventParser.java @@ -82,13 +82,7 @@ public class RdsLocalBinlogEventParser extends LocalBinlogEventParser implements logger.error("download binlog failed", e); throw new CanalParseException(e); } - setParserExceptionHandler(new ParserExceptionHandler() { - - @Override - public void handle(Throwable e) { - handleMysqlParserException(e); - } - }); + setParserExceptionHandler(this::handleMysqlParserException); super.start(); } @@ -105,13 +99,9 @@ public class RdsLocalBinlogEventParser extends LocalBinlogEventParser implements } try { - binlogDownloadQueue.execute(new Runnable() { - - @Override - public void run() { - RdsLocalBinlogEventParser.super.stop(); - RdsLocalBinlogEventParser.super.start(); - } + binlogDownloadQueue.execute(() -> { + RdsLocalBinlogEventParser.super.stop(); + RdsLocalBinlogEventParser.super.start(); }); } catch (InterruptedException e) { throw new RuntimeException(e); diff --git a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/rds/request/AbstractRequest.java b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/rds/request/AbstractRequest.java index 66d7591a..b1494d95 100644 --- a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/rds/request/AbstractRequest.java +++ b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/rds/request/AbstractRequest.java @@ -177,7 +177,7 @@ public abstract class AbstractRequest { private String makeRequestString(Map param) throws Exception { fillCommonParam(param); - String sign = makeSignature(new TreeMap(param)); + String sign = makeSignature(new TreeMap<>(param)); StringBuilder builder = new StringBuilder(); for (Map.Entry entry : param.entrySet()) { builder.append(encode(entry.getKey())).append("=").append(encode(entry.getValue())).append("&"); @@ -195,13 +195,7 @@ public abstract class AbstractRequest { */ @SuppressWarnings("deprecation") private final HttpResponse executeHttpRequest(HttpGet getMethod, String host) throws Exception { - SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, new TrustStrategy() { - - @Override - public boolean isTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { - return true; - } - }).build(); + SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, (TrustStrategy) (arg0, arg1) -> true).build(); SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, new String[] { "TLSv1" }, null, diff --git a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/tsdb/DatabaseTableMeta.java b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/tsdb/DatabaseTableMeta.java index 84b87044..4018f2c2 100644 --- a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/tsdb/DatabaseTableMeta.java +++ b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/tsdb/DatabaseTableMeta.java @@ -52,16 +52,12 @@ public class DatabaseTableMeta implements TableMetaTSDB { private static Logger logger = LoggerFactory.getLogger(DatabaseTableMeta.class); private static Pattern pattern = Pattern.compile("Duplicate entry '.*' for key '*'"); private static Pattern h2Pattern = Pattern.compile("Unique index or primary key violation"); - private static ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() { - - @Override - public Thread newThread(Runnable r) { - Thread thread = new Thread(r, - "[scheduler-table-meta-snapshot]"); - thread.setDaemon(true); - return thread; - } - }); + private static ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(r -> { + Thread thread = new Thread(r, + "[scheduler-table-meta-snapshot]"); + thread.setDaemon(true); + return thread; + }); private ReadWriteLock lock = new ReentrantReadWriteLock(); private AtomicBoolean initialized = new AtomicBoolean(false); private String destination; @@ -69,8 +65,8 @@ public class DatabaseTableMeta implements TableMetaTSDB { private volatile MysqlConnection connection; // 查询meta信息的链接 private CanalEventFilter filter; private CanalEventFilter blackFilter; - private Map> fieldFilterMap = new HashMap>(); - private Map> fieldBlackFilterMap = new HashMap>(); + private Map> fieldFilterMap = new HashMap<>(); + private Map> fieldBlackFilterMap = new HashMap<>(); private EntryPosition lastPosition; private boolean hasNewDdl; private MetaHistoryDAO metaHistoryDAO; @@ -91,26 +87,22 @@ public class DatabaseTableMeta implements TableMetaTSDB { // 24小时生成一份snapshot if (snapshotInterval > 0) { - scheduleSnapshotFuture = scheduler.scheduleWithFixedDelay(new Runnable() { + scheduleSnapshotFuture = scheduler.scheduleWithFixedDelay(() -> { + boolean applyResult = false; + try { + MDC.put("destination", destination); + applyResult = applySnapshotToDB(lastPosition, false); + } catch (Throwable e) { + logger.error("scheudle applySnapshotToDB faield", e); + } - @Override - public void run() { - boolean applyResult = false; - try { - MDC.put("destination", destination); - applyResult = applySnapshotToDB(lastPosition, false); - } catch (Throwable e) { - logger.error("scheudle applySnapshotToDB faield", e); - } - - try { - MDC.put("destination", destination); - if (applyResult) { - snapshotExpire((int) TimeUnit.HOURS.toSeconds(snapshotExpire)); - } - } catch (Throwable e) { - logger.error("scheudle snapshotExpire faield", e); + try { + MDC.put("destination", destination); + if (applyResult) { + snapshotExpire((int) TimeUnit.HOURS.toSeconds(snapshotExpire)); } + } catch (Throwable e) { + logger.error("scheudle snapshotExpire faield", e); } }, snapshotInterval, snapshotInterval, TimeUnit.HOURS); } @@ -199,7 +191,7 @@ public class DatabaseTableMeta implements TableMetaTSDB { private boolean dumpTableMeta(MysqlConnection connection, final CanalEventFilter filter) { try { ResultSetPacket packet = connection.query("show databases"); - List schemas = new ArrayList(); + List schemas = new ArrayList<>(); for (String schema : packet.getFieldValues()) { schemas.add(schema); } @@ -207,7 +199,7 @@ public class DatabaseTableMeta implements TableMetaTSDB { for (String schema : schemas) { // filter views packet = connection.query("show full tables from `" + schema + "` where Table_type = 'BASE TABLE'"); - List tables = new ArrayList(); + List tables = new ArrayList<>(); for (String table : packet.getFieldValues()) { if ("BASE TABLE".equalsIgnoreCase(table)) { continue; @@ -245,7 +237,7 @@ public class DatabaseTableMeta implements TableMetaTSDB { } private boolean applyHistoryToDB(EntryPosition position, String schema, String ddl, String extra) { - Map content = new HashMap(); + Map content = new HashMap<>(); content.put("destination", destination); content.put("binlogFile", position.getJournalName()); content.put("binlogOffest", String.valueOf(position.getPosition())); @@ -326,7 +318,7 @@ public class DatabaseTableMeta implements TableMetaTSDB { } if (compareAll) { - Map content = new HashMap(); + Map content = new HashMap<>(); content.put("destination", destination); content.put("binlogFile", position.getJournalName()); content.put("binlogOffest", String.valueOf(position.getPosition())); diff --git a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/tsdb/MemoryTableMeta.java b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/tsdb/MemoryTableMeta.java index 3fd4d112..4111049b 100644 --- a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/tsdb/MemoryTableMeta.java +++ b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/tsdb/MemoryTableMeta.java @@ -49,7 +49,7 @@ import com.alibaba.otter.canal.protocol.position.EntryPosition; public class MemoryTableMeta implements TableMetaTSDB { private Logger logger = LoggerFactory.getLogger(MemoryTableMeta.class); - private Map, TableMeta> tableMetas = new ConcurrentHashMap, TableMeta>(); + private Map, TableMeta> tableMetas = new ConcurrentHashMap<>(); private SchemaRepository repository = new SchemaRepository(JdbcConstants.MYSQL); public MemoryTableMeta(){ @@ -143,7 +143,7 @@ public class MemoryTableMeta implements TableMetaTSDB { } public Map snapshot() { - Map schemaDdls = new HashMap(); + Map schemaDdls = new HashMap<>(); for (Schema schema : repository.getSchemas()) { StringBuffer data = new StringBuffer(4 * 1024); for (String table : schema.showTables()) { diff --git a/parse/src/main/java/com/alibaba/otter/canal/parse/index/FileMixedLogPositionManager.java b/parse/src/main/java/com/alibaba/otter/canal/parse/index/FileMixedLogPositionManager.java index bcc2af7d..c7f735e4 100644 --- a/parse/src/main/java/com/alibaba/otter/canal/parse/index/FileMixedLogPositionManager.java +++ b/parse/src/main/java/com/alibaba/otter/canal/parse/index/FileMixedLogPositionManager.java @@ -68,15 +68,10 @@ public class FileMixedLogPositionManager extends AbstractLogPositionManager { this.period = period; this.memoryLogPositionManager = memoryLogPositionManager; - this.dataFileCaches = MigrateMap.makeComputingMap(new Function() { - - public File apply(String destination) { - return getDataFile(destination); - } - }); + this.dataFileCaches = MigrateMap.makeComputingMap(this::getDataFile); this.executorService = Executors.newScheduledThreadPool(1); - this.persistTasks = Collections.synchronizedSet(new HashSet()); + this.persistTasks = Collections.synchronizedSet(new HashSet<>()); } @Override @@ -100,19 +95,16 @@ public class FileMixedLogPositionManager extends AbstractLogPositionManager { } // 启动定时工作任务 - executorService.scheduleAtFixedRate(new Runnable() { - - public void run() { - List tasks = new ArrayList(persistTasks); - for (String destination : tasks) { - try { - // 定时将内存中的最新值刷到file中,多次变更只刷一次 - flushDataToFile(destination); - persistTasks.remove(destination); - } catch (Throwable e) { - // ignore - logger.error("period update" + destination + " curosr failed!", e); - } + executorService.scheduleAtFixedRate(() -> { + List tasks = new ArrayList<>(persistTasks); + for (String destination : tasks) { + try { + // 定时将内存中的最新值刷到file中,多次变更只刷一次 + flushDataToFile(destination); + persistTasks.remove(destination); + } catch (Throwable e) { + // ignore + logger.error("period update" + destination + " curosr failed!", e); } } }, period, period, TimeUnit.MILLISECONDS); diff --git a/parse/src/main/java/com/alibaba/otter/canal/parse/index/MixedLogPositionManager.java b/parse/src/main/java/com/alibaba/otter/canal/parse/index/MixedLogPositionManager.java index 5bd2c19f..44f9d534 100644 --- a/parse/src/main/java/com/alibaba/otter/canal/parse/index/MixedLogPositionManager.java +++ b/parse/src/main/java/com/alibaba/otter/canal/parse/index/MixedLogPositionManager.java @@ -73,14 +73,11 @@ public class MixedLogPositionManager extends AbstractLogPositionManager { @Override public void persistLogPosition(final String destination, final LogPosition logPosition) throws CanalParseException { memoryLogPositionManager.persistLogPosition(destination, logPosition); - executor.submit(new Runnable() { - - public void run() { - try { - zooKeeperLogPositionManager.persistLogPosition(destination, logPosition); - } catch (Exception e) { - logger.error("ERROR # persist to zookeeper has an error", e); - } + executor.submit(() -> { + try { + zooKeeperLogPositionManager.persistLogPosition(destination, logPosition); + } catch (Exception e) { + logger.error("ERROR # persist to zookeeper has an error", e); } }); } diff --git a/parse/src/main/java/com/alibaba/otter/canal/parse/index/PeriodMixedLogPositionManager.java b/parse/src/main/java/com/alibaba/otter/canal/parse/index/PeriodMixedLogPositionManager.java index 6dbda0a5..f7c75c37 100644 --- a/parse/src/main/java/com/alibaba/otter/canal/parse/index/PeriodMixedLogPositionManager.java +++ b/parse/src/main/java/com/alibaba/otter/canal/parse/index/PeriodMixedLogPositionManager.java @@ -50,7 +50,7 @@ public class PeriodMixedLogPositionManager extends AbstractLogPositionManager { this.memoryLogPositionManager = memoryLogPositionManager; this.zooKeeperLogPositionManager = zooKeeperLogPositionManager; this.period = period; - this.persistTasks = Collections.synchronizedSet(new HashSet()); + this.persistTasks = Collections.synchronizedSet(new HashSet<>()); this.executorService = Executors.newScheduledThreadPool(1); } @@ -82,19 +82,16 @@ public class PeriodMixedLogPositionManager extends AbstractLogPositionManager { } // 启动定时工作任务 - executorService.scheduleAtFixedRate(new Runnable() { - - public void run() { - List tasks = new ArrayList(persistTasks); - for (String destination : tasks) { - try { - // 定时将内存中的最新值刷到zookeeper中,多次变更只刷一次 - zooKeeperLogPositionManager.persistLogPosition(destination, getLatestIndexBy(destination)); - persistTasks.remove(destination); - } catch (Throwable e) { - // ignore - logger.error("period update" + destination + " curosr failed!", e); - } + executorService.scheduleAtFixedRate(() -> { + List tasks = new ArrayList(persistTasks); + for (String destination : tasks) { + try { + // 定时将内存中的最新值刷到zookeeper中,多次变更只刷一次 + zooKeeperLogPositionManager.persistLogPosition(destination, getLatestIndexBy(destination)); + persistTasks.remove(destination); + } catch (Throwable e) { + // ignore + logger.error("period update" + destination + " curosr failed!", e); } } }, period, period, TimeUnit.MILLISECONDS); diff --git a/parse/src/main/java/com/alibaba/otter/canal/parse/support/HaAuthenticationInfo.java b/parse/src/main/java/com/alibaba/otter/canal/parse/support/HaAuthenticationInfo.java index f9109d6e..01326c5f 100644 --- a/parse/src/main/java/com/alibaba/otter/canal/parse/support/HaAuthenticationInfo.java +++ b/parse/src/main/java/com/alibaba/otter/canal/parse/support/HaAuthenticationInfo.java @@ -11,7 +11,7 @@ import java.util.List; public class HaAuthenticationInfo { private AuthenticationInfo master; - private List slavers = new ArrayList(); + private List slavers = new ArrayList<>(); public AuthenticationInfo getMaster() { return master; diff --git a/parse/src/test/java/com/alibaba/otter/canal/parse/MysqlBinlogParsePerformanceTest.java b/parse/src/test/java/com/alibaba/otter/canal/parse/MysqlBinlogParsePerformanceTest.java index 981c8538..99431395 100644 --- a/parse/src/test/java/com/alibaba/otter/canal/parse/MysqlBinlogParsePerformanceTest.java +++ b/parse/src/test/java/com/alibaba/otter/canal/parse/MysqlBinlogParsePerformanceTest.java @@ -41,18 +41,14 @@ public class MysqlBinlogParsePerformanceTest { updateSettings(connector); sendBinlogDump(connector, "mysql-bin.000006", 120L, 3); fetcher.start(connector.getChannel()); - final BlockingQueue buffer = new ArrayBlockingQueue(1024); - Thread thread = new Thread(new Runnable() { - - @Override - public void run() { - try { - consumer(buffer); - } catch (IOException e) { - e.printStackTrace(); - } catch (InterruptedException e) { - e.printStackTrace(); - } + final BlockingQueue buffer = new ArrayBlockingQueue<>(1024); + Thread thread = new Thread(() -> { + try { + consumer(buffer); + } catch (IOException e) { + e.printStackTrace(); + } catch (InterruptedException e) { + e.printStackTrace(); } }); thread.start(); diff --git a/parse/src/test/java/com/alibaba/otter/canal/parse/inbound/EventTransactionBufferTest.java b/parse/src/test/java/com/alibaba/otter/canal/parse/inbound/EventTransactionBufferTest.java index 122fa2ed..ecdf142b 100644 --- a/parse/src/test/java/com/alibaba/otter/canal/parse/inbound/EventTransactionBufferTest.java +++ b/parse/src/test/java/com/alibaba/otter/canal/parse/inbound/EventTransactionBufferTest.java @@ -25,29 +25,26 @@ public class EventTransactionBufferTest { final int transactionSize = 5; EventTransactionBuffer buffer = new EventTransactionBuffer(); buffer.setBufferSize(bufferSize); - buffer.setFlushCallback(new TransactionFlushCallback() { + buffer.setFlushCallback(transaction -> { + Assert.assertEquals(transactionSize, transaction.size()); + System.out.println("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); + for (Entry data : transaction) { - public void flush(List transaction) throws InterruptedException { - Assert.assertEquals(transactionSize, transaction.size()); - System.out.println("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); - for (Entry data : transaction) { - - CanalEntry.Header header = data.getHeader(); - Date date = new Date(header.getExecuteTime()); - SimpleDateFormat format = new SimpleDateFormat(DATE_FORMAT); - if (data.getEntryType() == EntryType.TRANSACTIONBEGIN - || data.getEntryType() == EntryType.TRANSACTIONEND) { - System.out.println(data.getEntryType()); - - } else { - System.out.println(MessageFormat.format(messgae, new Object[] { - Thread.currentThread().getName(), header.getLogfileName(), header.getLogfileOffset(), - format.format(date), header.getSchemaName(), header.getTableName() })); - } + Header header = data.getHeader(); + Date date = new Date(header.getExecuteTime()); + SimpleDateFormat format = new SimpleDateFormat(DATE_FORMAT); + if (data.getEntryType() == EntryType.TRANSACTIONBEGIN + || data.getEntryType() == EntryType.TRANSACTIONEND) { + System.out.println(data.getEntryType()); + } else { + System.out.println(MessageFormat.format(messgae, new Object[] { + Thread.currentThread().getName(), header.getLogfileName(), header.getLogfileOffset(), + format.format(date), header.getSchemaName(), header.getTableName() })); } - System.out.println("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); + } + System.out.println("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); }); buffer.start(); @@ -73,35 +70,32 @@ public class EventTransactionBufferTest { final int bufferSize = 64; EventTransactionBuffer buffer = new EventTransactionBuffer(); buffer.setBufferSize(bufferSize); - buffer.setFlushCallback(new TransactionFlushCallback() { + buffer.setFlushCallback(transaction -> { + Assert.assertEquals(bufferSize, transaction.size()); + System.out.println("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); + for (Entry data : transaction) { - public void flush(List transaction) throws InterruptedException { - Assert.assertEquals(bufferSize, transaction.size()); - System.out.println("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); - for (Entry data : transaction) { - - CanalEntry.Header header = data.getHeader(); - Date date = new Date(header.getExecuteTime()); - SimpleDateFormat format = new SimpleDateFormat(DATE_FORMAT); - if (data.getEntryType() == EntryType.TRANSACTIONBEGIN - || data.getEntryType() == EntryType.TRANSACTIONEND) { - // System.out.println(MessageFormat.format(messgae, new - // Object[] { - // Thread.currentThread().getName(), - // header.getLogfilename(), header.getLogfileoffset(), - // format.format(date), - // data.getEntry().getEntryType(), "" })); - System.out.println(data.getEntryType()); - - } else { - System.out.println(MessageFormat.format(messgae, new Object[] { - Thread.currentThread().getName(), header.getLogfileName(), header.getLogfileOffset(), - format.format(date), header.getSchemaName(), header.getTableName() })); - } + Header header = data.getHeader(); + Date date = new Date(header.getExecuteTime()); + SimpleDateFormat format = new SimpleDateFormat(DATE_FORMAT); + if (data.getEntryType() == EntryType.TRANSACTIONBEGIN + || data.getEntryType() == EntryType.TRANSACTIONEND) { + // System.out.println(MessageFormat.format(messgae, new + // Object[] { + // Thread.currentThread().getName(), + // header.getLogfilename(), header.getLogfileoffset(), + // format.format(date), + // data.getEntry().getEntryType(), "" })); + System.out.println(data.getEntryType()); + } else { + System.out.println(MessageFormat.format(messgae, new Object[] { + Thread.currentThread().getName(), header.getLogfileName(), header.getLogfileOffset(), + format.format(date), header.getSchemaName(), header.getTableName() })); } - System.out.println("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); + } + System.out.println("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); }); buffer.start(); diff --git a/parse/src/test/java/com/alibaba/otter/canal/parse/index/MetaLogPositionManagerTest.java b/parse/src/test/java/com/alibaba/otter/canal/parse/index/MetaLogPositionManagerTest.java index f2dcc35d..53781d20 100644 --- a/parse/src/test/java/com/alibaba/otter/canal/parse/index/MetaLogPositionManagerTest.java +++ b/parse/src/test/java/com/alibaba/otter/canal/parse/index/MetaLogPositionManagerTest.java @@ -82,6 +82,6 @@ public class MetaLogPositionManagerTest extends AbstractLogPositionManagerTest { LogPosition end = new LogPosition(); end.setIdentity(new LogIdentity(new InetSocketAddress(MYSQL_ADDRESS, 3306), 1234L)); end.setPostion(new EntryPosition("mysql-bin.000000" + (number + 1), 106L, (new Date().getTime()) + 1000 * 1000L)); - return new PositionRange(start, end); + return new PositionRange<>(start, end); } } diff --git a/prometheus/src/main/java/com/alibaba/otter/canal/prometheus/impl/EntryCollector.java b/prometheus/src/main/java/com/alibaba/otter/canal/prometheus/impl/EntryCollector.java index bbd51720..29ecc977 100644 --- a/prometheus/src/main/java/com/alibaba/otter/canal/prometheus/impl/EntryCollector.java +++ b/prometheus/src/main/java/com/alibaba/otter/canal/prometheus/impl/EntryCollector.java @@ -31,7 +31,7 @@ public class EntryCollector extends Collector implements InstanceRegistry { private static final String TRANSACTION = "canal_instance_transactions"; private static final String DELAY_HELP = "Traffic delay of canal instance in milliseconds"; private static final String TRANSACTION_HELP = "Transactions counter of canal instance"; - private final ConcurrentMap instances = new ConcurrentHashMap(); + private final ConcurrentMap instances = new ConcurrentHashMap<>(); private EntryCollector() {} @@ -45,7 +45,7 @@ public class EntryCollector extends Collector implements InstanceRegistry { @Override public List collect() { - List mfs = new ArrayList(); + List mfs = new ArrayList<>(); GaugeMetricFamily delay = new GaugeMetricFamily(DELAY, DELAY_HELP, DEST_LABELS_LIST); CounterMetricFamily transactions = new CounterMetricFamily(TRANSACTION, diff --git a/prometheus/src/main/java/com/alibaba/otter/canal/prometheus/impl/MetaCollector.java b/prometheus/src/main/java/com/alibaba/otter/canal/prometheus/impl/MetaCollector.java index e51e8e29..1259663a 100644 --- a/prometheus/src/main/java/com/alibaba/otter/canal/prometheus/impl/MetaCollector.java +++ b/prometheus/src/main/java/com/alibaba/otter/canal/prometheus/impl/MetaCollector.java @@ -28,7 +28,7 @@ public class MetaCollector extends Collector implements InstanceRegistry { private static final String INSTANCE_HELP = "Canal instance"; private static final String SUBSCRIPTION = "canal_instance_subscriptions"; private static final String SUBSCRIPTION_HELP = "Canal instance subscriptions"; - private final ConcurrentMap instances = new ConcurrentHashMap(); + private final ConcurrentMap instances = new ConcurrentHashMap<>(); private MetaCollector() {} @@ -42,7 +42,7 @@ public class MetaCollector extends Collector implements InstanceRegistry { @Override public List collect() { - List mfs = new ArrayList(); + List mfs = new ArrayList<>(); GaugeMetricFamily instanceInfo = new GaugeMetricFamily(INSTANCE, INSTANCE_HELP, INFO_LABELS_LIST); GaugeMetricFamily subsInfo = new GaugeMetricFamily(SUBSCRIPTION, diff --git a/prometheus/src/main/java/com/alibaba/otter/canal/prometheus/impl/SinkCollector.java b/prometheus/src/main/java/com/alibaba/otter/canal/prometheus/impl/SinkCollector.java index 98f238fc..0918c84a 100644 --- a/prometheus/src/main/java/com/alibaba/otter/canal/prometheus/impl/SinkCollector.java +++ b/prometheus/src/main/java/com/alibaba/otter/canal/prometheus/impl/SinkCollector.java @@ -29,7 +29,7 @@ public class SinkCollector extends Collector implements InstanceRegistry { private static final long NANO_PER_MILLI = 1000 * 1000L; private static final String SINK_BLOCKING_TIME = "canal_instance_sink_blocking_time"; private static final String SINK_BLOCK_TIME_HELP = "Total sink blocking time in milliseconds"; - private final ConcurrentMap instances = new ConcurrentHashMap(); + private final ConcurrentMap instances = new ConcurrentHashMap<>(); private SinkCollector(){ } @@ -45,7 +45,7 @@ public class SinkCollector extends Collector implements InstanceRegistry { @Override public List collect() { - List mfs = new ArrayList(); + List mfs = new ArrayList<>(); CounterMetricFamily blockingCounter = new CounterMetricFamily(SINK_BLOCKING_TIME, SINK_BLOCK_TIME_HELP, DEST_LABELS_LIST); diff --git a/prometheus/src/main/java/com/alibaba/otter/canal/prometheus/impl/StoreCollector.java b/prometheus/src/main/java/com/alibaba/otter/canal/prometheus/impl/StoreCollector.java index cb26f228..6305c51e 100644 --- a/prometheus/src/main/java/com/alibaba/otter/canal/prometheus/impl/StoreCollector.java +++ b/prometheus/src/main/java/com/alibaba/otter/canal/prometheus/impl/StoreCollector.java @@ -51,7 +51,7 @@ public class StoreCollector extends Collector implements InstanceRegistry { private static final String PUT_ROWS_HELP = "Put table rows of canal instance"; private static final String GET_ROWS_HELP = "Got table rows of canal instance"; private static final String ACK_ROWS_HELP = "Acked table rows of canal instance"; - private final ConcurrentMap instances = new ConcurrentHashMap(); + private final ConcurrentMap instances = new ConcurrentHashMap<>(); private final List storeLabelsList = Arrays.asList(DEST, "batchMode", "size"); private StoreCollector() {} @@ -66,7 +66,7 @@ public class StoreCollector extends Collector implements InstanceRegistry { @Override public List collect() { - List mfs = new ArrayList(); + List mfs = new ArrayList<>(); CounterMetricFamily put = new CounterMetricFamily(PRODUCE, PRODUCE_HELP, DEST_LABELS_LIST); CounterMetricFamily ack = new CounterMetricFamily(CONSUME, diff --git a/protocol/src/main/java/com/alibaba/otter/canal/protocol/SecurityUtil.java b/protocol/src/main/java/com/alibaba/otter/canal/protocol/SecurityUtil.java index 18686774..43c45c11 100644 --- a/protocol/src/main/java/com/alibaba/otter/canal/protocol/SecurityUtil.java +++ b/protocol/src/main/java/com/alibaba/otter/canal/protocol/SecurityUtil.java @@ -24,7 +24,7 @@ public class SecurityUtil { private static char[] digits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; - private static Map rDigits = new HashMap(16); + private static Map rDigits = new HashMap<>(16); static { for (int i = 0; i < digits.length; ++i) { rDigits.put(digits[i], i); diff --git a/server/src/main/java/com/alibaba/otter/canal/admin/handler/ClientAuthenticationHandler.java b/server/src/main/java/com/alibaba/otter/canal/admin/handler/ClientAuthenticationHandler.java index b57db764..eaf786f2 100644 --- a/server/src/main/java/com/alibaba/otter/canal/admin/handler/ClientAuthenticationHandler.java +++ b/server/src/main/java/com/alibaba/otter/canal/admin/handler/ClientAuthenticationHandler.java @@ -63,46 +63,42 @@ public class ClientAuthenticationHandler extends SimpleChannelHandler { } byte[] ackBytes = AdminNettyUtils.ackPacket(); - AdminNettyUtils.write(ctx.getChannel(), ackBytes, new ChannelFutureListener() { + AdminNettyUtils.write(ctx.getChannel(), ackBytes, future -> { + logger.info("remove unused channel handlers after authentication is done successfully."); + ctx.getPipeline().remove(HandshakeInitializationHandler.class.getName()); + ctx.getPipeline().remove(ClientAuthenticationHandler.class.getName()); - public void operationComplete(ChannelFuture future) throws Exception { - logger.info("remove unused channel handlers after authentication is done successfully."); - ctx.getPipeline().remove(HandshakeInitializationHandler.class.getName()); - ctx.getPipeline().remove(ClientAuthenticationHandler.class.getName()); - - int readTimeout = defaultSubscriptorDisconnectIdleTimeout; - int writeTimeout = defaultSubscriptorDisconnectIdleTimeout; - if (clientAuth.getNetReadTimeout() > 0) { - readTimeout = clientAuth.getNetReadTimeout(); - } - if (clientAuth.getNetWriteTimeout() > 0) { - writeTimeout = clientAuth.getNetWriteTimeout(); - } - // fix bug: soTimeout parameter's unit from connector is - // millseconds. - IdleStateHandler idleStateHandler = new IdleStateHandler(NettyUtils.hashedWheelTimer, - readTimeout, - writeTimeout, - 0, - TimeUnit.MILLISECONDS); - ctx.getPipeline().addBefore(SessionHandler.class.getName(), - IdleStateHandler.class.getName(), - idleStateHandler); - - IdleStateAwareChannelHandler idleStateAwareChannelHandler = new IdleStateAwareChannelHandler() { - - public void channelIdle(ChannelHandlerContext ctx, IdleStateEvent e) throws Exception { - logger.warn("channel:{} idle timeout exceeds, close channel to save server resources...", - ctx.getChannel()); - ctx.getChannel().close(); - } - - }; - ctx.getPipeline().addBefore(SessionHandler.class.getName(), - IdleStateAwareChannelHandler.class.getName(), - idleStateAwareChannelHandler); + int readTimeout = defaultSubscriptorDisconnectIdleTimeout; + int writeTimeout = defaultSubscriptorDisconnectIdleTimeout; + if (clientAuth.getNetReadTimeout() > 0) { + readTimeout = clientAuth.getNetReadTimeout(); } + if (clientAuth.getNetWriteTimeout() > 0) { + writeTimeout = clientAuth.getNetWriteTimeout(); + } + // fix bug: soTimeout parameter's unit from connector is + // millseconds. + IdleStateHandler idleStateHandler = new IdleStateHandler(NettyUtils.hashedWheelTimer, + readTimeout, + writeTimeout, + 0, + TimeUnit.MILLISECONDS); + ctx.getPipeline().addBefore(SessionHandler.class.getName(), + IdleStateHandler.class.getName(), + idleStateHandler); + IdleStateAwareChannelHandler idleStateAwareChannelHandler = new IdleStateAwareChannelHandler() { + + public void channelIdle(ChannelHandlerContext ctx1, IdleStateEvent e1) throws Exception { + logger.warn("channel:{} idle timeout exceeds, close channel to save server resources...", + ctx1.getChannel()); + ctx1.getChannel().close(); + } + + }; + ctx.getPipeline().addBefore(SessionHandler.class.getName(), + IdleStateAwareChannelHandler.class.getName(), + idleStateAwareChannelHandler); }); break; } diff --git a/server/src/main/java/com/alibaba/otter/canal/admin/handler/HandshakeInitializationHandler.java b/server/src/main/java/com/alibaba/otter/canal/admin/handler/HandshakeInitializationHandler.java index b100c0c3..541b212f 100644 --- a/server/src/main/java/com/alibaba/otter/canal/admin/handler/HandshakeInitializationHandler.java +++ b/server/src/main/java/com/alibaba/otter/canal/admin/handler/HandshakeInitializationHandler.java @@ -46,16 +46,12 @@ public class HandshakeInitializationHandler extends SimpleChannelHandler { .build() .toByteArray(); - AdminNettyUtils.write(ctx.getChannel(), body, new ChannelFutureListener() { - - public void operationComplete(ChannelFuture future) throws Exception { - logger.info("remove unused channel handlers after authentication is done successfully."); - ctx.getPipeline().get(HandshakeInitializationHandler.class.getName()); - ClientAuthenticationHandler handler = (ClientAuthenticationHandler) ctx.getPipeline() - .get(ClientAuthenticationHandler.class.getName()); - handler.setSeed(seed); - } - + AdminNettyUtils.write(ctx.getChannel(), body, future -> { + logger.info("remove unused channel handlers after authentication is done successfully."); + ctx.getPipeline().get(HandshakeInitializationHandler.class.getName()); + ClientAuthenticationHandler handler = (ClientAuthenticationHandler) ctx.getPipeline() + .get(ClientAuthenticationHandler.class.getName()); + handler.setSeed(seed); }); logger.info("send handshake initialization packet to : {}", ctx.getChannel()); } diff --git a/server/src/main/java/com/alibaba/otter/canal/admin/netty/AdminNettyUtils.java b/server/src/main/java/com/alibaba/otter/canal/admin/netty/AdminNettyUtils.java index 54cab8b5..0f1d654e 100644 --- a/server/src/main/java/com/alibaba/otter/canal/admin/netty/AdminNettyUtils.java +++ b/server/src/main/java/com/alibaba/otter/canal/admin/netty/AdminNettyUtils.java @@ -23,7 +23,7 @@ public class AdminNettyUtils { public static void write(Channel channel, ByteBuffer body) { byte[] header = ByteBuffer.allocate(HEADER_LENGTH).order(ByteOrder.BIG_ENDIAN).putInt(body.limit()).array(); - List components = new ArrayList(2); + List components = new ArrayList<>(2); components.add(ChannelBuffers.wrappedBuffer(ByteOrder.BIG_ENDIAN, header)); components.add(ChannelBuffers.wrappedBuffer(body)); Channels.write(channel, new CompositeChannelBuffer(ByteOrder.BIG_ENDIAN, components)); diff --git a/server/src/main/java/com/alibaba/otter/canal/admin/netty/CanalAdminWithNetty.java b/server/src/main/java/com/alibaba/otter/canal/admin/netty/CanalAdminWithNetty.java index f09cce07..12250734 100644 --- a/server/src/main/java/com/alibaba/otter/canal/admin/netty/CanalAdminWithNetty.java +++ b/server/src/main/java/com/alibaba/otter/canal/admin/netty/CanalAdminWithNetty.java @@ -69,21 +69,18 @@ public class CanalAdminWithNetty extends AbstractCanalLifeCycle { bootstrap.setOption("child.tcpNoDelay", true); // 构造对应的pipeline - bootstrap.setPipelineFactory(new ChannelPipelineFactory() { + bootstrap.setPipelineFactory(() -> { + ChannelPipeline pipelines = Channels.pipeline(); + pipelines.addLast(FixedHeaderFrameDecoder.class.getName(), new FixedHeaderFrameDecoder()); + // support to maintain child socket channel. + pipelines.addLast(HandshakeInitializationHandler.class.getName(), + new HandshakeInitializationHandler(childGroups)); + pipelines.addLast(ClientAuthenticationHandler.class.getName(), + new ClientAuthenticationHandler(canalAdmin)); - public ChannelPipeline getPipeline() throws Exception { - ChannelPipeline pipelines = Channels.pipeline(); - pipelines.addLast(FixedHeaderFrameDecoder.class.getName(), new FixedHeaderFrameDecoder()); - // support to maintain child socket channel. - pipelines.addLast(HandshakeInitializationHandler.class.getName(), - new HandshakeInitializationHandler(childGroups)); - pipelines.addLast(ClientAuthenticationHandler.class.getName(), - new ClientAuthenticationHandler(canalAdmin)); - - SessionHandler sessionHandler = new SessionHandler(canalAdmin); - pipelines.addLast(SessionHandler.class.getName(), sessionHandler); - return pipelines; - } + SessionHandler sessionHandler = new SessionHandler(canalAdmin); + pipelines.addLast(SessionHandler.class.getName(), sessionHandler); + return pipelines; }); // 启动 diff --git a/server/src/main/java/com/alibaba/otter/canal/server/CanalMQStarter.java b/server/src/main/java/com/alibaba/otter/canal/server/CanalMQStarter.java index d368f4a3..3fd9f861 100644 --- a/server/src/main/java/com/alibaba/otter/canal/server/CanalMQStarter.java +++ b/server/src/main/java/com/alibaba/otter/canal/server/CanalMQStarter.java @@ -72,22 +72,18 @@ public class CanalMQStarter { running = true; logger.info("## the MQ workers is running now ......"); - shutdownThread = new Thread() { - - public void run() { - try { - logger.info("## stop the MQ workers"); - running = false; - executorService.shutdown(); - canalMQProducer.stop(); - } catch (Throwable e) { - logger.warn("##something goes wrong when stopping MQ workers:", e); - } finally { - logger.info("## canal MQ is down."); - } + shutdownThread = new Thread(() -> { + try { + logger.info("## stop the MQ workers"); + running = false; + executorService.shutdown(); + canalMQProducer.stop(); + } catch (Throwable e) { + logger.warn("##something goes wrong when stopping MQ workers:", e); + } finally { + logger.info("## canal MQ is down."); } - - }; + }); Runtime.getRuntime().addShutdownHook(shutdownThread); } catch (Throwable e) { diff --git a/server/src/main/java/com/alibaba/otter/canal/server/embedded/CanalServerWithEmbedded.java b/server/src/main/java/com/alibaba/otter/canal/server/embedded/CanalServerWithEmbedded.java index 09252c8a..8f0b7362 100644 --- a/server/src/main/java/com/alibaba/otter/canal/server/embedded/CanalServerWithEmbedded.java +++ b/server/src/main/java/com/alibaba/otter/canal/server/embedded/CanalServerWithEmbedded.java @@ -78,12 +78,7 @@ public class CanalServerWithEmbedded extends AbstractCanalLifeCycle implements C loadCanalMetrics(); metrics.setServerPort(metricsPort); metrics.initialize(); - canalInstances = MigrateMap.makeComputingMap(new Function() { - - public CanalInstance apply(String destination) { - return canalInstanceGenerator.generate(destination); - } - }); + canalInstances = MigrateMap.makeComputingMap(destination -> canalInstanceGenerator.generate(destination)); // lastRollbackPostions = new MapMaker().makeMap(); } @@ -274,19 +269,9 @@ public class CanalServerWithEmbedded extends AbstractCanalLifeCycle implements C boolean raw = isRaw(canalInstance.getEventStore()); List entrys = null; if (raw) { - entrys = Lists.transform(events.getEvents(), new Function() { - - public ByteString apply(Event input) { - return input.getRawEntry(); - } - }); + entrys = Lists.transform(events.getEvents(), Event::getRawEntry); } else { - entrys = Lists.transform(events.getEvents(), new Function() { - - public CanalEntry.Entry apply(Event input) { - return input.getEntry(); - } - }); + entrys = Lists.transform(events.getEvents(), Event::getEntry); } if (logger.isInfoEnabled()) { logger.info("get successfully, clientId:{} batchSize:{} real size is {} and result is [batchId:{} , position:{}]", @@ -366,19 +351,9 @@ public class CanalServerWithEmbedded extends AbstractCanalLifeCycle implements C boolean raw = isRaw(canalInstance.getEventStore()); List entrys = null; if (raw) { - entrys = Lists.transform(events.getEvents(), new Function() { - - public ByteString apply(Event input) { - return input.getRawEntry(); - } - }); + entrys = Lists.transform(events.getEvents(), Event::getRawEntry); } else { - entrys = Lists.transform(events.getEvents(), new Function() { - - public CanalEntry.Entry apply(Event input) { - return input.getEntry(); - } - }); + entrys = Lists.transform(events.getEvents(), Event::getEntry); } if (logger.isInfoEnabled()) { logger.info("getWithoutAck successfully, clientId:{} batchSize:{} real size is {} and result is [batchId:{} , position:{}]", @@ -403,7 +378,7 @@ public class CanalServerWithEmbedded extends AbstractCanalLifeCycle implements C CanalInstance canalInstance = canalInstances.get(clientIdentity.getDestination()); Map batchs = canalInstance.getMetaManager().listAllBatchs(clientIdentity); - List result = new ArrayList(batchs.keySet()); + List result = new ArrayList<>(batchs.keySet()); Collections.sort(result); return result; } @@ -561,7 +536,7 @@ public class CanalServerWithEmbedded extends AbstractCanalLifeCycle implements C private void loadCanalMetrics() { ServiceLoader providers = ServiceLoader.load(CanalMetricsProvider.class); - List list = new ArrayList(); + List list = new ArrayList<>(); for (CanalMetricsProvider provider : providers) { list.add(provider); } diff --git a/server/src/main/java/com/alibaba/otter/canal/server/netty/CanalServerWithNetty.java b/server/src/main/java/com/alibaba/otter/canal/server/netty/CanalServerWithNetty.java index 19a7827d..787e078f 100644 --- a/server/src/main/java/com/alibaba/otter/canal/server/netty/CanalServerWithNetty.java +++ b/server/src/main/java/com/alibaba/otter/canal/server/netty/CanalServerWithNetty.java @@ -75,21 +75,18 @@ public class CanalServerWithNetty extends AbstractCanalLifeCycle implements Cana bootstrap.setOption("child.tcpNoDelay", true); // 构造对应的pipeline - bootstrap.setPipelineFactory(new ChannelPipelineFactory() { + bootstrap.setPipelineFactory(() -> { + ChannelPipeline pipelines = Channels.pipeline(); + pipelines.addLast(FixedHeaderFrameDecoder.class.getName(), new FixedHeaderFrameDecoder()); + // support to maintain child socket channel. + pipelines.addLast(HandshakeInitializationHandler.class.getName(), + new HandshakeInitializationHandler(childGroups)); + pipelines.addLast(ClientAuthenticationHandler.class.getName(), + new ClientAuthenticationHandler(embeddedServer)); - public ChannelPipeline getPipeline() throws Exception { - ChannelPipeline pipelines = Channels.pipeline(); - pipelines.addLast(FixedHeaderFrameDecoder.class.getName(), new FixedHeaderFrameDecoder()); - // support to maintain child socket channel. - pipelines.addLast(HandshakeInitializationHandler.class.getName(), - new HandshakeInitializationHandler(childGroups)); - pipelines.addLast(ClientAuthenticationHandler.class.getName(), - new ClientAuthenticationHandler(embeddedServer)); - - SessionHandler sessionHandler = new SessionHandler(embeddedServer); - pipelines.addLast(SessionHandler.class.getName(), sessionHandler); - return pipelines; - } + SessionHandler sessionHandler = new SessionHandler(embeddedServer); + pipelines.addLast(SessionHandler.class.getName(), sessionHandler); + return pipelines; }); // 启动 diff --git a/server/src/main/java/com/alibaba/otter/canal/server/netty/NettyUtils.java b/server/src/main/java/com/alibaba/otter/canal/server/netty/NettyUtils.java index 2fe8b6a5..4c6356b3 100644 --- a/server/src/main/java/com/alibaba/otter/canal/server/netty/NettyUtils.java +++ b/server/src/main/java/com/alibaba/otter/canal/server/netty/NettyUtils.java @@ -29,7 +29,7 @@ public class NettyUtils { public static void write(Channel channel, ByteBuffer body, ChannelFutureListener channelFutureListner) { byte[] header = ByteBuffer.allocate(HEADER_LENGTH).order(ByteOrder.BIG_ENDIAN).putInt(body.limit()).array(); - List components = new ArrayList(2); + List components = new ArrayList<>(2); components.add(ChannelBuffers.wrappedBuffer(ByteOrder.BIG_ENDIAN, header)); components.add(ChannelBuffers.wrappedBuffer(body)); diff --git a/server/src/main/java/com/alibaba/otter/canal/server/netty/handler/ClientAuthenticationHandler.java b/server/src/main/java/com/alibaba/otter/canal/server/netty/handler/ClientAuthenticationHandler.java index d977588f..df1c8b31 100644 --- a/server/src/main/java/com/alibaba/otter/canal/server/netty/handler/ClientAuthenticationHandler.java +++ b/server/src/main/java/com/alibaba/otter/canal/server/netty/handler/ClientAuthenticationHandler.java @@ -87,46 +87,42 @@ public class ClientAuthenticationHandler extends SimpleChannelHandler { } } // 鉴权一次性,暂不统计 - NettyUtils.ack(ctx.getChannel(), new ChannelFutureListener() { + NettyUtils.ack(ctx.getChannel(), future -> { + logger.info("remove unused channel handlers after authentication is done successfully."); + ctx.getPipeline().remove(HandshakeInitializationHandler.class.getName()); + ctx.getPipeline().remove(ClientAuthenticationHandler.class.getName()); - public void operationComplete(ChannelFuture future) throws Exception { - logger.info("remove unused channel handlers after authentication is done successfully."); - ctx.getPipeline().remove(HandshakeInitializationHandler.class.getName()); - ctx.getPipeline().remove(ClientAuthenticationHandler.class.getName()); - - int readTimeout = defaultSubscriptorDisconnectIdleTimeout; - int writeTimeout = defaultSubscriptorDisconnectIdleTimeout; - if (clientAuth.getNetReadTimeout() > 0) { - readTimeout = clientAuth.getNetReadTimeout(); - } - if (clientAuth.getNetWriteTimeout() > 0) { - writeTimeout = clientAuth.getNetWriteTimeout(); - } - // fix bug: soTimeout parameter's unit from connector is - // millseconds. - IdleStateHandler idleStateHandler = new IdleStateHandler(NettyUtils.hashedWheelTimer, - readTimeout, - writeTimeout, - 0, - TimeUnit.MILLISECONDS); - ctx.getPipeline().addBefore(SessionHandler.class.getName(), - IdleStateHandler.class.getName(), - idleStateHandler); - - IdleStateAwareChannelHandler idleStateAwareChannelHandler = new IdleStateAwareChannelHandler() { - - public void channelIdle(ChannelHandlerContext ctx, IdleStateEvent e) throws Exception { - logger.warn("channel:{} idle timeout exceeds, close channel to save server resources...", - ctx.getChannel()); - ctx.getChannel().close(); - } - - }; - ctx.getPipeline().addBefore(SessionHandler.class.getName(), - IdleStateAwareChannelHandler.class.getName(), - idleStateAwareChannelHandler); + int readTimeout = defaultSubscriptorDisconnectIdleTimeout; + int writeTimeout = defaultSubscriptorDisconnectIdleTimeout; + if (clientAuth.getNetReadTimeout() > 0) { + readTimeout = clientAuth.getNetReadTimeout(); } + if (clientAuth.getNetWriteTimeout() > 0) { + writeTimeout = clientAuth.getNetWriteTimeout(); + } + // fix bug: soTimeout parameter's unit from connector is + // millseconds. + IdleStateHandler idleStateHandler = new IdleStateHandler(NettyUtils.hashedWheelTimer, + readTimeout, + writeTimeout, + 0, + TimeUnit.MILLISECONDS); + ctx.getPipeline().addBefore(SessionHandler.class.getName(), + IdleStateHandler.class.getName(), + idleStateHandler); + IdleStateAwareChannelHandler idleStateAwareChannelHandler = new IdleStateAwareChannelHandler() { + + public void channelIdle(ChannelHandlerContext ctx1, IdleStateEvent e1) throws Exception { + logger.warn("channel:{} idle timeout exceeds, close channel to save server resources...", + ctx1.getChannel()); + ctx1.getChannel().close(); + } + + }; + ctx.getPipeline().addBefore(SessionHandler.class.getName(), + IdleStateAwareChannelHandler.class.getName(), + idleStateAwareChannelHandler); }); break; } diff --git a/server/src/main/java/com/alibaba/otter/canal/server/netty/handler/HandshakeInitializationHandler.java b/server/src/main/java/com/alibaba/otter/canal/server/netty/handler/HandshakeInitializationHandler.java index 8eae3f92..787789d6 100644 --- a/server/src/main/java/com/alibaba/otter/canal/server/netty/handler/HandshakeInitializationHandler.java +++ b/server/src/main/java/com/alibaba/otter/canal/server/netty/handler/HandshakeInitializationHandler.java @@ -46,15 +46,11 @@ public class HandshakeInitializationHandler extends SimpleChannelHandler { .build() .toByteArray(); - NettyUtils.write(ctx.getChannel(), body, new ChannelFutureListener() { - - public void operationComplete(ChannelFuture future) throws Exception { - ctx.getPipeline().get(HandshakeInitializationHandler.class.getName()); - ClientAuthenticationHandler handler = (ClientAuthenticationHandler) ctx.getPipeline() - .get(ClientAuthenticationHandler.class.getName()); - handler.setSeed(seed); - } - + NettyUtils.write(ctx.getChannel(), body, future -> { + ctx.getPipeline().get(HandshakeInitializationHandler.class.getName()); + ClientAuthenticationHandler handler = (ClientAuthenticationHandler) ctx.getPipeline() + .get(ClientAuthenticationHandler.class.getName()); + handler.setSeed(seed); }); logger.info("send handshake initialization packet to : {}", ctx.getChannel()); } diff --git a/server/src/test/java/com/alibaba/otter/canal/server/CanalServerTest.java b/server/src/test/java/com/alibaba/otter/canal/server/CanalServerTest.java index 7bd6e72d..36c7c95b 100644 --- a/server/src/test/java/com/alibaba/otter/canal/server/CanalServerTest.java +++ b/server/src/test/java/com/alibaba/otter/canal/server/CanalServerTest.java @@ -53,12 +53,9 @@ public class CanalServerTest { @Before public void setUp() { CanalServerWithEmbedded embeddedServer = new CanalServerWithEmbedded(); - embeddedServer.setCanalInstanceGenerator(new CanalInstanceGenerator() { - - public CanalInstance generate(String destination) { - Canal canal = buildCanal(); - return new CanalInstanceWithManager(canal, FILTER); - } + embeddedServer.setCanalInstanceGenerator(destination -> { + Canal canal = buildCanal(); + return new CanalInstanceWithManager(canal, FILTER); }); nettyServer = CanalServerWithNetty.instance(); diff --git a/server/src/test/java/com/alibaba/otter/canal/server/embedded/BaseCanalServerWithEmbededTest.java b/server/src/test/java/com/alibaba/otter/canal/server/embedded/BaseCanalServerWithEmbededTest.java index 2cc1de08..8e987423 100644 --- a/server/src/test/java/com/alibaba/otter/canal/server/embedded/BaseCanalServerWithEmbededTest.java +++ b/server/src/test/java/com/alibaba/otter/canal/server/embedded/BaseCanalServerWithEmbededTest.java @@ -33,12 +33,9 @@ public abstract class BaseCanalServerWithEmbededTest { @Before public void setUp() { server = CanalServerWithEmbedded.instance(); - server.setCanalInstanceGenerator(new CanalInstanceGenerator() { - - public CanalInstance generate(String destination) { - Canal canal = buildCanal(); - return new CanalInstanceWithManager(canal, FILTER); - } + server.setCanalInstanceGenerator(destination -> { + Canal canal = buildCanal(); + return new CanalInstanceWithManager(canal, FILTER); }); server.start(); server.start(DESTINATION); diff --git a/sink/src/main/java/com/alibaba/otter/canal/sink/AbstractCanalEventSink.java b/sink/src/main/java/com/alibaba/otter/canal/sink/AbstractCanalEventSink.java index db23cbfe..c48ab806 100644 --- a/sink/src/main/java/com/alibaba/otter/canal/sink/AbstractCanalEventSink.java +++ b/sink/src/main/java/com/alibaba/otter/canal/sink/AbstractCanalEventSink.java @@ -12,7 +12,7 @@ import com.alibaba.otter.canal.filter.CanalEventFilter; public abstract class AbstractCanalEventSink extends AbstractCanalLifeCycle implements CanalEventSink { protected CanalEventFilter filter; - protected List handlers = new ArrayList(); + protected List handlers = new ArrayList<>(); public void setFilter(CanalEventFilter filter) { this.filter = filter; diff --git a/sink/src/main/java/com/alibaba/otter/canal/sink/entry/EntryEventSink.java b/sink/src/main/java/com/alibaba/otter/canal/sink/entry/EntryEventSink.java index 4c719ec1..f4061477 100644 --- a/sink/src/main/java/com/alibaba/otter/canal/sink/entry/EntryEventSink.java +++ b/sink/src/main/java/com/alibaba/otter/canal/sink/entry/EntryEventSink.java @@ -90,7 +90,7 @@ public class EntryEventSink extends AbstractCanalEventSink events = new ArrayList(); + List events = new ArrayList<>(); for (CanalEntry.Entry entry : entrys) { if (!doFilter(entry)) { continue; diff --git a/sink/src/main/java/com/alibaba/otter/canal/sink/entry/HeartBeatEntryEventHandler.java b/sink/src/main/java/com/alibaba/otter/canal/sink/entry/HeartBeatEntryEventHandler.java index ec23aa86..e74e3e5e 100644 --- a/sink/src/main/java/com/alibaba/otter/canal/sink/entry/HeartBeatEntryEventHandler.java +++ b/sink/src/main/java/com/alibaba/otter/canal/sink/entry/HeartBeatEntryEventHandler.java @@ -27,7 +27,7 @@ public class HeartBeatEntryEventHandler extends AbstractCanalEventDownStreamHand return events; } else { // 目前heartbeat和其他事件是分离的,保险一点还是做一下检查处理 - List result = new ArrayList(); + List result = new ArrayList<>(); for (Event event : events) { if (event.getEntryType() != EntryType.HEARTBEAT) { result.add(event); diff --git a/sink/src/main/java/com/alibaba/otter/canal/sink/entry/group/TimelineBarrier.java b/sink/src/main/java/com/alibaba/otter/canal/sink/entry/group/TimelineBarrier.java index 24f457b7..75a6d9b8 100644 --- a/sink/src/main/java/com/alibaba/otter/canal/sink/entry/group/TimelineBarrier.java +++ b/sink/src/main/java/com/alibaba/otter/canal/sink/entry/group/TimelineBarrier.java @@ -32,7 +32,7 @@ public class TimelineBarrier implements GroupBarrier { protected ReentrantLock lock = new ReentrantLock(); protected Condition condition = lock.newCondition(); protected volatile long threshold; - protected BlockingQueue lastTimestamps = new PriorityBlockingQueue(); // 当前通道最后一次single的时间戳 + protected BlockingQueue lastTimestamps = new PriorityBlockingQueue<>(); // 当前通道最后一次single的时间戳 public TimelineBarrier(int groupSize){ this.groupSize = groupSize; diff --git a/sink/src/main/java/com/alibaba/otter/canal/sink/entry/group/TimelineTransactionBarrier.java b/sink/src/main/java/com/alibaba/otter/canal/sink/entry/group/TimelineTransactionBarrier.java index 59bf8fd7..65318ae7 100644 --- a/sink/src/main/java/com/alibaba/otter/canal/sink/entry/group/TimelineTransactionBarrier.java +++ b/sink/src/main/java/com/alibaba/otter/canal/sink/entry/group/TimelineTransactionBarrier.java @@ -16,12 +16,7 @@ import com.alibaba.otter.canal.store.model.Event; */ public class TimelineTransactionBarrier extends TimelineBarrier { - private ThreadLocal inTransaction = new ThreadLocal() { - - protected Object initialValue() { - return false; - } - }; + private ThreadLocal inTransaction = ThreadLocal.withInitial(() -> false); /** *
diff --git a/sink/src/test/java/com/alibaba/otter/canal/sink/GroupEventSinkTest.java b/sink/src/test/java/com/alibaba/otter/canal/sink/GroupEventSinkTest.java
index 1a6e8f84..bef164bd 100644
--- a/sink/src/test/java/com/alibaba/otter/canal/sink/GroupEventSinkTest.java
+++ b/sink/src/test/java/com/alibaba/otter/canal/sink/GroupEventSinkTest.java
@@ -28,71 +28,62 @@ public class GroupEventSinkTest {
 
         ExecutorService executor = Executors.newFixedThreadPool(3);
         final CountDownLatch latch = new CountDownLatch(1);
-        executor.submit(new Runnable() {
-
-            public void run() {
-                for (int i = 0; i < 50; i++) {
-                    try {
-                        eventSink.sink(Arrays.asList(buildEntry("1", 1L + i, 1L + i)), address, "ljhtest1");
-                        Thread.sleep(50L + RandomUtils.nextInt(50));
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                    }
+        executor.submit(() -> {
+            for (int i = 0; i < 50; i++) {
+                try {
+                    eventSink.sink(Arrays.asList(buildEntry("1", 1L + i, 1L + i)), address, "ljhtest1");
+                    Thread.sleep(50L + RandomUtils.nextInt(50));
+                } catch (Exception e) {
+                    e.printStackTrace();
                 }
-
-                for (int i = 0; i < 50; i++) {
-                    try {
-                        eventSink.sink(Arrays.asList(buildEntry("1", 1L + i, 30L + i)), address, "ljhtest1");
-                        Thread.sleep(50L + RandomUtils.nextInt(50));
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                    }
-                }
-
-                System.out.println("one sink finished!");
-                latch.countDown();
             }
+
+            for (int i = 0; i < 50; i++) {
+                try {
+                    eventSink.sink(Arrays.asList(buildEntry("1", 1L + i, 30L + i)), address, "ljhtest1");
+                    Thread.sleep(50L + RandomUtils.nextInt(50));
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+
+            System.out.println("one sink finished!");
+            latch.countDown();
         });
 
-        executor.submit(new Runnable() {
-
-            public void run() {
-                for (int i = 0; i < 50; i++) {
-                    try {
-                        eventSink.sink(Arrays.asList(buildEntry("1", 1L + i, 10L + i)), address, "ljhtest2");
-                        Thread.sleep(50L + RandomUtils.nextInt(50));
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                    }
+        executor.submit(() -> {
+            for (int i = 0; i < 50; i++) {
+                try {
+                    eventSink.sink(Arrays.asList(buildEntry("1", 1L + i, 10L + i)), address, "ljhtest2");
+                    Thread.sleep(50L + RandomUtils.nextInt(50));
+                } catch (Exception e) {
+                    e.printStackTrace();
                 }
-
-                for (int i = 0; i < 50; i++) {
-                    try {
-                        eventSink.sink(Arrays.asList(buildEntry("1", 1L + i, 40L + i)), address, "ljhtest2");
-                        Thread.sleep(50L + RandomUtils.nextInt(50));
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                    }
-                }
-                System.out.println("tow sink finished!");
-                latch.countDown();
             }
+
+            for (int i = 0; i < 50; i++) {
+                try {
+                    eventSink.sink(Arrays.asList(buildEntry("1", 1L + i, 40L + i)), address, "ljhtest2");
+                    Thread.sleep(50L + RandomUtils.nextInt(50));
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+            System.out.println("tow sink finished!");
+            latch.countDown();
         });
 
-        executor.submit(new Runnable() {
-
-            public void run() {
-                for (int i = 0; i < 100; i++) {
-                    try {
-                        eventSink.sink(Arrays.asList(buildEntry("1", 1L + i, 30L + i)), address, "ljhtest3");
-                        Thread.sleep(50L + RandomUtils.nextInt(50));
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                    }
+        executor.submit(() -> {
+            for (int i = 0; i < 100; i++) {
+                try {
+                    eventSink.sink(Arrays.asList(buildEntry("1", 1L + i, 30L + i)), address, "ljhtest3");
+                    Thread.sleep(50L + RandomUtils.nextInt(50));
+                } catch (Exception e) {
+                    e.printStackTrace();
                 }
-                System.out.println("tow sink finished!");
-                latch.countDown();
             }
+            System.out.println("tow sink finished!");
+            latch.countDown();
         });
 
         try {
diff --git a/store/src/main/java/com/alibaba/otter/canal/store/memory/MemoryEventStoreWithBuffer.java b/store/src/main/java/com/alibaba/otter/canal/store/memory/MemoryEventStoreWithBuffer.java
index 22308c71..1e27b34f 100644
--- a/store/src/main/java/com/alibaba/otter/canal/store/memory/MemoryEventStoreWithBuffer.java
+++ b/store/src/main/java/com/alibaba/otter/canal/store/memory/MemoryEventStoreWithBuffer.java
@@ -280,10 +280,10 @@ public class MemoryEventStoreWithBuffer extends AbstractCanalStoreScavenge imple
         }
 
         if (current >= maxAbleSequence) {
-            return new Events();
+            return new Events<>();
         }
 
-        Events result = new Events();
+        Events result = new Events<>();
         List entrys = result.getEvents();
         long memsize = 0;
         if (batchMode.isItemSize()) {
@@ -329,7 +329,7 @@ public class MemoryEventStoreWithBuffer extends AbstractCanalStoreScavenge imple
 
         }
 
-        PositionRange range = new PositionRange();
+        PositionRange range = new PositionRange<>();
         result.setPositionRange(range);
 
         range.setStart(CanalEventUtils.createPosition(entrys.get(0)));
@@ -354,7 +354,7 @@ public class MemoryEventStoreWithBuffer extends AbstractCanalStoreScavenge imple
             profiling(result.getEvents(), OP.GET);
             return result;
         } else {
-            return new Events();
+            return new Events<>();
         }
     }
 
diff --git a/store/src/test/java/com/alibaba/otter/canal/store/memory/buffer/MemoryEventStoreMemBatchTest.java b/store/src/test/java/com/alibaba/otter/canal/store/memory/buffer/MemoryEventStoreMemBatchTest.java
index d64c22bb..4fcab3c3 100644
--- a/store/src/test/java/com/alibaba/otter/canal/store/memory/buffer/MemoryEventStoreMemBatchTest.java
+++ b/store/src/test/java/com/alibaba/otter/canal/store/memory/buffer/MemoryEventStoreMemBatchTest.java
@@ -167,19 +167,16 @@ public class MemoryEventStoreMemBatchTest extends MemoryEventStoreBase {
         }
 
         ExecutorService executor = Executors.newFixedThreadPool(1);
-        executor.submit(new Runnable() {
-
-            public void run() {
-                boolean result = false;
-                try {
-                    eventStore.get(position, batchSize);
-                } catch (CanalStoreException e) {
-                } catch (InterruptedException e) {
-                    System.out.println("interrupt occured.");
-                    result = true;
-                }
-                Assert.assertTrue(result);
+        executor.submit(() -> {
+            boolean result = false;
+            try {
+                eventStore.get(position, batchSize);
+            } catch (CanalStoreException e) {
+            } catch (InterruptedException e) {
+                System.out.println("interrupt occured.");
+                result = true;
             }
+            Assert.assertTrue(result);
         });
 
         try {
@@ -245,7 +242,7 @@ public class MemoryEventStoreMemBatchTest extends MemoryEventStoreBase {
 
         first = eventStore.getFirstPosition();
         lastest = eventStore.getLatestPosition();
-        List entrys = new ArrayList(entrys2.getEvents());
+        List entrys = new ArrayList<>(entrys2.getEvents());
         Assert.assertTrue(entrys.size() == bufferSize);
         Assert.assertEquals(first, entrys2.getPositionRange().getStart());
         Assert.assertEquals(lastest, entrys2.getPositionRange().getEnd());
@@ -299,7 +296,7 @@ public class MemoryEventStoreMemBatchTest extends MemoryEventStoreBase {
 
         first = eventStore.getFirstPosition();
         lastest = eventStore.getLatestPosition();
-        List entrys = new ArrayList(entrys2.getEvents());
+        List entrys = new ArrayList<>(entrys2.getEvents());
         // Assert.assertEquals(first, entrys2.getPositionRange().getStart());
         Assert.assertEquals(lastest, entrys2.getPositionRange().getEnd());
 
diff --git a/store/src/test/java/com/alibaba/otter/canal/store/memory/buffer/MemoryEventStoreMultiThreadTest.java b/store/src/test/java/com/alibaba/otter/canal/store/memory/buffer/MemoryEventStoreMultiThreadTest.java
index 92d7758f..1a06e8f1 100644
--- a/store/src/test/java/com/alibaba/otter/canal/store/memory/buffer/MemoryEventStoreMultiThreadTest.java
+++ b/store/src/test/java/com/alibaba/otter/canal/store/memory/buffer/MemoryEventStoreMultiThreadTest.java
@@ -121,7 +121,7 @@ public class MemoryEventStoreMultiThreadTest extends MemoryEventStoreBase {
         private CountDownLatch latch;
         private int            freq;
         private int            batchSize;
-        private List     result = new ArrayList();
+        private List     result = new ArrayList<>();
 
         public Cosumer(CountDownLatch latch, int freq, int batchSize){
             this.latch = latch;
diff --git a/store/src/test/java/com/alibaba/otter/canal/store/memory/buffer/MemoryEventStorePutAndGetTest.java b/store/src/test/java/com/alibaba/otter/canal/store/memory/buffer/MemoryEventStorePutAndGetTest.java
index 5c8b9424..473d4582 100644
--- a/store/src/test/java/com/alibaba/otter/canal/store/memory/buffer/MemoryEventStorePutAndGetTest.java
+++ b/store/src/test/java/com/alibaba/otter/canal/store/memory/buffer/MemoryEventStorePutAndGetTest.java
@@ -145,19 +145,16 @@ public class MemoryEventStorePutAndGetTest extends MemoryEventStoreBase {
         }
 
         ExecutorService executor = Executors.newFixedThreadPool(1);
-        executor.submit(new Runnable() {
-
-            public void run() {
-                boolean result = false;
-                try {
-                    eventStore.get(position, batchSize);
-                } catch (CanalStoreException e) {
-                } catch (InterruptedException e) {
-                    System.out.println("interrupt occured.");
-                    result = true;
-                }
-                Assert.assertTrue(result);
+        executor.submit(() -> {
+            boolean result = false;
+            try {
+                eventStore.get(position, batchSize);
+            } catch (CanalStoreException e) {
+            } catch (InterruptedException e) {
+                System.out.println("interrupt occured.");
+                result = true;
             }
+            Assert.assertTrue(result);
         });
 
         try {
diff --git a/store/src/test/java/com/alibaba/otter/canal/store/memory/buffer/MemoryEventStoreRollbackAndAckTest.java b/store/src/test/java/com/alibaba/otter/canal/store/memory/buffer/MemoryEventStoreRollbackAndAckTest.java
index 1086cfc2..c0ae2923 100644
--- a/store/src/test/java/com/alibaba/otter/canal/store/memory/buffer/MemoryEventStoreRollbackAndAckTest.java
+++ b/store/src/test/java/com/alibaba/otter/canal/store/memory/buffer/MemoryEventStoreRollbackAndAckTest.java
@@ -67,7 +67,7 @@ public class MemoryEventStoreRollbackAndAckTest extends MemoryEventStoreBase {
 
         first = eventStore.getFirstPosition();
         lastest = eventStore.getLatestPosition();
-        List entrys = new ArrayList(entrys2.getEvents());
+        List entrys = new ArrayList<>(entrys2.getEvents());
         Assert.assertTrue(entrys.size() == bufferSize);
         Assert.assertEquals(first, entrys2.getPositionRange().getStart());
         Assert.assertEquals(lastest, entrys2.getPositionRange().getEnd());
@@ -120,7 +120,7 @@ public class MemoryEventStoreRollbackAndAckTest extends MemoryEventStoreBase {
 
         first = eventStore.getFirstPosition();
         lastest = eventStore.getLatestPosition();
-        List entrys = new ArrayList(entrys2.getEvents());
+        List entrys = new ArrayList<>(entrys2.getEvents());
         // because doGet() contains the logic about whether include first event , so not to compare
         //Assert.assertEquals(first, entrys2.getPositionRange().getStart());
         Assert.assertEquals(lastest, entrys2.getPositionRange().getEnd());