Workspace接口是对工作空间的抽象,继承自WorkObjectPool

WorkObjectPool:工作空间对象池

/**
 * 工作空间对象池
 */
public interface WorkObjectPool {
    
    /**
     * 获取对象
     */
    <T> T get(Class<T> type);
    
    void close();
}

 

WorkObjectPool:管理一组对象

设计器的远程设计就是通过上述三个接口来实现的。

示例

把对象注册到默认的WorkObjectPool中

在activator中注册:

public class DemoActivator extends Activator implements Prepare {
       
    @Override
    public void start() {
   		//模块启动逻辑
    }
    
    @Override
    public void stop() {
    	//模块关闭逻辑
    }
    
    @Override
    public void prepare() {
        //注册对象到默认WorkObjectPool
        addMutable(WorkspaceKey.RPC,
            WorkPRCRegister.wrap(WorkRPCType.Local, WorkResource.class, FineWorkResource.getInstance()),
            WorkPRCRegister.wrap(WorkspaceHeartbeat.class, new FineWorkspaceHeartbeat()),
            WorkPRCRegister.wrap(FileAssistUtilsOperator.class, new FileAssistUtils())
        
        );
    }
}
/**
 * 工作空间对象池中的对象分类
 */
public enum WorkRPCType {
    
    /**
     * 简单对象,即响应本地的和响应远程的对象是一样的
     */
    Simple,
    /**
     * 只响应本地的请求,如果没有对应的Server实现注册进来的话,就不能响应远程消息
     */
    Local,
    /**
     * 只响应远程的请求,多用于权限控制
     */
    Server,
}
 
/**
* WorkObject注册
*/
public class WorkPRCRegister<T> {
    
    private final Class<T> clazz;
    
    private final WorkRPCType type;
    
    private final T object;
    
    public static <T> WorkPRCRegister<T> wrap(Class<T> clazz, T object) {
        
        return new WorkPRCRegister<T>(clazz, WorkRPCType.Simple, object);
    }
    
    public static <T> WorkPRCRegister<T> wrap(WorkRPCType type, Class<T> clazz, T object) {
        
        return new WorkPRCRegister<T>(clazz, type, object);
    }
    
    private WorkPRCRegister(Class<T> clazz, WorkRPCType type, T object) {
        
        this.clazz = clazz;
        this.type = type;
        this.object = object;
    }
}

WorkRPCType用来描述一个对象的作用范围:

默认为Simple。如果需要根据本机/远程连接做权限校验的话,则需要分别注册一个Local的实现和一个Server的实现。

从当前工作空间的WorkObjectPool中获取对象

WorkContext.getCurrent().get(CommonOperator.class);

WorkContext是整个Workspace的入口,可以从中获取当前的Workspace实例,进而访问当前对象池(如果当前是远程环境,则拿到的是RPC代理对象)

连接某台服务器,获取WorkspaceClient实例

WorkspaceConnectionInfo connectionInfo = new WorkspaceConnectionInfo(url,userName,password,certPath,certSecretKey);
WorkspaceClient client = WorkContext.getConnector().connect(connectionInfo);

服务器获取当前请求的连接信息,用于权限判断

//获取当前线程对应的远程连接信息
WorkspaceConnection connection = WorkspaceServerContext.currentConnection()

注册自定义序列化器

WorkObjectPool相关的序列化使用可扩展的序列化接口中的SerializerSummary实现,SerializerSummary是一个可共扩展的序列化工具,扩展方式如下:

public class DemoActivator extends Activator implements Prepare {
       
    @Override
    public void start() {
   		//模块启动逻辑
    }
    
    @Override
    public void stop() {
    	//模块关闭逻辑
    }
    
    @Override
    public void prepare() {
       //注册通用序列化器
		addMutable(CommonSerializerKey.KEY,(new AbstractCommonSerializer<Demo2>() {
            
            @Override
            public void serialize(Demo2 obj, OutputStream out) throws Exception {
                
                DataOutputStream dataOut = new DataOutputStream(out);
                dataOut.writeInt(obj.i);
            }
            
            @Override
            public Demo2 deserialize(InputStream in) throws Exception {
                
                DataInputStream dataIn = new DataInputStream(in);
                int i = dataIn.readInt();
                return new Demo2(i);
            }
            
            @Override
            public boolean accept(Object o) {
                
                return o instanceof Demo2;
            }
        });
    }
}

插件动态注册对象到WorkObjectPool

插件接口:WorkRPCProvider

 

自定义WorkspaceChannel来替换默认的WorkspaceClient二进制数据传输方式接口

todo