From d34c9d807516eb2227b575085c1467fe4cd300f2 Mon Sep 17 00:00:00 2001 From: 尹本进 Date: Tue, 6 Apr 2021 11:07:16 +0800 Subject: [PATCH] experiment --- src/main/java/com/example/mina/client/base/AbstractClientFactory.java | 7 ------- src/main/java/com/example/mina/client/base/AbstractExperimentFactory.java | 34 ++++++++++++++++++++++++++++++++++ src/main/java/com/example/mina/client/base/ExperimentFactory.java | 62 -------------------------------------------------------------- src/main/java/com/example/mina/client/base/ExperimentManager.java | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main/java/com/example/mina/client/base/ExperimentOptions.java | 19 ++++--------------- src/main/java/com/example/mina/client/base/ExperimentType.java | 28 ++++++++++++++++++++++++++++ src/main/java/com/example/mina/client/base/MatrixConnectConfig.java | 6 ------ src/main/java/com/example/mina/client/base/MatrixConstants.java | 2 +- src/main/java/com/example/mina/client/base/StationPair.java | 5 ++--- src/main/java/com/example/mina/client/experiment/HandOverExperimentFactory.java | 25 +++++++++++++++++++++++++ src/main/java/com/example/mina/client/experiment/HandoverExperiment.java | 9 ++++++--- 11 files changed, 159 insertions(+), 97 deletions(-) create mode 100644 src/main/java/com/example/mina/client/base/AbstractExperimentFactory.java delete mode 100644 src/main/java/com/example/mina/client/base/ExperimentFactory.java create mode 100644 src/main/java/com/example/mina/client/base/ExperimentManager.java create mode 100644 src/main/java/com/example/mina/client/base/ExperimentType.java create mode 100644 src/main/java/com/example/mina/client/experiment/HandOverExperimentFactory.java diff --git a/src/main/java/com/example/mina/client/base/AbstractClientFactory.java b/src/main/java/com/example/mina/client/base/AbstractClientFactory.java index df31aad..ca7f2a7 100644 --- a/src/main/java/com/example/mina/client/base/AbstractClientFactory.java +++ b/src/main/java/com/example/mina/client/base/AbstractClientFactory.java @@ -16,22 +16,15 @@ public abstract class AbstractClientFactory { abstract public AbstractMatrixIoHandler getClientHandler(); public void buildFilterChain(IoFilterChain ioFilterChain) throws Exception{ - ioFilterChain.addLast("codec", new ProtocolCodecFilter(new ByteProtocolFactory())); - } public MatrixClient createClient(MatrixConnectConfig connectConfig){ - - try{ - MatrixClient client = new MatrixClient(connectConfig); - client.setClientHandler(getClientHandler()); client.setMatrixDataProxy(matrixDataProxy); client.connect(); - buildFilterChain(client.getFilterChain()); return client; }catch (Exception e) { diff --git a/src/main/java/com/example/mina/client/base/AbstractExperimentFactory.java b/src/main/java/com/example/mina/client/base/AbstractExperimentFactory.java new file mode 100644 index 0000000..09d7874 --- /dev/null +++ b/src/main/java/com/example/mina/client/base/AbstractExperimentFactory.java @@ -0,0 +1,34 @@ +package com.example.mina.client.base; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public abstract class AbstractExperimentFactory> { + + abstract public boolean isSupport(ExperimentOptions options); + + protected abstract Class getClazz(); + + public ExperimentProgressListner getListner() { + //TODO 生成任务进度更新监听器 + return null; + } + + public T createExperiment(MatrixClient client, ExperimentOptions options) { + if (isSupport(options)) { + log.error("the experiment is not supported by the matrix! matrix id: " + client.getDeviceId()); + throw new RuntimeException("the experiment is not supported by the matrix! matrix id: " + client.getDeviceId()); + } + try { + T t = getClazz().getDeclaredConstructor().newInstance(); + t.setClient(client); + t.setOptions(options); + t.setProgressListner(getListner()); + return t; + } catch (Exception e) { + log.error("create a experiment task is failed, matrix id: " + client.getDeviceId()); + throw new RuntimeException("create a experiment task is failed, matrix id: " + client.getDeviceId()); + } + } + +} diff --git a/src/main/java/com/example/mina/client/base/ExperimentFactory.java b/src/main/java/com/example/mina/client/base/ExperimentFactory.java deleted file mode 100644 index 489e2fa..0000000 --- a/src/main/java/com/example/mina/client/base/ExperimentFactory.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.example.mina.client.base; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.util.CollectionUtils; - -import java.util.Map; - -@Slf4j -public abstract class ExperimentFactory < T extends Experiment> { - - private Map experiments; - - public ExperimentFactory() { - experiments = CollectionUtils.newHashMap(10); - } - - public T getExperiment(String matrixId) { - - return experiments.getOrDefault(matrixId, null); - } - - public void stopExperiment(String matrixId) { - T t = getExperiment(matrixId); - - if( t != null && t.isContinue()){ - t.finish(); - experiments.remove(matrixId); - } - } - - abstract public boolean isSupport(); - - abstract Class getClazz(); - - public ExperimentProgressListner getListner() { - return null; //TODO 生成任务进度更新监听器 - } - - public T createExperiment(MatrixClient client, ExperimentOptions options){ - - if(isSupport()) { - log.error("the experiment is not supported by the matrix! matrix id: " + client.getDeviceId()); - throw new RuntimeException("the experiment is not supported by the matrix! matrix id: " + client.getDeviceId()); - } - - Class tClass = getClazz(); - - try{ - - T t = tClass.newInstance(); - - t.setClient(client); - t.setOptions(options); - t.setProgressListner(getListner()); - return t; - }catch (Exception e) { - log.error("create a experiment task is failed, matrix id: " + client.getDeviceId()); - throw new RuntimeException("create a experiment task is failed, matrix id: " + client.getDeviceId()); - } - } - -} diff --git a/src/main/java/com/example/mina/client/base/ExperimentManager.java b/src/main/java/com/example/mina/client/base/ExperimentManager.java new file mode 100644 index 0000000..e3b8947 --- /dev/null +++ b/src/main/java/com/example/mina/client/base/ExperimentManager.java @@ -0,0 +1,59 @@ +package com.example.mina.client.base; + +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.Assert; + +/** + * @author BenJin Yin + * @date 2021/4/6 + */ +@Slf4j +public class ExperimentManager { + private final ConcurrentMap experimentFactories; + + private final ConcurrentMap> experiments + = new ConcurrentHashMap<>(8); + + public ExperimentManager(ConcurrentMap experimentFactories) { + this.experimentFactories = experimentFactories; + } + + public Experiment getExperiment(String experimentId) { + return experiments.getOrDefault(experimentId, null); + } + + public void stopExperiment(String experimentId) { + Experiment t = getExperiment(experimentId); + if (t != null && t.isContinue()) { + t.finish(); + experiments.remove(experimentId); + } + } + + public T getClientFactory(String name) { + return this.experimentFactories.get(name); + } + + public Experiment getOrCreateExperiment(MatrixClient client, ExperimentOptions options) { + Assert.notNull(client, "matrix connect config is null"); + Assert.hasLength(client.getDeviceId(), "deviceId can not be empty"); + + String deviceId = client.getDeviceId(); + Experiment experiment = experiments.get(options.getExperimentId()); + if (experiment != null) { + return experiment; + } + if (!experimentFactories.containsKey(deviceId)) { + log.error("the matrix type is not supported by the system! matrix type is: " + deviceId); + throw new RuntimeException("the matrix type is not supported by the system! matrix type is: " + deviceId); + + } + T t = experimentFactories.get(deviceId); + experiment = t.createExperiment(client, options); + experiments.put(options.experimentId, experiment); + return experiment; + } + +} diff --git a/src/main/java/com/example/mina/client/base/ExperimentOptions.java b/src/main/java/com/example/mina/client/base/ExperimentOptions.java index ce48a61..95a7f6f 100644 --- a/src/main/java/com/example/mina/client/base/ExperimentOptions.java +++ b/src/main/java/com/example/mina/client/base/ExperimentOptions.java @@ -1,7 +1,6 @@ package com.example.mina.client.base; import java.time.ZonedDateTime; -import java.util.List; import lombok.Data; @Data @@ -17,28 +16,18 @@ public abstract class ExperimentOptions { protected Integer step; - /** - * 每次发送指令的 时间间隔 - */ protected Integer period; - /** - * 单次从 start --> end 一个周期后的 暂停时间 - */ protected Integer pause; - /** - * 最大循环次数 - */ protected Integer iterations; protected ZonedDateTime finishAt; - - protected boolean checkOptions(){ - if(startAttn<0 || endAttn<0 || startAttn>endAttn || step<=0 - || pause<0 || period<=0 || iterations<=0 || finishAt==null || - finishAt.isBefore(ZonedDateTime.now())) { + protected boolean checkOptions() { + if (startAttn < 0 || endAttn < 0 || startAttn > endAttn || step <= 0 + || pause < 0 || period <= 0 || iterations <= 0 || finishAt == null || + finishAt.isBefore(ZonedDateTime.now())) { return false; } return true; diff --git a/src/main/java/com/example/mina/client/base/ExperimentType.java b/src/main/java/com/example/mina/client/base/ExperimentType.java new file mode 100644 index 0000000..651c109 --- /dev/null +++ b/src/main/java/com/example/mina/client/base/ExperimentType.java @@ -0,0 +1,28 @@ +package com.example.mina.client.base; + +/** + * @author BenJin Yin + * @date 2021/4/6 + */ +public enum ExperimentType { + HAND_OVER("handOver"); + + private final String remark; + + ExperimentType(String remark) { + this.remark = remark; + } + + public String getRemark() { + return remark; + } + + public static ExperimentType getInstanceByRemark(String remark) { + for (ExperimentType obj : values()) { + if (obj.getRemark().equals(remark)) { + return obj; + } + } + return null; + } +} diff --git a/src/main/java/com/example/mina/client/base/MatrixConnectConfig.java b/src/main/java/com/example/mina/client/base/MatrixConnectConfig.java index 6258184..d644e0e 100644 --- a/src/main/java/com/example/mina/client/base/MatrixConnectConfig.java +++ b/src/main/java/com/example/mina/client/base/MatrixConnectConfig.java @@ -20,11 +20,5 @@ public class MatrixConnectConfig { private Integer port; -// private Integer rows; - -// private Integer cols; - -// private Integer maxAttenuation; - private Map options; } diff --git a/src/main/java/com/example/mina/client/base/MatrixConstants.java b/src/main/java/com/example/mina/client/base/MatrixConstants.java index 035146f..d6815fd 100644 --- a/src/main/java/com/example/mina/client/base/MatrixConstants.java +++ b/src/main/java/com/example/mina/client/base/MatrixConstants.java @@ -1,6 +1,6 @@ package com.example.mina.client.base; -public class MatrixConstants { +public final class MatrixConstants { public static final String SESSION_CONFIG_NAME = "SESSION_CONFIG"; diff --git a/src/main/java/com/example/mina/client/base/StationPair.java b/src/main/java/com/example/mina/client/base/StationPair.java index e75da73..ad1fdeb 100644 --- a/src/main/java/com/example/mina/client/base/StationPair.java +++ b/src/main/java/com/example/mina/client/base/StationPair.java @@ -6,7 +6,6 @@ import lombok.Builder; import lombok.Data; /** - * 输入输出端口 * @author BenJin Yin * @date 2021/4/2 */ @@ -14,11 +13,11 @@ import lombok.Data; @Builder public class StationPair { /** - * 输出端口 + * out port */ private Integer out; /** - * 输入端口 + * in port */ private List inList; } diff --git a/src/main/java/com/example/mina/client/experiment/HandOverExperimentFactory.java b/src/main/java/com/example/mina/client/experiment/HandOverExperimentFactory.java new file mode 100644 index 0000000..56ae524 --- /dev/null +++ b/src/main/java/com/example/mina/client/experiment/HandOverExperimentFactory.java @@ -0,0 +1,25 @@ +package com.example.mina.client.experiment; + +import com.example.mina.client.base.AbstractExperimentFactory; +import com.example.mina.client.base.Experiment; +import com.example.mina.client.base.ExperimentOptions; +import com.example.mina.client.base.ExperimentType; +import org.springframework.stereotype.Component; + +/** + * @author BenJin Yin + * @date 2021/4/6 + */ +@Component +public class HandOverExperimentFactory extends AbstractExperimentFactory { + @Override + public boolean isSupport(ExperimentOptions options) { + ExperimentType instance = ExperimentType.getInstanceByRemark(options.getExperimentType()); + return instance == ExperimentType.HAND_OVER; + } + + @Override + public Class getClazz() { + return HandoverExperiment.class; + } +} diff --git a/src/main/java/com/example/mina/client/experiment/HandoverExperiment.java b/src/main/java/com/example/mina/client/experiment/HandoverExperiment.java index 678f3e5..cb9d6fe 100644 --- a/src/main/java/com/example/mina/client/experiment/HandoverExperiment.java +++ b/src/main/java/com/example/mina/client/experiment/HandoverExperiment.java @@ -1,10 +1,13 @@ package com.example.mina.client.experiment; -import com.example.mina.client.base.*; -import org.springframework.util.CollectionUtils; - +import com.example.mina.client.base.Experiment; +import com.example.mina.client.base.MatrixClient; +import com.example.mina.client.base.MatrixCommand; +import com.example.mina.client.base.MatrixConstants; +import com.example.mina.client.base.StationPair; import java.util.ArrayList; import java.util.List; +import org.springframework.util.CollectionUtils; public class HandoverExperiment extends Experiment { -- libgit2 0.21.2