Commit 27b37e81 authored by yihua.huang's avatar yihua.huang

extension point and sample for JMX support #98

parent a5db6cf2
...@@ -21,21 +21,20 @@ import java.util.concurrent.atomic.AtomicInteger; ...@@ -21,21 +21,20 @@ import java.util.concurrent.atomic.AtomicInteger;
* @author code4crafer@gmail.com * @author code4crafer@gmail.com
* @since 0.5.0 * @since 0.5.0
*/ */
public class SpiderMonitor implements SpiderMonitorMBean { public class SpiderMonitor {
private List<SpiderStatus> spiderStatuses = new ArrayList<SpiderStatus>(); private List<SpiderStatusMBean> spiderStatuses = new ArrayList<SpiderStatusMBean>();
@Override public List<SpiderStatusMBean> getSpiders() {
public List<SpiderStatus> getSpiders() {
return spiderStatuses; return spiderStatuses;
} }
@Override public SpiderStatusMBean getSpider() {
public SpiderStatus getSpider() {
return spiderStatuses.get(0); return spiderStatuses.get(0);
} }
public void register(Spider spider) { public SpiderMonitor register(Spider... spiders) {
for (Spider spider : spiders) {
MonitorSpiderListener monitorSpiderListener = new MonitorSpiderListener(); MonitorSpiderListener monitorSpiderListener = new MonitorSpiderListener();
if (spider.getSpiderListeners() == null) { if (spider.getSpiderListeners() == null) {
List<SpiderListener> spiderListeners = new ArrayList<SpiderListener>(); List<SpiderListener> spiderListeners = new ArrayList<SpiderListener>();
...@@ -44,8 +43,17 @@ public class SpiderMonitor implements SpiderMonitorMBean { ...@@ -44,8 +43,17 @@ public class SpiderMonitor implements SpiderMonitorMBean {
} else { } else {
spider.getSpiderListeners().add(monitorSpiderListener); spider.getSpiderListeners().add(monitorSpiderListener);
} }
spiderStatuses.add(new SpiderStatus(spider, monitorSpiderListener)); spiderStatuses.add(getSpiderStatusMBean(spider, monitorSpiderListener));
}
return this;
}
protected SpiderStatusMBean getSpiderStatusMBean(Spider spider, MonitorSpiderListener monitorSpiderListener) {
return new SpiderStatus(spider, monitorSpiderListener);
}
public static SpiderMonitor create(){
return new SpiderMonitor();
} }
public class MonitorSpiderListener implements SpiderListener { public class MonitorSpiderListener implements SpiderListener {
...@@ -81,42 +89,45 @@ public class SpiderMonitor implements SpiderMonitorMBean { ...@@ -81,42 +89,45 @@ public class SpiderMonitor implements SpiderMonitorMBean {
} }
public static void main(String[] args) throws MalformedObjectNameException, public void jmxStart() throws IOException, JMException {
NullPointerException, InstanceAlreadyExistsException, jmxStart(14721);
MBeanRegistrationException, NotCompliantMBeanException, IOException { }
int rmiPort = 1099;
SpiderMonitor spiderMonitor = new SpiderMonitor();
String jmxServerName = "TestJMXServer";
Spider oschinaSpider = Spider.create(new OschinaBlogPageProcessor()).addUrl("http://my.oschina.net/flashsword/blog").thread(2);
spiderMonitor.register(oschinaSpider);
Spider githubSpider = Spider.create(new GithubRepoPageProcessor()).addUrl("https://github.com/code4craft");
spiderMonitor.register(githubSpider);
public void jmxStart(int rmiPort) throws IOException, JMException {
String jmxServerName = "WebMagic";
// jdkfolder/bin/rmiregistry.exe 9999 // jdkfolder/bin/rmiregistry.exe 9999
Registry registry = LocateRegistry.createRegistry(rmiPort); Registry registry = LocateRegistry.createRegistry(rmiPort);
MBeanServer mbs = MBeanServerFactory.createMBeanServer(jmxServerName); MBeanServer mbs = MBeanServerFactory.createMBeanServer(jmxServerName);
//MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); //MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
ObjectName objName = new ObjectName(jmxServerName + ":name=" + "HelloWorld"); ObjectName objName;
mbs.registerMBean(spiderMonitor, objName);
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:" + rmiPort + "/" + jmxServerName); JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:" + rmiPort + "/" + jmxServerName);
System.out.println("JMXServiceURL: " + url.toString()); System.out.println("JMXServiceURL: " + url.toString());
JMXConnectorServer jmxConnServer = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs); JMXConnectorServer jmxConnServer = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs);
jmxConnServer.start(); jmxConnServer.start();
for (SpiderStatus spiderStatuse : spiderMonitor.spiderStatuses) { for (SpiderStatusMBean spiderStatus : spiderStatuses) {
objName = new ObjectName(jmxServerName + ":name=" + spiderStatuse.getName()); objName = new ObjectName(jmxServerName + ":name=" + spiderStatus.getName());
mbs.registerMBean(spiderStatuse, objName); mbs.registerMBean(spiderStatus, objName);
}
} }
public static void main(String[] args) throws JMException,
NullPointerException,
IOException {
Spider oschinaSpider = Spider.create(new OschinaBlogPageProcessor())
.addUrl("http://my.oschina.net/flashsword/blog").thread(2);
Spider githubSpider = Spider.create(new GithubRepoPageProcessor())
.addUrl("https://github.com/code4craft");
SpiderMonitor spiderMonitor = new SpiderMonitor();
spiderMonitor.register(oschinaSpider, githubSpider);
spiderMonitor.jmxStart();
} }
} }
package us.codecraft.webmagic.monitor; package us.codecraft.webmagic.monitor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import us.codecraft.webmagic.Spider; import us.codecraft.webmagic.Spider;
import java.util.List; import java.util.List;
...@@ -8,11 +10,13 @@ import java.util.List; ...@@ -8,11 +10,13 @@ import java.util.List;
* @author code4crafer@gmail.com * @author code4crafer@gmail.com
* @since 0.5.0 * @since 0.5.0
*/ */
public class SpiderStatus implements SpiderStatusMBean{ public class SpiderStatus implements SpiderStatusMBean {
private final Spider spider; protected final Spider spider;
private final SpiderMonitor.MonitorSpiderListener monitorSpiderListener; protected Logger logger = LoggerFactory.getLogger(getClass());
protected final SpiderMonitor.MonitorSpiderListener monitorSpiderListener;
public SpiderStatus(Spider spider, SpiderMonitor.MonitorSpiderListener monitorSpiderListener) { public SpiderStatus(Spider spider, SpiderMonitor.MonitorSpiderListener monitorSpiderListener) {
this.spider = spider; this.spider = spider;
...@@ -23,24 +27,46 @@ public class SpiderStatus implements SpiderStatusMBean{ ...@@ -23,24 +27,46 @@ public class SpiderStatus implements SpiderStatusMBean{
return spider.getUUID(); return spider.getUUID();
} }
public int getLeftPages() { public int getLeftPageCount() {
if (spider.getScheduler() instanceof MonitorableScheduler) { if (spider.getScheduler() instanceof MonitorableScheduler) {
return ((MonitorableScheduler) spider.getScheduler()).getLeftRequestsCount(spider); return ((MonitorableScheduler) spider.getScheduler()).getLeftRequestsCount(spider);
} }
logger.warn("Get leftPageCount fail, try to use a Scheduler implement MonitorableScheduler for monitor count!");
return -1; return -1;
} }
public int getTotalPages() { public int getTotalPageCount() {
if (spider.getScheduler() instanceof MonitorableScheduler) { if (spider.getScheduler() instanceof MonitorableScheduler) {
return ((MonitorableScheduler) spider.getScheduler()).getTotalRequestsCount(spider); return ((MonitorableScheduler) spider.getScheduler()).getTotalRequestsCount(spider);
} }
logger.warn("Get totalPageCount fail, try to use a Scheduler implement MonitorableScheduler for monitor count!");
return -1; return -1;
} }
@Override
public int getSuccessPageCount() {
return monitorSpiderListener.getSuccessCount().get();
}
@Override
public int getErrorPageCount() {
return monitorSpiderListener.getErrorCount().get();
}
public List<String> getErrorPages() { public List<String> getErrorPages() {
return monitorSpiderListener.getErrorUrls(); return monitorSpiderListener.getErrorUrls();
} }
@Override
public String getStatus() {
return spider.getStatus().name();
}
@Override
public int getThread() {
return spider.getThreadAlive();
}
public void start() { public void start() {
spider.start(); spider.start();
} }
......
...@@ -10,13 +10,21 @@ public interface SpiderStatusMBean { ...@@ -10,13 +10,21 @@ public interface SpiderStatusMBean {
public String getName(); public String getName();
public int getLeftPages(); public String getStatus();
public int getThread();
public int getTotalPageCount();
public int getLeftPageCount();
public int getSuccessPageCount();
public int getErrorPageCount();
public int getTotalPages();
public List<String> getErrorPages(); public List<String> getErrorPages();
public void start(); public void start();
public void stop(); public void stop();
} }
package us.codecraft.webmagic.monitor;
import us.codecraft.webmagic.Spider;
/**
* @author code4crafer@gmail.com
*/
public class CustomSpiderStatus extends SpiderStatus implements CustomSpiderStatusMBean {
public CustomSpiderStatus(Spider spider, SpiderMonitor.MonitorSpiderListener monitorSpiderListener) {
super(spider, monitorSpiderListener);
}
@Override
public String getSchedulerName() {
return spider.getScheduler().getClass().getName();
}
}
package us.codecraft.webmagic.monitor; package us.codecraft.webmagic.monitor;
import java.util.List;
/** /**
* @author code4crafer@gmail.com * @author code4crafer@gmail.com
*/ */
public interface SpiderMonitorMBean { public interface CustomSpiderStatusMBean extends SpiderStatusMBean {
public List<SpiderStatus> getSpiders();
public SpiderStatus getSpider(); public String getSchedulerName();
} }
package us.codecraft.webmagic.monitor;
import org.junit.Test;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.example.GithubRepoPageProcessor;
import us.codecraft.webmagic.processor.example.OschinaBlogPageProcessor;
/**
* @author code4crafer@gmail.com
* @since 0.5.0
*/
public class SpiderMonitorTest {
@Test
public void testInherit() throws Exception {
SpiderMonitor spiderMonitor = new SpiderMonitor(){
@Override
protected SpiderStatusMBean getSpiderStatusMBean(Spider spider, MonitorSpiderListener monitorSpiderListener) {
return new CustomSpiderStatus(spider, monitorSpiderListener);
}
};
Spider oschinaSpider = Spider.create(new OschinaBlogPageProcessor())
.addUrl("http://my.oschina.net/flashsword/blog").thread(2);
Spider githubSpider = Spider.create(new GithubRepoPageProcessor())
.addUrl("https://github.com/code4craft");
spiderMonitor.register(oschinaSpider, githubSpider);
spiderMonitor.jmxStart();
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment