【问题标题】:How to get the server URL using a cron scheduled thread?如何使用 cron 计划线程获取服务器 URL?
【发布时间】:2015-02-01 21:31:02
【问题描述】:

我在 Java Web 应用程序中使用 @Scheduled 运行了一个线程,它需要运行它的服务器的当前 URL:

@Scheduled(cron = "0 0/5 * 1/1 * *")
public void processTask() {
   // 1) Get the server URL.
   // 2) Do some other work.
}

是否可以在不从属性文件(或其他文件)中获取 URL 的情况下执行此操作?

【问题讨论】:

  • 服务器网址是什么意思?
  • 请发表您的尝试。
  • Web 应用程序知道它的上下文,但这只是 URL 的一部分。方案 (http/https) 和权限 (hostname:port) 未知。房产可能是您最好的选择。
  • @Secondo :这个线程代码将在多个服务器上运行,并发送电子邮件,其中我需要指向发送邮件的服务器的链接。
  • 首选属性文件的另一个原因 - Web 服务器和应用程序服务器可能位于不同的机器上。除非您以某种方式向其提供该信息,否则应用程序服务器(即您的应用程序)不可能知道这一点。

标签: java multithreading http server


【解决方案1】:

有很多方法可以解决这个尝试获取主机名的问题,但是获取端口名是我不确定的(没有属性文件方法):

  1. 使用InetAddress.getLocalHost(),但这可能会返回环回。
  2. NetworkInterface.getNetworkInterfaces() 一样遍历网络接口,但这会返回所有网络接口。
  3. 由于这是一个 web 应用程序,您可以从 servletrequest.getServerName 获取主机名并将其存储在单例或任何帮助程序类中以用于您的 cron 作业。因此,您将其存储一次以备后用。
  4. 从操作系统获取主机名。我将演示这种方法。这是粗略的代码,但足以证明。

    字符串主机名 = 新的 BufferedReader (新的 InputStreamReader ( Runtime.getRuntime().exec("主机名").getInputStream())).readLine(); System.out.println("主机名:" + 主机名);

现在为该主机创建一个套接字。

Socket socket = new Socket (hostname, [some well known port that is always up as in port 22 in linux]);
InetSocketAddress inetSock = (InetSocketAddress) socket.getRemoteSocketAddress();
System.out.println ("Socket address: " + inetSock.getAddress().getHostAddress() );

在我的 Mac 上打印:

Hostname: khannas-macbook-pro.local
Socket address: 192.xxx.xx.xx

希望这会有所帮助。

【讨论】:

  • 主机名正常,但我有一些套接字异常,Socket socket = new Socket (hostname, 22);// 也试过 80 和 8080。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
相关资源
最近更新 更多