最近项目中遇到这样一个需求,根据一个动态的URL来生成对应的网页快照。网上找了很多资料,最终采用如下方法解决。
生成原理:将动态URL的页面先生成HTML文件,然后再根据生成的HTML生成快照。生成的HTML中必须有值如:<div>test<div>,不能通过JS或JSON的方式给页面元素赋值,否则生成的(快照)图片会是空白的。
缺点:当点击按钮提交表单后,可能由于网络不畅通,造成请求超时从而造成生成快照失败;解决办法:可通过定时程序来生成图片解决此问题。
部分源码如下(附件中有完整源码):
/** * JAVA线程根据给定URL生成网页快照 * User: GQ * Date: 13-10-31 * Time: 下午10:45 * To change this template use File | Settings | File Templates. */ import snapshot.model.Page; import java.util.Timer; public class Test { private TaskQueue<Page> queue; private Timer timer; protected void setUp() { queue = new TaskQueue<Page>(); queue.put(new Page("微软", "http://www.microsoft.com/")); queue.put(new Page("MOP", "http://www.mop.com/")); queue.put(new Page("MSN", "http://www.msn.com/")); queue.put(new Page("阿里巴巴", "http://www.alibaba.com/")); queue.put(new Page("淘宝", "http://www.taobao.com/")); queue.put(new Page("百度", "http://www.baidu.com/")); queue.put(new Page("谷歌", "http://www.google.com/")); queue.put(new Page("腾讯", "http://www.qq.com/")); queue.put(new Page("新浪", "http://www.sina.com/")); queue.put(new Page("SPRING", "http://www.springframework.org/")); queue.put(new Page("网易", "http://www.163.com/")); } public void setRun() { timer = new Timer(); SnapshotProcessorDeamon deamon = new SnapshotProcessorDeamon(); deamon.setAvgmax(2); //File f = new File(this.getClass().getResource("/").getPath()); // 获取类加载的根路径 例如:D:/IdeaProjects/cdby_wan/WebRoot/WEB-INF/classes //deamon.setExec(f.toString().replaceAll("\\\\","/")+"/IECapt.exe"); deamon.setExec("c:\\IECapt.exe"); deamon.setMax(5); deamon.setImageRoot("c:/snapshot/"); deamon.setTaskQueue(queue); deamon.setTime(1000l); deamon.setTimeout(20000l); timer.schedule(deamon, 10000, 10000); do { try { Thread.sleep(11000l); } catch (InterruptedException e) { e.printStackTrace(); } } while (deamon.getProcessorCount() > 0); } /** * @param args */ public static void main(String[] args) { long start = System.currentTimeMillis(); System.out.println("开始时间:" + start); Test t = new Test(); t.setUp(); t.setRun(); long end = System.currentTimeMillis(); System.out.println("结束时间:" + end); System.out.println("花费时间:" + (end - start) / 1000 + "秒"); } }
根据动态URL生成HTML,请参考:http://gqsunrise.iteye.com/admin/blogs/1968228
相关推荐
本篇将详细介绍如何使用Java实现基于URL的单个大文件分多线程下载。 首先,我们需要了解Java中的`java.net.URL`类,它代表一个统一资源定位符,是访问互联网资源的入口。通过`URL`对象,我们可以获取到网络资源,...
2. **线程池支持**:可能扩展了`java.util.concurrent.ExecutorService`接口,使得线程池中的线程也可以根据策略绑定到特定的核心。 3. **平台兼容性**:考虑到跨平台兼容性,该项目可能实现了对Linux、Windows、...
线程堆栈是Java虚拟机在某一时刻对所有活动线程的状态快照,包括线程ID、线程状态、调用堆栈等信息。当应用程序出现性能问题或疑似死锁时,开发者通常会使用`jstack`命令来生成线程堆栈,这是一个内置在JDK中的...
JAVA线程dump是指在JAVA程序中,当前线程的状态和调用堆栈的快照,能够帮助开发者了解当前程序的执行情况,诊断问题和性能瓶颈。生成JAVA线程dump的方法在不同的操作系统下是不同的,在Windows环境中,可以敲击Ctrl-...
Java的TDA线程转储分析器是一个用于分析Sun Java VM生成的线程转储和堆信息的小型Swing GUI(目前用1.4测试)。它从提供的日志文件中解析线程转储和类直方图。它提供关于发现的线程转储的统计信息,提供关于锁定监视器...
【Java多线程迷宫生成程序】是一种利用Java编程语言实现的、基于多线程技术的动态迷宫生成示例。这个小程序展示了如何在计算机图形学中应用多线程来实时生成随机迷宫,同时也提供了视觉动画效果,使得观察迷宫生成的...
Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当我们创建一个新...
线程亲和性版本概述允许您将线程绑定到给定的核心,这可以提高性能(该库在 Linux 上运行效果最佳)。OpenHFT Java 线程亲和性库请参阅affinity/src/test/java 以获取有关如何使用该库的工作示例。更改V3.2.0 - 添加...
Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式...
在本项目中,"纯Java实现整个网页截图项目源代码" 是一个利用Java编程语言来实现的实用程序,它能够捕获整个网页的图像并将其保存为图片文件。这个项目的核心在于利用DJNativeSwing组件,这是一个开源的Java库,它...
多线程实现的页面快照则是在生成这些副本时,利用多线程技术来提高效率,加快处理速度。 IECapt.exe 是一个可能用于生成网页快照的工具,它可能是一个命令行程序,能够截取网页并保存为图片或者HTML文件,以便于...
在分析Java应用程序的性能问题时,了解和分析Java线程的状态是非常关键的。线程堆栈信息可以让我们深入观察到线程的运行状况,包括线程的当前状态、调用堆栈、锁信息等。为了获取这些信息,我们可以使用jstack工具,...
适合:简单地获取纯文字网页的内容。需要创建子线程or修改爬取网页请在testpc.java中修改,webpc用于获取指定网页内容,runthread用于创建子线程爬虫,testpc则是主线程,用于管理子线程的创建、运行与等待。
### Java多线程操作数据库:深入解析与应用 在当今高度并发的应用环境中,Java多线程技术被广泛应用于处理数据库操作,以提升系统的响应速度和处理能力。本文将基于一个具体的Java多线程操作数据库的应用程序,深入...
Java多线程读大文件 java多线程写文件:多线程往队列中写入数据
java多线程PPT 多线程基本概念 创建线程的方式 线程的挂起与唤醒 多线程问题
在Java出现以前,似乎人人都在谈论线程,却很少有人使用它。用线程编程是技巧性很强的且不可移植。 而在Java中却完全不同。Java的线程工具易于使用,并且像Java中的其他东西一样可以在不同的平台之间移植。这是一件...
在Java编程中,多线程查询数据库是一种常见的优化策略,特别是在处理大数据量或者需要并行执行多个查询时。本文将详细探讨如何利用Java的多线程技术和线程池来实现并发查询数据库,以及相关的文件`BatchDataUtil....
《JAVA线程第三版》是Java并发编程领域的一本经典著作,主要针对Java线程的深入理解和实践提供了详尽的指导。这本书详细介绍了如何在Java应用程序中有效地使用多线程,以提高程序的性能和可扩展性。Java线程是Java...
Java线程池是一种高效管理线程的机制,它允许开发者预先创建一定数量的线程,然后根据需求将任务提交到线程池中进行执行。线程池的核心在于它能够有效地控制运行的线程数量,避免因为频繁创建和销毁线程而产生的性能...