Posted on 20-02-2014
Filed Under (技术) by waterlin

我的网页是用 jsp 写的,让用户插入了很多数据到数据库。我想写一个定时跑的东西,能够定时把数据库的内容生成一个报表发给我。这个定时器要怎么写?用什么方法?是写成 jsp 还是写成 java 的程序?

因为对 Java 不熟悉,仔细调研了一下,觉得有如下几种方法可以考虑:

  1. 如果是发邮件通知的话, 自己在后台 timer 一个 job 去做;如果是想用页面刷新来统计,那就 jsp 主动刷。
  2. 使用 Quartz 库。
  3. 还有一个方法,用系统的办法来解决,就是操作系统自带的定时器或是系统计划任务 cron,大不了里头搁一句批处理调 java 程序。
  4. 还有可以用 cron4j 这个东西,cron4j 挺好用的,又简单。

个人建议别用 Quartz 这玩意,建议写个可执行 jar,放到 server上用 crontab 或者 Window 计划任务跑。Quartz问题其实很多,不建议再增加web app的负担。

(1) Comment    Read More   
Posted on 06-11-2011
Filed Under (技术) by waterlin

想弄一个 Java 内嵌网页服务器 ( Embedded Web Server ),这样,在我的 Java 应用程序里,可以直接提供网页服务,而不用再给用户配置一个网页服务器。对于轻量级的本地网页服务,这样就足够了!

在 Java 应用里内嵌一个网页服务器,Jetty 是一个很好的选择。以下是我在摸索过程中,总结的基本步骤:

1. Jetty 环境的配置

首先从官方网站下载开发包,再解压到你喜欢的目录,Java 的东西就是方便呀!

注意,Jetty 还分好几种包,Jetty@eclipse、Jetty@codehaus 是比较常见的,内容应该差不多,应该只是镜像罢了。

2. 在 Eclipse 里建立 Jetty 内嵌网页服务器 Hello World 程序

Java 开发中使用第三方库的时候,就需要把该库添加到工程里。Jetty 的库文件,全部在解压目录的 lib 目录下,比如说,在我这里就是

D:\eclipse\jetty-hightide-8.0.4.v20111024\lib

目录。在 Eclipse 里新建一个 Java 工程,同时,在工程上点右键,弹出的菜单里,选择”Properties”,打开工程属性对话框,进行如下操作:

在 “Java Build Path” ==> “Libraries” 选项卡里,选择 “Add External JARs” 按钮,然后切换到 Jetty 目录里的 lib 目录,把所有的 jar 包都添加到工程里。

现在,我们可以用最简单的例子来启动一个 Jetty 内嵌网页服务器,但是这个代码,只可以获得一个 404 错误。不过没有关系,这起码可以证明 Jetty Server is Ready!

相比于上面这个 404 错误的例子,相信你会更喜欢下面这个 HelloWorld 例子

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
 
import java.io.IOException;
 
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.AbstractHandler;
 
public class HelloWorld extends AbstractHandler
{
    public void handle(String target,
                       Request baseRequest,
                       HttpServletRequest request,
                       HttpServletResponse response) 
        throws IOException, ServletException
    {
        response.setContentType("text/html;charset=utf-8");
        response.setStatus(HttpServletResponse.SC_OK);
        baseRequest.setHandled(true);
        response.getWriter().println("<h1>Hello World</h1>");
    }
 
    public static void main(String[] args) throws Exception
    {
        Server server = new Server(8080);
        server.setHandler(new HelloWorld());
 
        server.start();
        server.join();
    }
}

3. 其它添加 Jetty 库文件的方法

如果需要在 Java 工程里进行 Embeded Server 开发,也可以把 Jetty 的库目录包含到 CLASSPATH 环境变量里。事实上,只要能找到下面几个文件就可以了:

servlet-api-3.0.jar
jetty-util-8.0.4.v20111024.jar
jetty-8.x.jar

手册上是这样写的,不过最后一个 jetty-8.x.jar 文件,我没有找到。

(0) Comments    Read More   
Posted on 24-08-2011
Filed Under (技术) by waterlin

今天为这件事情折腾了一天!

我用 Java 写的中间件,会根据用户的需要,启动一个子进程,这个进程是用 C++ 写的,正好用到了 Log4Cxx 来记录日志以便分析。这个进程,单独从控制终端运行,没有任何问题;但是一旦用 Java 启动子进程的方式来启动,则这个子进程刚一启动就阻塞不动了,然后大概等上几十分钟到两个小时不等,该子进程则又能顺利执行下去。

第一次碰到这样的问题,很怪异,经过反复测试及万能的 Google 帮忙,找到Java调用外部程序挂起原因,Log4Cxx 原来是罪魁祸首,因为它重定向了大量的日志信息到控制台,由于 Java 进程没有清空程序写到缓冲区的内容,结果导致程序一直在等待。

解决这个问题有两个办法:

  1. 按上文中的说法,在遇到 Java 启动外部程序而导致线程阻塞的时候,可以考虑使用两个线程来同时清空 process 获取的两个输入流;
  2. 直接把 Log4Cxx 重定向到控制台的日志消息给取消掉,这个可以通过 Log4Cxx 的配置文件来实现

问题搞定了,世界又变得很美好了!

(0) Comments    Read More