Java Heroku应用程序即使在收到流量且未醒来时也处于休眠状态

Java Heroku应用程序即使在收到流量且未醒来时也处于休眠状态,java,heroku,telegram-bot,Java,Heroku,Telegram Bot,我有一个应用程序(电报机器人实际上)部署到heroku使用网络dynos 我在heroku官方网站上找到了这些信息: 如果一个应用程序有一个免费的网络dyno,并且该dyno在30分钟内没有收到任何网络流量,它将休眠 如果睡眠中的网络动态用户接收到网络流量,它将在短时间延迟后再次激活(假设您的帐户有可用的动态用户时间) 但这种情况对我不起作用。我的应用程序只工作25-35分钟,进入“睡眠模式”,并且(!)不想醒来。只有heroku restart有帮助 我是这样测试的: 启动应用程序 保持每5

我有一个应用程序(电报机器人实际上)部署到heroku使用网络dynos

我在heroku官方网站上找到了这些信息:

如果一个应用程序有一个免费的网络dyno,并且该dyno在30分钟内没有收到任何网络流量,它将休眠

如果睡眠中的网络动态用户接收到网络流量,它将在短时间延迟后再次激活(假设您的帐户有可用的动态用户时间)

但这种情况对我不起作用。我的应用程序只工作25-35分钟,进入“睡眠模式”,并且(!)不想醒来。只有
heroku restart
有帮助

我是这样测试的:

  • 启动应用程序
  • 保持每5分钟向我的电报机器人发送一次消息(以便收到流量)
  • 应用程序正在运行并保持响应
  • 我陷入了应用程序停止响应的间隙
  • 继续发送消息,但应用程序仍处于静默状态
之后,我来到我的Heroku仪表板,注意到应用程序处于“睡眠模式”(带有zzz图标)。好的,让我们检查日志
Heroku日志——源应用程序

我可以在那里看到什么?几乎没有。没有错误,没有崩溃,成功记录了最后一条消息。另外,我的应用程序正在使用MongoDB,最后一条日志消息是:

2020-07-03T14:49:20 [extShutdownHook] org.mongodb.driver.connection: Closed connection [
connectionId{localValue:4, serverValue:129573}] to botcluster-shard-00-01-aeqgg.mongodb.net:27017 because the pool has been closed.
因此,在应用程序停止之前,我与数据库的连接已关闭

此外,我决定写一个服务类,每5分钟ping一次谷歌的网页

public class PingTaskService {

    @Value("${pingtask.url}")
    private String url;

    @Scheduled(fixedRateString = "${pingtask.period}")
    public void keepAlive() {
        try {
            URL url = new URL(getUrl());
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.connect();
            connection.disconnect();
            log.info("Ping {}, OK: response code {}", url.getHost(), connection.getResponseCode());
        } catch (IOException e) {
            log.error("Ping FAILED");
        }
    }
}
日志:

最后一次ping和休眠之间间隔3分钟

<> P>我认为Helku并不认为以上所有的行为都是Web流量。 我该怎么做才能让我的应用程序保持活力?

我找到了解决方案

我有两个选择:

  • 从LongPolling(getUpdates方法)切换到WebHook并配置控制器
  • 重写我的ping任务服务
  • 我选择了第二个选项,因为我不想重写我的机器人业务逻辑

    我开始为heroku提供的应用程序ping url,而不是ping google。
    https://example.herokuapp.com/

    现在我的应用程序没有进入睡眠模式,因为每10分钟我都会“从我的应用程序向我的应用程序”发送请求.

    你使用的是哪种类型的dyno?web、worker还是一次性!这是免费dyno吗?就像我在帖子中说的:免费web dyno。我想这是因为我使用的是LongPolling机器人而不是WebHook机器人。LongPolling应该使用worker dyno,WebHook应该使用web dyno。我会试试。你找到这样的“解决方案”很好.但不幸的是,这是一种非常低效的方法,尤其是如果你使用免费的Heroku dynos。当你每10分钟ping一次你的应用程序时,你会消耗大量的免费dyno时间,最终,你会浪费掉所有的时间…请查看此()因此,如果你想在免费计划的范围内,我恳切地建议你切换到长池。
    2020-07-03T14:46:47 [scheduling-1] ru.miroha.service.PingTaskService: Ping www.google.com, OK: response code 200