extension point and sample for JMX support #98
parent
a5db6cf292
commit
27b37e8164
|
@ -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 {
|
||||||
} 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 {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
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();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,14 +0,0 @@
|
||||||
package us.codecraft.webmagic.monitor;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author code4crafer@gmail.com
|
|
||||||
*/
|
|
||||||
public interface SpiderMonitorMBean {
|
|
||||||
|
|
||||||
public List<SpiderStatus> getSpiders();
|
|
||||||
|
|
||||||
public SpiderStatus getSpider();
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,5 +1,7 @@
|
||||||
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;
|
||||||
|
@ -10,9 +12,11 @@ import java.util.List;
|
||||||
*/
|
*/
|
||||||
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{
|
||||||
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 {
|
||||||
|
|
||||||
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();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
package us.codecraft.webmagic.monitor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author code4crafer@gmail.com
|
||||||
|
*/
|
||||||
|
public interface CustomSpiderStatusMBean extends SpiderStatusMBean {
|
||||||
|
|
||||||
|
public String getSchedulerName();
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
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();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue