WildFly-使用长期运行的应用程序创建应用程序

时间:2018-07-18 19:45:37

标签: java wildfly

我是JavaEE的新手,正在尝试创建一个WAR,其中包含一个每30分钟执行一次任务的应用程序(并在部署该应用程序时启动),以及一个允许客户端连接并获取状态信息的Servlet。 ,使用WildFly。

这可能吗?如果是这样,如何获取WildFly以启动长时间运行的过程,以及如何将其注入到servlet中?

长期运行的应用程序在ProcessData()类中,该类使用ScheduledExecutorService在计划表中生成线程以执行数据管理任务,并且具有getStatus()方法,该方法返回有关处理的字符串。

这是servlet:

@WebServlet("/procStat")
public class processorServlet extends HTTPServlet {
  @Inject
  ProcessData processData;

  protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
    resp.setContentType("text/html");
    PrintWriter writer = resp.getWriter();
    writer.println("<p>" + processData.getStatus() + "</p>");
    writer.close();
  }
}

1 个答案:

答案 0 :(得分:1)

为什么需要注射?您可以将其初始化并以静态方法使用它吗?这是我的示例:

public class HelloWorld extends HttpServlet
{
    private static final long serialVersionUID = -1L;
    ProcessData processData;

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
   {
        // Set response content type
        response.setContentType("text/html");

        // Actual logic goes here.
        PrintWriter out = response.getWriter();
        out.println("<h1>" + ProcessData.getStatus() + "</h1>");
    }
}

此后,实现javax.servlet.ServletContextListener的ProcessData类 该侦听器具有将在Web应用程序初始化过程开始时执行的方法。

public class ProcessData implements ServletContextListener
{
    private static String message;
    private int counter = 0;

    Runnable run = new Runnable()
   {
        @Override
        public void run()
       {
            message = "counter: " + (counter++);
            System.out.println(message);
       }
   };

   @Override
   public void contextInitialized(ServletContextEvent arg0)
   {
       ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
       scheduler.scheduleAtFixedRate(run, 0, 1, TimeUnit.MINUTES);
   }

   @Override
   public void contextDestroyed(ServletContextEvent arg0)
   {
       // Empty method
   }

   public static String getStatus()
   {
       return message;
   } 
}

然后web.xml添加servlet以及ServletContextListener,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>TestTask</display-name>

  <servlet>
    <servlet-name>HelloWorld</servlet-name>
    <servlet-class>servlet.HelloWorld</servlet-class>
  </servlet>

  <servlet-mapping>
     <servlet-name>HelloWorld</servlet-name>
     <url-pattern>/HelloWorld</url-pattern>
  </servlet-mapping>

   <listener>
         <listener-class>schedule.ProcessData</listener-class>
   </listener>

    <welcome-file-list>
     <welcome-file>index.html</welcome-file>
   </welcome-file-list>
</web-app>

我先问为什么需要注入它,因为如果您有一个与特定用户无关的任务(例如,无论用户是否登录,都将执行您的任务),那么最终您会遇到许多用户需要访问的情况到单个数据。您需要某种单例,是的,您可以使用CDI bean或其他注入技术来实现,但也可以使其在没有这种开销的情况下运行。在我的示例中,我使用静态方法和静态字段来完成此操作。