我是Wicket的新手,希望使用某种维护管理页面从内部维护一个Web应用程序,以便运行清理,数据库更新,恢复等。由于我计划使用Hibernate或类似的数据绑定,我想从内部触发应用程序的完全重启,而不是让所有能够运行这些操作的人都附带Tomcat管理员密码。
据我所知,似乎没有一种简单的方法可以在没有管理员密码的情况下触发Java Web应用程序的真正重启?但是,由于许多Java Web应用程序在其管理面板中具有此类重新启动功能,因此我认为应该可以在特定的servlet容器或某些Web框架中触发重新启动。他们不知何故必须做到这一点? (或者他们不是真的从头开始重新启动,而只是重新初始化而没有干净的重启?)
我找不到任何关于Wicket或Tomcat能够通过关闭触发并从应用程序重新启动的内容,尽管Wicket中有一些内部方法可能能够做到这一点? (可以公开访问,但JavaDoc建议不要使用它,因为它们仅供内部使用)
从安全的角度来看,我真的不明白为什么应用程序不能从自己的代码请求重启。
可以这样做吗?如果可以,我在申请表中需要做些什么才能重新启动?
编辑:只是为了让我的问题更精确:用户和应用都不应该有任何可用于访问Tomcat管理器界面的密码。我正在考虑调用一些方法或设置一些标志以使servlet容器被触发以重新启动该特定应用程序而无需授权。我的想法是,由于应用程序在servlet容器中运行,它应该有一些方法可以关闭并重新启动。如果这对于Java应用服务器来说通常是不可能的,那么通过调用底层框架(在这种情况下是Wicket)来结束所有正在运行的线程,尽可能地清理并重新启动,可能有一些方法可以在应用程序级别上执行此操作。使用框架的应用程序;类似于应用程序堆栈的“软重启”。
答案 0 :(得分:2)
您的应用使用Wicket与您的问题大多无关。它是一个使用Wicket框架的java Web应用程序。像这样,您正在寻找如何使用Tomcat容器重新启动Web应用程序。如果您选择其他Web应用程序容器(jetty等),则需要更改该过程。
您可以点击此网址启动应用:http://localhost:8080/manager/start?path=/myapp
和http://localhost:8080/manager/stop?path=/myapp
以停止您的应用。将/ myapp更改为您的应用程序上下文,并且您已启动/停止控制。
然后,您可以在代码内部处理密码问题。
根据您的澄清,您可以查看this tomcat documentation并使用JMX。但是,即使JMX也受密码保护。从您的网络应用程序获取容器控件没有标准。
答案 1 :(得分:1)
我正在考虑是否/其他网络框架真正支持这一点。我认为Jim正在指向解决方案的正确级别。无论使用何种框架,Web容器都应允许重新启动包含的Web应用程序。 Tomcat将要求管理器应用程序可用。看来(从我的谷歌搜索)Jetty通过JMX MBeans公开了这个功能。因此,重启功能可能无法在容器之间移植。
为了使这个可移植,在任何框架中,我认为你必须隔离重启所需的东西。如果是hibernate重新初始化会话工厂。如果它是弹簧配置,这肯定会更具侵入性,但替换或重新配置bean似乎还有很长的路要走。如果它是i18n或标记资源检票口我认为可以帮助解决这个问题。
答案 2 :(得分:0)
我也鼓励你看看JMX。您可以关闭JMX的身份验证,在这种情况下,请确保无法从Internet访问JMX端口(过滤基于主机的防火墙上的端口,或仅将其绑定到本地IP地址)。 JMX旨在标准化Java EE世界中的应用程序,容器的远程监视和控制,因此它或多或少地提供了您正在寻找的基础结构。
或者使用另一个Web容器(最好是嵌入式容器)并处理来自java代码的容器重启。