Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 每分钟读取一次.properties文件_Java_Servlets_Properties - Fatal编程技术网

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();
    }
}