【问题标题】:Quartz setup failure in Azure App ServiceAzure 应用服务中的 Quartz 设置失败
【发布时间】:2020-05-11 17:59:04
【问题描述】:

我的 Azure 应用服务已启动并正在运行。部署了 Spring Boot 应用程序。当我尝试在 Spring Boot 应用程序中添加 Quartz 调度程序设置时,它在本地运行良好。但是当我们迁移到 Azure 应用程序时,调度程序设置未通过以下消息启动。

基本上是找主机名,在Azure App服务中能找到主机名吗?解析主机名需要任何配置吗?

2020-05-08 11:35:57.155 ERROR 123 --- [main] org.quartz.impl.StdSchedulerFactory      : Couldn't generate instance Id!
org.quartz.SchedulerException: Couldn't get host name!at org.quartz.simpl.SimpleInstanceIdGenerator.generateInstanceId(SimpleInstanceIdGenerator.java:36)at org.quartz.impl.StdSchedulerFactory.instantiate(StdSchedulerFactory.java:1247)at 

请注意: 在 Quartz 中注释属性将设置默认值,但我们需要使用 Auto 方法 org.quartz.scheduler.instanceId=AUTO

【问题讨论】:

    标签: azure azure-web-app-service quartz-scheduler


    【解决方案1】:

    我不确定您是否可以获得运行代码的应用服务的主机名,但您可以使用 spring.quartz.properties.org.quartz.scheduler.instanceIdGenerator.class=CustomInstanceIDGenerator.class 中所述的 this blog post,其中 CustomInstnaceIDGenerator 是

    public class CustomInsntanceIdGenerator implements InstanceIdGenerator {
    
        @Override
        public String generateInstanceId() throws SchedulerException {
            try {
                return UUID.randomUUID().toString();
            } catech (Exception ex) {
                throw new SchedulerException("Couldn't genereate UUID", ex);
            }
        }
    }
    

    这将使您不依赖于主机名。

    编辑:试一试

    private String getComputerName()
    {
        Map<String, String> env = System.getenv();
        if (env.containsKey("COMPUTERNAME"))
            return env.get("COMPUTERNAME");
        else if (env.containsKey("HOSTNAME"))
            return env.get("HOSTNAME");
        else
            return "Unknown Computer";
    }
    

    【讨论】:

      【解决方案2】:

      当您使用spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO 应用程序属性时会发生这种情况。为了克服这个问题,你必须在你的主机文件中映射127.0.0.1 &lt;machine ip&gt;,否则它会抛出java.net.UnknownHostException: ip-1x-xx-xx-2xx: Temporary failure in name resolution,或者如果你想从系统属性中给出一些独特的值,你必须改变 spring.quartz.properties.org.quartz.scheduler.instanceId=SYS_PROP 根据文档。

      org.quartz.scheduler.instanceId

      可以是任何字符串,但对于所有工作的调度程序必须是唯一的 它们是集群中相同的“逻辑”调度程序。您可以使用 如果您希望生成 Id,则将值“AUTO”作为 instanceId 为你。或值“SYS_PROP”,如果您希望该值来自 系统属性“org.quartz.scheduler.instanceId”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-19
        • 2020-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-08
        • 2019-06-22
        • 2017-08-28
        相关资源
        最近更新 更多