springboot整合任务调度中心(xxljob)之异常BindException
异常
启动项目后抛出异常,但是奇怪的是执行器在任务调度中心中注册成功,也能成功执行
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.4.2)
2021-02-22 15:23:15.512 INFO 12324 --- [ restartedMain] c.q.f.FrmsApplication : Starting FrmsApplication using Java 1.8.0_121 on DESKTOP-LG8O11G with PID 12324 (F:\_design\frms\target\classes started by 56509 in F:\_design\frms)
2021-02-22 15:23:15.576 INFO 12324 --- [ restartedMain] c.q.f.FrmsApplication : No active profile set, falling back to default profiles: default
2021-02-22 15:23:15.829 INFO 12324 --- [ restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable
2021-02-22 15:23:15.829 INFO 12324 --- [ restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG'
2021-02-22 15:23:17.883 INFO 12324 --- [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2021-02-22 15:23:17.902 INFO 12324 --- [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 8 ms. Found 0 JPA repository interfaces.
2021-02-22 15:23:18.519 INFO 12324 --- [ restartedMain] o.s.b.w.e.t.TomcatWebServer : Tomcat initialized with port(s): 8088 (http)
2021-02-22 15:23:18.529 INFO 12324 --- [ restartedMain] o.a.c.c.StandardService : Starting service [Tomcat]
2021-02-22 15:23:18.530 INFO 12324 --- [ restartedMain] o.a.c.c.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41]
2021-02-22 15:23:18.532 INFO 12324 --- [ restartedMain] o.a.c.c.AprLifecycleListener : Loaded Apache Tomcat Native library [1.2.25] using APR version [1.7.0].
2021-02-22 15:23:18.532 INFO 12324 --- [ restartedMain] o.a.c.c.AprLifecycleListener : APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
2021-02-22 15:23:18.532 INFO 12324 --- [ restartedMain] o.a.c.c.AprLifecycleListener : APR/OpenSSL configuration: useAprConnector [false], useOpenSSL [true]
2021-02-22 15:23:18.536 INFO 12324 --- [ restartedMain] o.a.c.c.AprLifecycleListener : OpenSSL successfully initialized [OpenSSL 1.1.1g 21 Apr 2020]
2021-02-22 15:23:18.690 INFO 12324 --- [ restartedMain] o.a.c.c.C.[.[.[/] : Initializing Spring embedded WebApplicationContext
2021-02-22 15:23:18.690 INFO 12324 --- [ restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2860 ms
2021-02-22 15:23:18.870 INFO 12324 --- [ restartedMain] o.h.j.i.u.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default]
2021-02-22 15:23:18.921 INFO 12324 --- [ restartedMain] o.h.Version : HHH000412: Hibernate ORM core version 5.4.27.Final
2021-02-22 15:23:19.056 INFO 12324 --- [ restartedMain] o.h.a.c.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final}
2021-02-22 15:23:19.165 INFO 12324 --- [ restartedMain] c.z.h.HikariDataSource : HikariPool-1 - Starting...
2021-02-22 15:23:19.250 INFO 12324 --- [ restartedMain] c.z.h.p.PoolBase : HikariPool-1 - Driver does not support get/set network timeout for connections. (oracle.jdbc.driver.T4CConnection.getNetworkTimeout()I)
2021-02-22 15:23:19.254 INFO 12324 --- [ restartedMain] c.z.h.HikariDataSource : HikariPool-1 - Start completed.
2021-02-22 15:23:19.275 INFO 12324 --- [ restartedMain] o.h.d.Dialect : HHH000400: Using dialect: org.hibernate.dialect.Oracle10gDialect
2021-02-22 15:23:19.627 INFO 12324 --- [ restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
2021-02-22 15:23:19.639 INFO 12324 --- [ restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2021-02-22 15:23:19.660 INFO 12324 --- [ restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729
2021-02-22 15:23:19.869 WARN 12324 --- [ restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
2021-02-22 15:23:20.019 INFO 12324 --- [ restartedMain] pertySourcedRequestMappingHandlerMapping : Mapped URL path [/v2/api-docs] onto method [springfox.documentation.swagger2.web.Swagger2Controller#getDocumentation(String, HttpServletRequest)]
2021-02-22 15:23:20.037 INFO 12324 --- [ restartedMain] c.q.f.u.XxlJobConfig : >>>>> xxl-job config init.
2021-02-22 15:23:20.042 INFO 12324 --- [ restartedMain] c.x.j.c.e.XxlJobExecutor : >>>>>>>>>>> xxl-job register jobhandler success, name:commandJobHandler, jobHandler:com.qiong.frms.executor.CommandJobHandler@4b4b762d
2021-02-22 15:23:20.043 INFO 12324 --- [ restartedMain] c.x.j.c.e.XxlJobExecutor : >>>>>>>>>>> xxl-job register jobhandler success, name:demo2Handler, jobHandler:com.qiong.frms.executor.Demo2Handler@7e51403b
2021-02-22 15:23:20.043 INFO 12324 --- [ restartedMain] c.x.j.c.e.XxlJobExecutor : >>>>>>>>>>> xxl-job register jobhandler success, name:httpJobHandler, jobHandler:com.qiong.frms.executor.HttpJobHandler@d010146
2021-02-22 15:23:20.043 INFO 12324 --- [ restartedMain] c.x.j.c.e.XxlJobExecutor : >>>>>>>>>>> xxl-job register jobhandler success, name:shardingJobHandler, jobHandler:com.qiong.frms.executor.ShardingJobHandler@1debf4d5
2021-02-22 15:23:20.089 INFO 12324 --- [ restartedMain] c.x.r.r.p.XxlRpcProviderFactory : >>>>>>>>>>> xxl-rpc, provider factory add service success. serviceKey = com.xxl.job.core.biz.ExecutorBiz, serviceBean = class com.xxl.job.core.biz.impl.ExecutorBizImpl
2021-02-22 15:23:20.093 INFO 12324 --- [ restartedMain] c.x.r.r.p.XxlRpcProviderFactory : >>>>>>>>>>> xxl-rpc, provider factory add service success. serviceKey = com.xxl.job.core.biz.ExecutorBiz, serviceBean = class com.xxl.job.core.biz.impl.ExecutorBizImpl
2021-02-22 15:23:20.213 INFO 12324 --- [ restartedMain] o.s.s.c.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2021-02-22 15:23:20.252 INFO 12324 --- [ restartedMain] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page: class path resource [static/index.html]
2021-02-22 15:23:20.349 INFO 12324 --- [ restartedMain] o.s.s.c.ThreadPoolTaskScheduler : Initializing ExecutorService 'taskScheduler'
2021-02-22 15:23:20.396 INFO 12324 --- [ restartedMain] o.s.b.w.e.t.TomcatWebServer : Tomcat started on port(s): 8088 (http) with context path ''
2021-02-22 15:23:20.397 INFO 12324 --- [ restartedMain] d.s.w.p.DocumentationPluginsBootstrapper : Context refreshed
2021-02-22 15:23:20.413 INFO 12324 --- [ restartedMain] d.s.w.p.DocumentationPluginsBootstrapper : Found 1 custom documentation plugin(s)
2021-02-22 15:23:20.449 INFO 12324 --- [ restartedMain] s.d.s.w.s.ApiListingReferenceScanner : Scanning for api listing references
2021-02-22 15:23:20.566 INFO 12324 --- [ restartedMain] c.q.f.FrmsApplication : Started FrmsApplication in 5.697 seconds (JVM running for 7.483)
2021-02-22 15:23:21.300 INFO 12324 --- [ Thread-21] c.x.r.r.n.Server : >>>>>>>>>>> xxl-rpc remoting server start success, nettype = com.xxl.rpc.remoting.net.impl.netty_http.server.NettyHttpServer, port = 9999
Exception in thread "Thread-25" java.net.BindException: Address already in use: bind
at sun.nio.ch.Net.bind0(Native Method)
at sun.nio.ch.Net.bind(Net.java:433)
at sun.nio.ch.Net.bind(Net.java:425)
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:134)
at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:550)
at io.netty.channel.DefaultChannelPipeline$HeadContext.bind(DefaultChannelPipeline.java:1334)
at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:506)
at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:491)
at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:973)
at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:248)
at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:356)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:164)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:472)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Thread.java:745)
2021-02-22 15:23:57.277 INFO 12324 --- [rPool-725822221] c.x.j.c.e.XxlJobExecutor : >>>>>>>>>>> xxl-job regist JobThread success, jobId:6, handler:com.qiong.frms.executor.Demo2Handler@7e51403b
Demo2:接受参数
费用管理
配置
代码部分:
Demo2Handler.java:
package com.qiong.frms.executor;
import com.qiong.frms.service.DemoService;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
import com.xxl.job.core.handler.annotation.JobHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletResponse;
/**
* @author: zhoubq
* @create: 2021-02-22 14:23
* @programs: demo2执行器
* @description: 访问地址:
*/
@JobHandler(value = "demo2Handler")
@Component
public class Demo2Handler extends IJobHandler {
@Autowired
DemoService demoService;
@Override
public ReturnT<String> execute(String param) throws Exception {
return new ReturnT<String>(HttpServletResponse.SC_OK, demoService.getData());
}
}
XxlJobConfig.java:
package com.qiong.frms.utils;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author: zhoubq
* @create: 2021-02-22 9:51
* @description: xxljob配置,如果没有这个文件,将无法识别application.properties文件中的addresses,appname,port等值
*/
@Configuration
public class XxlJobConfig {
private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.accessToken}")
private String accessToken;
@Value("${xxl.job.executor.appname}")
private String appname;
// @Value("${xxl.job.executor.address}")
// private String address;
@Value("${xxl.job.executor.ip}")
private String ip;
@Value("${xxl.job.executor.port}")
private int port;
@Value("${xxl.job.executor.logpath}")
private String logPath;
@Value("${xxl.job.executor.logretentiondays}")
private int logRetentionDays;
@Bean(initMethod = "start", destroyMethod = "destroy")
public XxlJobSpringExecutor xxlJobExecutor() {
logger.info(">>>>> xxl-job config init.");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppName(appname);
// xxlJobSpringExecutor.setAddress(address);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
配置文件部分
application.properties:
### 调度中心部署地址:http://127.0.0.1:端口号/xxl-job-admin,需要填入给任务调度中心配置的端口号
xxl.job.admin.addresses=http://127.0.0.1:8081/xxl-job-admin
### xxl-job, access token
xxl.job.accessToken=
### 执行器appname:执行器心跳注册分组依据,为空则关闭自动注册
xxl.job.executor.appname=xxl-job-executor-demo2Handler
### xxl-job executor registry-address 执行器注册:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。
#xxl.job.executor.address=http://127.0.0.1:8078/
### [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP
xxl.job.executor.ip=
### 执行器端口号:小于等于0则自动获取;默认端口为9999;
xxl.job.executor.port=9999
### 执行器运行日志文件存储磁盘路径:需要对该路径拥有读写权限;为空则使用默认路径;
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### 执行器日志文件保存天数: 过期日志自动清理;
xxl.job.executor.logretentiondays=30
配置完成后先启动XxlJob再启动项目:注册成功信息
[springfox.documentation.swagger2.web.Swagger2Controller#getDocumentation(String, HttpServletRequest)]
2021-02-23 10:38:49.609 INFO 12328 --- [ restartedMain] c.q.f.u.XxlJobConfig : >>>>> xxl-job config init.
2021-02-23 10:38:49.614 INFO 12328 --- [ restartedMain] c.x.j.c.e.XxlJobExecutor : >>>>>>>>>>> xxl-job register jobhandler success, name:commandJobHandler, jobHandler:com.qiong.frms.executor.CommandJobHandler@fb5ac58
2021-02-23 10:38:49.614 INFO 12328 --- [ restartedMain] c.x.j.c.e.XxlJobExecutor : >>>>>>>>>>> xxl-job register jobhandler success, name:demo2Handler, jobHandler:com.qiong.frms.executor.Demo2Handler@254b152d
2021-02-23 10:38:49.614 INFO 12328 --- [ restartedMain] c.x.j.c.e.XxlJobExecutor : >>>>>>>>>>> xxl-job register jobhandler success, name:httpJobHandler, jobHandler:com.qiong.frms.executor.HttpJobHandler@5ec2cc18
2021-02-23 10:38:49.614 INFO 12328 --- [ restartedMain] c.x.j.c.e.XxlJobExecutor : >>>>>>>>>>> xxl-job register jobhandler success, name:shardingJobHandler, jobHandler:com.qiong.frms.executor.ShardingJobHandler@7cb76cf4
2021-02-23 10:38:49.644 INFO 12328 --- [ restartedMain] c.x.r.r.p.XxlRpcProviderFactory : >>>>>>>>>>> xxl-rpc, provider factory add service success. serviceKey = com.xxl.job.core.biz.ExecutorBiz, serviceBean = class com.xxl.job.core.biz.impl.ExecutorBizImpl
2021-02-23 10:38:49.815 INFO 12328 --- [ restartedMain] o.s.s.c.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2021-02-23 10:38:49.867 INFO 12328 --- [ restartedMain] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page: class path resource [static/index.html]
2021-02-23 10:38:49.989 INFO 12328 --- [ restartedMain] o.s.s.c.ThreadPoolTaskScheduler : Initializing ExecutorService 'taskScheduler'
2021-02-23 10:38:50.039 INFO 12328 --- [ restartedMain] o.s.b.w.e.t.TomcatWebServer : Tomcat started on port(s): 8088 (http) with context path ''
2021-02-23 10:38:50.041 INFO 12328 --- [ restartedMain] d.s.w.p.DocumentationPluginsBootstrapper : Context refreshed
2021-02-23 10:38:50.059 INFO 12328 --- [ restartedMain] d.s.w.p.DocumentationPluginsBootstrapper : Found 1 custom documentation plugin(s)
2021-02-23 10:38:50.099 INFO 12328 --- [ restartedMain] s.d.s.w.s.ApiListingReferenceScanner : Scanning for api listing references
2021-02-23 10:38:50.280 INFO 12328 --- [ restartedMain] c.q.FrmsApplication : Started FrmsApplication in 5.795 seconds (JVM running for 8.22)
2021-02-23 10:38:50.968 INFO 12328 --- [ Thread-22] c.x.r.r.n.Server : >>>>>>>>>>> xxl-rpc remoting server start success, nettype = com.xxl.rpc.remoting.net.impl.netty_http.server.NettyHttpServer, port = 9999
显示在任务调度中心注册成功——启动项目后数据表中会有注册信息
访问地址(配置文件中的xxl.job.admin.addresses):
http://127.0.0.1:8081/xxl-job-admin
在任务调度中心新增执行器
添加成功后会出现OnLine 机器地址
添加任务-JobHandler必须与你项目中的注解中一致
如@JobHandler(value = “demo2Handler”)
Cron指定00
选择任务执行一次,执行成功:
2021-02-23 09:39:07.342 INFO 13500 --- [Pool-1077181959] c.x.j.c.e.XxlJobExecutor : >>>>>>>>>>> xxl-job regist JobThread success, jobId:7, handler:com.qiong.frms.executor.Demo2Handler@abaa59
任务调度成功
2021-02-23 09:40:40.367 INFO 13500 --- [ Thread-29] c.x.j.c.t.JobThread : >>>>>>>>>>> xxl-job JobThread stoped, hashCode:Thread[Thread-29,10,main]
解决
XxlJobConfig文件中xxlJobExecutor方法注解里方法值删除
//原注解:
@Bean(initMethod = "start", destroyMethod = "destroy")
public XxlJobSpringExecutor xxlJobExecutor() {
...
}
//修改后注解
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
...
}
猜想:是因为没有写start和destroy方法,将注解里的值删掉即可