提交 2b4b958f 编写于 作者: G gaohongtao 提交者: gaohongtao

remove init method from IdGenerator

上级 e65fe031
......@@ -27,6 +27,7 @@ import com.dangdang.ddframe.rdb.sharding.api.strategy.database.SingleKeyDatabase
import com.dangdang.ddframe.rdb.sharding.api.strategy.table.MultipleKeysTableShardingAlgorithm;
import com.dangdang.ddframe.rdb.sharding.api.strategy.table.SingleKeyTableShardingAlgorithm;
import com.dangdang.ddframe.rdb.sharding.api.strategy.table.TableShardingStrategy;
import com.dangdang.ddframe.rdb.sharding.config.common.api.config.AutoIncrementColumnConfig;
import com.dangdang.ddframe.rdb.sharding.config.common.api.config.BindingTableRuleConfig;
import com.dangdang.ddframe.rdb.sharding.config.common.api.config.ShardingRuleConfig;
import com.dangdang.ddframe.rdb.sharding.config.common.api.config.StrategyConfig;
......@@ -121,11 +122,11 @@ public final class ShardingRuleBuilder {
}
private void buildAutoIncrementColumn(final TableRule.TableRuleBuilder tableRuleBuilder, final TableRuleConfig tableRuleConfig) {
for (Entry<String, String> each : tableRuleConfig.getAutoIncrementColumns().entrySet()) {
if (null == each.getValue()) {
tableRuleBuilder.autoIncrementColumns(each.getKey());
for (AutoIncrementColumnConfig each : tableRuleConfig.getAutoIncrementColumns()) {
if (Strings.isNullOrEmpty(each.getColumnIdGeneratorClass())) {
tableRuleBuilder.autoIncrementColumns(each.getColumnName());
} else {
tableRuleBuilder.autoIncrementColumns(each.getKey(), loadClass(each.getValue(), IdGenerator.class));
tableRuleBuilder.autoIncrementColumns(each.getColumnName(), loadClass(each.getColumnIdGeneratorClass(), IdGenerator.class));
}
}
}
......@@ -194,7 +195,7 @@ public final class ShardingRuleBuilder {
@SuppressWarnings("unchecked")
private <T> Class<? extends T> loadClass(final String className, final Class<T> superClass) {
try {
return (Class<? extends T>) Class.forName(className);
return (Class<? extends T>) superClass.getClassLoader().loadClass(className);
} catch (final ClassNotFoundException ex) {
throw new IllegalArgumentException(ex);
}
......
/*
* Copyright 1999-2015 dangdang.com.
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* </p>
*/
package com.dangdang.ddframe.rdb.sharding.config.common.api.config;
import lombok.Getter;
import lombok.Setter;
/**
* 自增列配置.
*
* @author gaohongtao
*/
@Getter
@Setter
public class AutoIncrementColumnConfig {
private String columnName;
private String columnIdGeneratorClass;
}
......@@ -20,8 +20,8 @@ package com.dangdang.ddframe.rdb.sharding.config.common.api.config;
import lombok.Getter;
import lombok.Setter;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import java.util.List;
/**
* 表规则配置.
......@@ -42,5 +42,5 @@ public class TableRuleConfig {
private StrategyConfig tableStrategy;
private Map<String, String> autoIncrementColumns = new HashMap<>();
private List<AutoIncrementColumnConfig> autoIncrementColumns = new ArrayList<>();
}
......@@ -21,16 +21,19 @@ import com.dangdang.ddframe.rdb.sharding.api.rule.BindingTableRule;
import com.dangdang.ddframe.rdb.sharding.api.rule.DataNode;
import com.dangdang.ddframe.rdb.sharding.api.rule.ShardingRule;
import com.dangdang.ddframe.rdb.sharding.api.rule.TableRule;
import com.dangdang.ddframe.rdb.sharding.config.common.api.config.AutoIncrementColumnConfig;
import com.dangdang.ddframe.rdb.sharding.config.common.api.config.BindingTableRuleConfig;
import com.dangdang.ddframe.rdb.sharding.config.common.api.config.ShardingRuleConfig;
import com.dangdang.ddframe.rdb.sharding.config.common.api.config.StrategyConfig;
import com.dangdang.ddframe.rdb.sharding.config.common.api.config.TableRuleConfig;
import com.dangdang.ddframe.rdb.sharding.config.common.fixture.DecrementIdGenerator;
import com.dangdang.ddframe.rdb.sharding.config.common.internal.fixture.MultiAlgorithm;
import com.dangdang.ddframe.rdb.sharding.config.common.internal.fixture.SingleAlgorithm;
import com.google.common.base.Joiner;
import org.junit.Test;
import javax.sql.DataSource;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
......@@ -160,8 +163,13 @@ public final class ShardingRuleBuilderTest {
result.setTableStrategy(getTableStrategyConfigForExpression());
Map<String, String> autoIncrementColumnMap = new HashMap<>();
autoIncrementColumnMap.put("order_id", null);
AutoIncrementColumnConfig orderIdConfig = new AutoIncrementColumnConfig();
orderIdConfig.setColumnName("order_id");
autoIncrementColumnMap.put("order_item_id", "com.dangdang.ddframe.rdb.sharding.config.common.fixture.DecrementIdGenerator");
result.setAutoIncrementColumns(autoIncrementColumnMap);
AutoIncrementColumnConfig orderItemIdConfig = new AutoIncrementColumnConfig();
orderItemIdConfig.setColumnName("order_item_id");
orderItemIdConfig.setColumnIdGeneratorClass(DecrementIdGenerator.class.getName());
result.setAutoIncrementColumns(Arrays.asList(orderIdConfig, orderItemIdConfig));
return result;
}
......
......@@ -28,9 +28,4 @@ abstract class AbstractNumberIdGenerator implements IdGenerator {
@Getter(AccessLevel.PACKAGE)
private final AtomicInteger sequence = new AtomicInteger(100);
@Override
public void initContext(final String tableName, final String columnName) {
}
}
......@@ -20,7 +20,7 @@ package com.dangdang.ddframe.rdb.sharding.config.common.fixture;
public class DecrementIdGenerator extends AbstractNumberIdGenerator {
@Override
public Object generateId() {
public Number generateId() {
return getSequence().decrementAndGet();
}
}
......@@ -20,7 +20,7 @@ package com.dangdang.ddframe.rdb.sharding.config.common.fixture;
public class IncrementIdGenerator extends AbstractNumberIdGenerator {
@Override
public Object generateId() {
public Number generateId() {
return getSequence().incrementAndGet();
}
}
......@@ -17,13 +17,16 @@
package com.dangdang.ddframe.rdb.sharding.spring.namespace.parser;
import com.dangdang.ddframe.rdb.sharding.config.common.api.config.AutoIncrementColumnConfig;
import com.dangdang.ddframe.rdb.sharding.config.common.api.config.BindingTableRuleConfig;
import com.dangdang.ddframe.rdb.sharding.config.common.api.config.ShardingRuleConfig;
import com.dangdang.ddframe.rdb.sharding.config.common.api.config.TableRuleConfig;
import com.dangdang.ddframe.rdb.sharding.spring.datasource.SpringShardingDataSource;
import com.dangdang.ddframe.rdb.sharding.spring.namespace.constants.ShardingJdbcDataSourceBeanDefinitionParserTag;
import com.google.common.base.Function;
import com.google.common.base.Splitter;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
......@@ -128,12 +131,15 @@ public class ShardingJdbcDataSourceBeanDefinitionParser extends AbstractBeanDefi
if (null == autoIncrementColumns || autoIncrementColumns.isEmpty()) {
return factory.getBeanDefinition();
}
Map<String, String> autoIncrementColumnMap = new ManagedMap<>(autoIncrementColumns.size());
for (Element each : autoIncrementColumns) {
autoIncrementColumnMap.put(each.getAttribute(ShardingJdbcDataSourceBeanDefinitionParserTag.COLUMN_NAME),
Strings.emptyToNull(each.getAttribute(ShardingJdbcDataSourceBeanDefinitionParserTag.COLUMN_ID_GENERATOR_CLASS)));
}
factory.addPropertyValue("autoIncrementColumns", autoIncrementColumnMap);
factory.addPropertyValue("autoIncrementColumns", Lists.transform(autoIncrementColumns, new Function<Element, AutoIncrementColumnConfig>() {
@Override
public AutoIncrementColumnConfig apply(final Element input) {
AutoIncrementColumnConfig result = new AutoIncrementColumnConfig();
result.setColumnName(input.getAttribute(ShardingJdbcDataSourceBeanDefinitionParserTag.COLUMN_NAME));
result.setColumnIdGeneratorClass(input.getAttribute(ShardingJdbcDataSourceBeanDefinitionParserTag.COLUMN_ID_GENERATOR_CLASS));
return result;
}
}));
return factory.getBeanDefinition();
}
......
......@@ -27,10 +27,4 @@ abstract class AbstractNumberIdGenerator implements IdGenerator {
@Getter(AccessLevel.PACKAGE)
private final AtomicInteger sequence = new AtomicInteger(100);
@Override
public void initContext(final String tableName, final String columnName) {
}
}
......@@ -20,7 +20,7 @@ package com.dangdang.ddframe.rdb.sharding.spring.fixture;
public class DecrementIdGenerator extends AbstractNumberIdGenerator {
@Override
public Object generateId() {
public Number generateId() {
return getSequence().decrementAndGet();
}
}
......@@ -20,7 +20,7 @@ package com.dangdang.ddframe.rdb.sharding.spring.fixture;
public class IncrementIdGenerator extends AbstractNumberIdGenerator {
@Override
public Object generateId() {
public Number generateId() {
return getSequence().incrementAndGet();
}
}
......@@ -28,9 +28,4 @@ abstract class AbstractNumberIdGenerator implements IdGenerator {
@Getter(AccessLevel.PACKAGE)
private final AtomicInteger sequence = new AtomicInteger(100);
@Override
public void initContext(final String tableName, final String columnName) {
}
}
......@@ -20,7 +20,7 @@ package com.dangdang.ddframe.rdb.sharding.config.yaml.fixture;
public class DecrementIdGenerator extends AbstractNumberIdGenerator {
@Override
public Object generateId() {
public Number generateId() {
return getSequence().decrementAndGet();
}
}
......@@ -20,7 +20,7 @@ package com.dangdang.ddframe.rdb.sharding.config.yaml.fixture;
public class IncrementIdGenerator extends AbstractNumberIdGenerator {
@Override
public Object generateId() {
public Number generateId() {
return getSequence().incrementAndGet();
}
}
......@@ -24,7 +24,7 @@ tables:
t_order:
actualTables: t_order_${0..1}
autoIncrementColumns:
order_id:
- columnName: order_id
databaseStrategy: &db001
shardingColumns: order_id
algorithmClassName: com.dangdang.ddframe.rdb.sharding.config.yaml.algorithm.SingleAlgorithm
......@@ -35,7 +35,8 @@ tables:
t_order_item:
actualTables: t_order_item_${0..1}
autoIncrementColumns:
order_item_id: com.dangdang.ddframe.rdb.sharding.config.yaml.fixture.DecrementIdGenerator
- columnName: order_item_id
columnIdGeneratorClass: com.dangdang.ddframe.rdb.sharding.config.yaml.fixture.DecrementIdGenerator
#绑定表中其余的表的策略与第一张表的策略相同
databaseStrategy: *db001
tableStrategy: *table001
......
......@@ -203,7 +203,8 @@ public final class TableRule {
void fillIdGenerator(final Class<? extends IdGenerator> idGeneratorClass) {
for (Map.Entry<String, IdGenerator> each : autoIncrementColumnMap.entrySet()) {
if (null == each.getValue()) {
each.setValue(TableRuleBuilder.instanceIdGenerator(idGeneratorClass));
IdGenerator idGenerator = TableRuleBuilder.instanceIdGenerator(idGeneratorClass);
each.setValue(idGenerator);
}
}
}
......@@ -215,9 +216,8 @@ public final class TableRule {
* @return 生成的id
*/
public Object generateId(final String columnName) {
Object result = autoIncrementColumnMap.get(columnName).generateId();
Number result = autoIncrementColumnMap.get(columnName).generateId();
Preconditions.checkNotNull(result);
Preconditions.checkState(result instanceof Number || result instanceof String, "id %s(%s) should be Number or String", result.toString(), result.getClass().getName());
return result;
}
......
......@@ -24,18 +24,10 @@ package com.dangdang.ddframe.rdb.sharding.id.generator;
*/
public interface IdGenerator {
/**
* 初始化配置环境.
*
* @param tableName 逻辑表名称
* @param columnName 需要生成的列名称
*/
void initContext(String tableName, String columnName);
/**
* 生成Id.
*
* @return 返回生成的Id,返回值应为@{@link Number}对象或者为@{@link String}对象
*/
Object generateId();
Number generateId();
}
......@@ -41,14 +41,8 @@ public class UnsupportedIdGeneratorTest {
}
private static class IllegalIdGenerator implements IdGenerator {
@Override
public void initContext(final String tableName, final String columnName) {
}
@Override
public Object generateId() {
public Number generateId() {
return null;
}
}
......
......@@ -26,12 +26,7 @@ public class IncrementIdGenerator implements IdGenerator {
private final AtomicInteger i = new AtomicInteger();
@Override
public void initContext(final String tableName, final String columnName) {
}
@Override
public Object generateId() {
public Number generateId() {
return i.incrementAndGet();
}
}
......@@ -24,7 +24,7 @@ tables:
t_order:
actualTables: ds_${0..1}.t_order_${0..1}
autoIncrementColumns:
order_id:
- columnName: order_id
tableStrategy:
shardingColumns: order_id
algorithmExpression: t_order_${order_id.longValue() % 2}
......
......@@ -26,6 +26,7 @@ import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
......@@ -50,7 +51,7 @@ import java.util.Date;
@Slf4j
public class CommonSelfIdGenerator implements IdGenerator {
public static final long SJDBC_EPOCH = 1477933200000L;
public static final long SJDBC_EPOCH;
private static final long SEQUENCE_BITS = 12L;
......@@ -71,6 +72,13 @@ public class CommonSelfIdGenerator implements IdGenerator {
private static long workerId;
static {
Calendar calendar = Calendar.getInstance();
calendar.set(2016, Calendar.NOVEMBER, 1);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
SJDBC_EPOCH = calendar.getTimeInMillis();
initWorkerId();
}
......@@ -78,10 +86,6 @@ public class CommonSelfIdGenerator implements IdGenerator {
private long lastTime;
private String tableName;
private String columnName;
static void initWorkerId() {
String workerId = System.getProperty("sjdbc.self.id.generator.worker.id");
if (!Strings.isNullOrEmpty(workerId)) {
......@@ -105,25 +109,13 @@ public class CommonSelfIdGenerator implements IdGenerator {
CommonSelfIdGenerator.workerId = workerId;
}
/**
* 初始化环境.
*
* @param tableName 逻辑表名称
* @param columnName 需要生成的列名称
*/
@Override
public void initContext(final String tableName, final String columnName) {
this.tableName = tableName;
this.columnName = columnName;
}
/**
* 生成Id.
*
* @return 返回@{@link Long}类型的Id
*/
@Override
public synchronized Object generateId() {
public synchronized Number generateId() {
long time = clock.millis();
Preconditions.checkState(lastTime <= time, "Clock is moving backwards, last time is %d milliseconds, current time is %d milliseconds", lastTime, time);
if (lastTime == time) {
......@@ -135,7 +127,7 @@ public class CommonSelfIdGenerator implements IdGenerator {
}
lastTime = time;
if (log.isDebugEnabled()) {
log.debug("{}.{}:{}-{}-{}", tableName, columnName, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date(lastTime)), workerId, sequence);
log.debug("{}-{}-{}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date(lastTime)), workerId, sequence);
}
return ((time - SJDBC_EPOCH) << TIMESTAMP_LEFT_SHIFT_BITS) | (workerId << WORKER_ID_LEFT_SHIFT_BITS) | sequence;
}
......
......@@ -45,11 +45,8 @@ public abstract class AbstractWorkerIdTest {
@Test
public void testWorkerId() {
CommonSelfIdGenerator idGenerator = new CommonSelfIdGenerator();
idGenerator.initContext("order", "id");
assertThat((Long) idGenerator.generateId(), is(getWorkerId() << 12L));
assertThat(idGenerator.getTableName(), is("order"));
assertThat(idGenerator.getColumnName(), is("id"));
assertThat(idGenerator.getLastTime(), is(CommonSelfIdGenerator.SJDBC_EPOCH));
assertThat(idGenerator.getSequence(), is(0L));
assertThat(CommonSelfIdGenerator.getWorkerId(), is(getWorkerId()));
......
......@@ -45,7 +45,6 @@ public class CommonSelfIdGeneratorTest {
final int taskNumber = threadNumber << 2;
final CommonSelfIdGenerator idGenerator = new CommonSelfIdGenerator();
idGenerator.initContext("order", "id");
Set<Long> hashSet = new HashSet<>();
for (int i = 0; i < taskNumber; i++) {
hashSet.add(executor.submit(new Callable<Long>() {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册