# 配置 每一个组件基于框架开发的时候,配置类中的可配置参数应当都**会或多或少的存在差异**。但是在所有的组件的配置类中的可配置项**存在一些通用参数**,本章节将会对这些通用的参数进行介绍。 >[info] 组件自身增加的额外参数请参照对应组件的相关文档。 >[danger] 核心`1.8.0`之后已经不再建议使用繁杂且不够灵活的代码配置,推荐使用文件配置并配合注解配置。 * 注册监听器 ```java // 注册监听器 // void registerListeners(Object... listeners); // void registerListeners(Class<?>... listeners); //注册初始化监听器 // void registerInitListeners(InitListener... listeners); // 使用包扫描的方式扫描并加载初始化监听器 // scannerInitListener(String packageName); // !! 此条注释以上的配置均在核心版本 1.3-BETA 之后移除。!! //使用包扫描的方式扫描并加载监听器 scannerListener(String packageName); ``` >[warning] 以上的监听器注册方法全部都可以不进行配置,且推荐不进行配置。 >[info] 假如你没有进行配置,会默认对你的启动类所在的包进行扫描。 >[success] 以下的配置,如果没有特殊说明的话也都**不是必要的**。 * **需要进行的包扫描路径。默认为启动器及其以下包路径** ```java scanner(String packageName); setScannerPackage(String... packages); ``` * **~~配置酷Q端的IP地址,默认为127.0.0.1~~** >[danger] 核心`1.8.0`后标注过时并弃用,请参考下文 **账号注册** ```java setIp(String ip); ``` * **配置编码格式,默认为UTF-8。** ```java //配置编码格式,如果不配置默认为UTF-8格式 setEncode(String encode); ``` * **配置酷Q根路径** ```java //配置酷Q的根路径地址,建议使用绝对路径,假如不配置则会导致部分功能无法使用。例如扩展image对象。 setCqPath(String cqPath); ``` * **~~配置机器人QQ号~~** >[danger] 核心`1.8.0`后标注过时并弃用,请参考下文 **账号注册** ```java //配置机器人的QQ号。 //如果组件无法获取QQ自身信息,则必须配置,否则@Filter注解将无法正常获取at信息 //组件是否支持自动获取请参照对应组件文档。 setLocalQQCode(String localQQCode); ``` * **~~配置机器人昵称~~** >[danger] 核心`1.8.0`后标注过时并弃用,请参考下文 **账号注册** ```java //配置机器人的QQ昵称 //注意事项同上,是否需要配置具体请参照对应组件功能 setLocalQQNick(String localQQNick); ``` * **配置自定义依赖获取函数** > `DependGetter`接口的介绍将会在`高级内容-依赖注入`章节 ```java // 通过对象实例注册额外的依赖获取 setDependGetter(DependGetter dependGetter); // 通过全类路径加载来配置额外的依赖获取 setDependGetter(String packPath) throws ... ; ``` * **配置自定义线程池参数(显示的是字段,配置方法为对应的setter方法,值为默认情况下的值)** ```java /** 如果这个不是null,则优先使用此配置 */ private BaseLocalThreadPool.PoolConfig poolConfig = null; /** 核心池的大小。默认为null,当为null的时候,默认通过cpu核心数计算最佳线程数量 */ private Integer corePoolSize; /** 线程池最大线程数,这个参数也是一个非常重要的参数,它表示在线程池中最多能创建多少个线程; * 默认为corePoolSize的2倍 */ private Integer maximumPoolSize; /** * 线程池初始化的阻塞系数,用来决定最终的线程池线程数量。 * 默认为0.2, 即认为你的每个监听器在执行的时候,有20%的时间是处于线程阻塞状态。 * @see CoreSystem#getBestPoolSize(double) * @see <a href='https://www.cnblogs.com/jpfss/p/11016180.html'>参考文章</a> */ private Double blockingFactor = 0.2; /** * 表示线程没有任务执行时最多保持多久时间会终止。 * 默认情况下,只有当线程池中的线程数大于corePoolSize时,keepAliveTime才会起作用, * 直到线程池中的线程数不大于corePoolSize,即当线程池中的线程数大于corePoolSize时, * 如果一个线程空闲的时间达到keepAliveTime,则会终止,直到线程池中的线程数不超过corePoolSize。 * 但是如果调用了allowCoreThreadTimeOut(boolean)方法,在线程池中的线程数不大于corePoolSize时,keepAliveTime参数也会起作用, * 直到线程池中的线程数为0; */ private Long keepAliveTime = 5L; /** * unit:参数keepAliveTime的时间单位,有7种取值,在TimeUnit类中有7种静态属性: * TimeUnit.DAYS; //天 * TimeUnit.HOURS; //小时 * TimeUnit.MINUTES; //分钟 * TimeUnit.SECONDS; //秒 * TimeUnit.MILLISECONDS; //毫秒 * TimeUnit.MICROSECONDS; //微妙 * TimeUnit.NANOSECONDS; //纳秒 */ private TimeUnit timeUnit = TimeUnit.MILLISECONDS; /** * 使用类路径进行实例化(文件配置的情况下) * 一个阻塞队列,用来存储等待执行的任务,这个参数的选择也很重要, * 会对线程池的运行过程产生重大影响,一般来说,这里的阻塞队列有以下几种选择: * ArrayBlockingQueue; * LinkedBlockingQueue; * SynchronousQueue; * ArrayBlockingQueue和PriorityBlockingQueue使用较少,一般使用LinkedBlockingQueue和Synchronous。 * 线程池的排队策略与BlockingQueue有关。 */ private String workQueueFrom = "java.util.concurrent.LinkedBlockingQueue"; /** * 当此参数为null的时候,通过workQueueFrom参数来反射获取实例 */ private BlockingQueue<Runnable> workQueue = null; /** * 线程工厂 */ private ThreadFactory defaultThreadFactory = Thread::new; ``` ## **日志等级** ```java /** 设置日志等级,默认为info级别 */ setLogLevel(LogLevel level); ``` ## **信息语言** >[success] 核心`1.7.0`更新内容 ```java /** 设置使用语言。默认为系统当前使用语言。 */ setLanguage(Locale language); ``` ## **账号注册** >[success] 核心`1.8.0`增加,并取代原来的`IP`、`localQQCode`、`localQQNick`等参数。 ```java /** * 注册一个机器人的信息。 * * @param botCode bot账号 * @param path 上报地址,为一个完整的请求路径,例如:http://127.0.0.1:12345 */ public void registerBot(String botCode, String path); /** * 注册一个机器人的信息。 一般来讲最终拼接为:http://{ip}:{port}{path} * @param botCode bot账号 * @param ip 上报地址的ip * @param port 上报地址的端口 * @param path 如果存在,上报地址的路径 */ public void registerBot(String botCode, String ip, int port, String path); /** * 仅仅注册一个路径信息,需要是一个完整路径,例如一个http路径或者一个ws的连接路径。 * 在启动后需要通过此路径来验证或者连接。 * 一般来说直接使用这个就行了。 * * @param path 上报路径 */ public void registerBot(String path); /** * 仅注册一个路径信息,信息分为ip、端口、一个可能存在的额外路径。 * 开发者如果需要实现对于ip、端口、额外路径的转化规则,尝试重写{@link #toHttpPath(String, int, String)}方法。默认情况下为转化为http协议路径。 * @param ip ip地址 * @param port 端口 * @param path nullable */ public void registerBot(String ip, int port, String path); /** * 注册一个机器人的信息。与普通的registerBot不同,此处注册的机器人会直接覆盖当前的默认机器人信息 * * @param botCode bot账号 * @param path 上报地址,为一个完整的请求路径 */ public void registerBotAsDefault(String botCode, String path); /** * 注册一个机器人的信息。 * @param botCode bot账号 * @param ip 上报地址的ip * @param port 上报地址的端口 * @param path 如果存在,上报地址的路径 */ public void registerBotAsDefault(String botCode, String ip, int port, String path); /** * 仅仅注册一个路径信息,需要是一个完整路径,例如一个http路径或者一个ws的连接路径。 * 在启动后需要通过此路径来验证或者连接 * * @param path 上报路径 */ public void registerBotAsDefault(String path); /** * <pre> 仅注册一个路径信息,信息分为ip、端口、一个可能存在的额外路径。 * <pre> 开发者如果需要实现对于ip、端口、额外路径的转化规则,尝试重写{@link #toHttpPath(String, int, String)}方法。默认情况下为转化为http协议路径。 * @param ip ip地址 * @param port 端口 * @param path nullable */ public void registerBotAsDefault(String ip, int port, String path); ``` 由上述方法可见,主要存在两个注册方法:`registerBot` 和 `registerBotAsDefault`。 唯一的区别就是是否是**默认账号**的区别了。那默认账号是什么呢?在以前的启动器中,总会有一个`after`方法,`after`方法中存在一个`MsgSender`送信器,这个送信器并不属于任何监听函数,因此所谓**默认账号**就是这个公共送信器的默认使用账号了。 如果不手动配置默认账号的话,在注册时候会默认将**第一个**注册的账号设置为默认账号。 ## **版本检测** > 核心`1.8.1`后增加 ```java /** 是否启用版本检测*/ setCheckVersion(boolean enable); ``` ## **配置监听函数返回值选择器** >[info] 此类型为枚举类型,具体含义可以查阅枚举章节 ```java // 配置监听函数的返回值选择器。 // 在触发监听事件的时候,你很有可能会有多个监听函数被执行,而所有的监听函数都会有一个自己的监听返回值,即监听相应(具体可查阅文档相关章节)。 // 但是一般来讲,以HTTP接口为例,其仅需要一个相应参数(如果需要的话),那么这种情况下就需要配置一个选择器来决定,多个监听相应中,我应该选择哪一个作为HTTP的响应值。 public void setResultSelectType(ResultSelectType resultSelectType) ; ``` <br> ## **账号注册验证** ```java // 如果为true,监听到消息后将会验证当前上报消息的bot账号。如果此账号为未注册账号,将不会处理此监听消息。默认为true public void setBotCheck(Boolean botCheck); ```