【仅供内部供应商使用,不提供对外解答和培训】

Page tree

【仅供内部供应商使用,不提供对外解答和培训】

Skip to end of metadata
Go to start of metadata

 

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

WorkObjectPool:工作空间对象池

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

 

WorkObjectPool:管理一组对象

  • 从默认的WorkObjectPool中获取的对象就是注册进来的对象
  • 可以通过WorkspaceConnector接口连接一台包含了fine-core包的服务器,生成一个WorkspaceClient接口,表示连接到某台服务器的客户端

    WorkspaceClient
    public interface WorkspaceClient {
    
        /**
         * 获取对象池
         */
        WorkObjectPool getPool();
    
        /**
         * 获取连接
         */
        WorkspaceConnection getConnection();
    
        /**
         * 关闭连接
         */
        void close();
    }
    WorkspaceConnector
    /**
     * 工作目录连接器
     */
    public interface WorkspaceConnector {
        /**
         * 测试连接
         */
        boolean testConnection(WorkspaceConnectionInfo connection) throws Exception;
        /**
         * 连接并获取client
         */
        WorkspaceClient connect(WorkspaceConnectionInfo connection) throws Exception;
    
    }
  • 通过WorkspaceClient这个客户端可以拿到“服务器的WorkObjectPool”,即从这里拿到的对象,实际上是在服务器上执行的,也就是一个RPC代理的对象池

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

示例

把对象注册到默认的WorkObjectPool中

在activator中注册:

把对象注册到默认WorkObjectPool中
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())
        
        );
    }
}
WorkPRCRegister与WorkRPCType
/**
 * 工作空间对象池中的对象分类
 */
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:只能响应客户端的请求

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

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

获取默认的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);

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

获取Connection
//获取当前线程对应的远程连接信息
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

 

  • No labels