ZiheYe 2024-03-28 16:51 采纳率: 66.7%
浏览 153
已结题

springboot整合xxl-job占用额外的端口

springBoot整合xxl-job的时候,配置文件xxl.job.executor.port指定了一个端口,比如9999,为什么这个端口会被占用呢?xxl-job的版本是2.3.0

  • 写回答

3条回答 默认 最新

  • 专家-皆知 2024-03-28 16:51
    关注

    引自免费微信小程序:皆我百晓生

    在Spring Boot中,当我们尝试将XXL-JOB(也称为XxlJob)与其他依赖项结合在一起时,可能会遇到"Spring Boot Integrates XXL-JOB uses port 9999"的问题。这是因为Spring Boot默认会在8080端口上启动,并且当它发现无法从外部获取指定端口号的应用实例时,它会创建一个新的进程并将其连接到指定的端口号。在这个例子中,xxl-job被添加到了Spring Boot应用程序的配置类application.properties中的job-executor.port属性中,配置了它的工作进程运行的端口号。

    理解原因:

    1. 端口号分配规则: Spring Boot应用默认会在8080端口上启动新的进程,这意味着只有通过特定的端口号(例如8080)才能访问该应用实例。这与HTTP协议所规定的端口号80服务默认被开放给Web应用程序相同。
    2. Spring Boot集群模式: 如果Spring Boot项目中有多个XxlJob配置文件并部署在同一台服务器上,那么由于这些文件都指向同一个Spring Boot容器实例,即通过application.properties配置文件注册的工作进程列表,那么Spring Boot将在同一台机器上同时运行所有XxlJob进程,使得它们共享同一台服务器上的资源。
    3. XxlJob自身的属性设置: XxlJob本身也可以设置其运行时使用的端口号,这允许它选择不同的外部API端口来启动实例。然而,如果没有明确配置这个端口号,Spring Boot默认就会使用9999端口号,这是为了保持与标准HTTP服务端口80的相似性。
    4. 外部应用与Spring Boot集成时限制: 如果应用程序直接向Spring Boot提供的接口发送请求,而不仅仅是直接调用Spring Boot方法,那么其他依赖于Spring Boot的应用程序或库可能需要知道哪个端口用于XxlJob的执行。

    解决方案:

    要解决这个问题,我们可以通过以下几个步骤实现:

    1. 修改默认端口: 在application.properties文件中,删除或替换job-executor.port属性,将原值改为一个独立的端口号。例如:

      job-executor.port=9999
      
    2. 手动定义XxlJob的端口号: 如果XxlJob具有单独的端口号定义,可以考虑创建一个新的配置类或者方法来控制它的运行方式,如XxlJobConfigurer。在这些配置类/方法中,你可以定义一个新的端口号,例如:

      @Configuration
      public class XxlJobConfigurer {
          @Autowired
          private JobRegistry registry;
      
          // ...
      
          public void configureJobExecutionListeners(JobExecutionListener<?>... listeners) {
              for (JobExecutionListener<?> listener : listeners) {
                  if (listener.getClass().equals(XxlJob.class)) {
                      String executorPort = listener.getExecutorPort();
                      registry.register(executorPort, listener);
                      break;
                  }
              }
          }
      
          // ...
      }
      
    3. 设置XxlJob属性: 使用@Bean注解将XxlJob配置注入到所需的Spring组件,例如:

      @Component
      public class XxlJob {
      
          // ...
      
          public void execute(String command) throws Exception {
              SpringApplication.run(XxlJob.class, args);
          }
      }
      
    4. 测试和应用新端口: 在运行应用程序之前,确保已正确地更新application.properties文件的job-executor.port属性为新的端口号,并重启Spring Boot应用程序以反映更改。

    5. 验证接口通信: 如果XxlJob通过调用Spring Boot方法或其他Spring组件间接调用外部API,则应确保这两个调用之间没有未处理的边界条件,否则可能导致应用程序无法正常工作。

    请注意,以上示例仅适用于XxlJob与Spring Boot其他依赖项的集成,对跨Spring Boot应用程序或微服务集群的集成可能需要进行更复杂的配置和协调。对于具体的应用场景,可能需要根据项目需求和Spring Boot的特性和组件架构进行调整。例如,在分布式系统中,可能需要对XxlJob部署到多个节点,每个节点都监听指定的端口号,以便正确调度任务。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月19日
  • 已采纳回答 3月11日
  • 创建了问题 3月28日