Java 每分钟读取一次.properties文件
我做一件小事。我的任务是从Java 每分钟读取一次.properties文件,java,servlets,properties,Java,Servlets,Properties,我做一件小事。我的任务是从servlet中的.properties文件中读取消息,然后将其传递给jsp。我做到了。 现在我需要每分钟阅读.properties文件。 我不知道怎么做。 有人能帮我吗 这是我的课程: 消息控制器 import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.
servlet
中的.properties文件中读取消息,然后将其传递给jsp
。我做到了。
现在我需要每分钟阅读.properties
文件。
我不知道怎么做。
有人能帮我吗
这是我的课程:
消息控制器
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class MessageController extends HttpServlet {
private Messenger messenger;
@Override
public void init() throws ServletException {
messenger = new Messenger();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("message", messenger.getMessage("POST", request.getParameter("username"), getServletContext()));
request.getRequestDispatcher("/result.jsp").forward(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
getServletContext().getAttribute("abc");
request.setAttribute("message", messenger.getMessage("GET", request.getParameter("username"), getServletContext()));
request.getRequestDispatcher("/result.jsp").forward(request, response);
}
}
Messeger(读取属性文件和表单消息):
为此,您可以使用ServletContextListener和Timer。 只需创建侦听器:
public class PropertiesListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
Timer time = new Timer();
TimerTask readPropertiesTask = new TimerTask() {
@Override
public void run() {
//read from properties
}
};
time.schedule(readPropertiesTask, 0, 60000);
}
@Override
public void contextDestroyed(ServletContextEvent sce) {}
}
并在web.xml中注册
<listener>
<listener-class>PropertiesListener</listener-class>
</listener>
属性侦听器
如果您使用spring,您可以使用一个简单的触发器bean,它可以调用一个处理读取porperties文件的方法。如果愿意,您可以在java中使用来管理为您加载属性文件
<!-- Class that handles file reading -->
<bean id="propertyFileReader" class="org.myCompany.PropertyFileReader">
</bean>
<!-- Quartz job beans -->
<bean id="propertyFileReaderJobDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="propertyFileReader" />
<property name="targetMethod" value="runLoadPropertiesFile" /> <!-- Method in your class you want to run -->
<property name="concurrent" value="false" />
</bean>
<bean id="propertyFileReaderJobDetailSimpleTrigger"
class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<property name="jobDetail" ref="propertyFileReaderJobDetail" />
<property name="startDelay" value="60000" />
<property name="repeatInterval" value="60000" /><!-- every minute -->
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="propertyFileReaderJobDetailSimpleTrigger" />
</list>
</property>
</bean>
如果您的用例是从属性文件返回最新的值,您可以考虑使用Apache CAMONS配置和它的文件更改加载策略。 使用FileChangedLoadingStrategy,一旦您访问配置(基于属性文件的修改日期),就会检查属性文件是否有修改。如果检测到更改,则将属性文件加载到配置中
看这将确保属性始终反映文件中给定的值。无需定义计时器或使用调度框架。您可以使用
计时器
或调度程序
来触发读取方法。如果它位于Servlet
中,您可以设置某种值来存储上次读取文件的时间,当上次读取时间超过一分钟时,重新读取文件。否则,您可以在每次请求时重新读取文件…@这是一个很好的简单方法。如果没有servlet活动,获取文件就没有意义。为什么要每分钟读取一次?当属性文件更改时,可能需要只读。为此,您可以使用java.nio包。java.nio.file.WatchService.java可能有用。@Mahendra这是我的任务:每分钟重新读取一次文件,但我不使用SpringAh,没关系。在这种情况下,如果有帮助,您可以使用igor meli的触发器和apache PropertiesConfiguration:-)祝您愉快!谢谢,我将尝试这样做,然后将此数据传递给控制器?您可以尝试将数据保存到ServletContext,然后在控制器中获取此数据。然后,当某些请求发送到控制器时,我的页面将被更新。例如,如果属性发生更改,我可以调用控制器吗?谢谢!但是我仍然不明白当文件被更改时如何重新加载JSP。当文件被更改时,您不能重新加载JSP。在服务器上更改文件时,客户端(例如浏览器)会触发加载JSP。如果希望在属性更改后立即更新网页,可以使用WebSocket或使用ajax在后台轮询服务器。使用WebSocket是一种相当复杂的方法,因为它需要现代浏览器和web容器。Ajax对您来说可能更容易,因为您将在internet上找到更多的示例。虽然WebSocket允许在服务器通知客户机的地方进行即时更新,但ajax依赖于轮询。
<!-- Class that handles file reading -->
<bean id="propertyFileReader" class="org.myCompany.PropertyFileReader">
</bean>
<!-- Quartz job beans -->
<bean id="propertyFileReaderJobDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="propertyFileReader" />
<property name="targetMethod" value="runLoadPropertiesFile" /> <!-- Method in your class you want to run -->
<property name="concurrent" value="false" />
</bean>
<bean id="propertyFileReaderJobDetailSimpleTrigger"
class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<property name="jobDetail" ref="propertyFileReaderJobDetail" />
<property name="startDelay" value="60000" />
<property name="repeatInterval" value="60000" /><!-- every minute -->
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="propertyFileReaderJobDetailSimpleTrigger" />
</list>
</property>
</bean>
public class PropertyFileReader
{
private PropertiesConfiguration configuration;
public PropertyFileReader()
{
configuration = new PropertiesConfiguration("my property file location");
configuration.addConfigurationListener(new ConfigurationListener()
{
@Override
public void configurationChanged(ConfigurationEvent event)
{
// Do what needs to be done here
}
});
}
/**
* Method called by quartz timer for reloading properties file
*/
public void runLoadPropertiesFileg()
{
// Check if properties have changed.
// In this example I am using apache PropertiesConfiguration.
// Performs a reload operation if necessary. Events will be passed to
//configuration listeners.
configuration.reload();
}
}