前面写过对于webapp,用javamelody来监控、分析性能是挺方便的;那要对普通的java应用进行监控,只需要在应用上启动一个嵌入式web容器就可以了。

javamelody里面的war包就用了winstone 作为Servlet容器,可以直接启动;本文是以Jetty为例,在应用中嵌入一个jetty:

import java.util.EventListener;
import java.util.HashMap;
import java.util.Map; import javax.servlet.Filter; import org.mortbay.jetty.Connector;
import org.mortbay.jetty.Handler;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.bio.SocketConnector;
import org.mortbay.jetty.handler.ContextHandlerCollection;
import org.mortbay.jetty.handler.ResourceHandler;
import org.mortbay.jetty.servlet.Context;
import org.mortbay.jetty.servlet.DefaultServlet;
import org.mortbay.jetty.servlet.FilterHolder;
import org.mortbay.thread.QueuedThreadPool;
import org.springframework.web.context.ContextLoaderListener; /**
* 启动一个jetty容器,结合javamelody用于监控应用性能
* @author langke
* 2012-12-21
*/
public class JavaMelodyMonitorServer {
private ESLogger log = Loggers.getLogger(JavaMelodyMonitorServer.class);
Server webServer;
/**
*
* @param serverName 应用名称
* @param host 绑定的IP地址
* @param serverPort 应用端口,jetty启动的端口默认会在此基础上加1000,如果配置文件有配置jetty.listen.port则配置优先
*/
public JavaMelodyMonitorServer(String serverName,String host,int serverPort) {
init(serverName, host, serverPort);
start();
final JavaMelodyMonitorServer server = this;
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
try {
log.info("shutdown mointorServer:{}", server);
server.stop();
} catch (Exception e) {
log.error("run main stop error!", e);
}
} });
} private void init(String serverName,String host,int serverPort){
int defaultValue = serverPort+1000;
int port = Config.get().getInt("jetty.listen.port", defaultValue);
Connector connector = new SocketConnector();
webServer = new Server();
QueuedThreadPool pool = new QueuedThreadPool();
pool.setMinThreads(Config.get().getInt("jetty.pool.MinThread", 3));
pool.setMaxThreads(Config.get().getInt("jetty.pool.MaxThread", 32));
String server = host;
pool.setName(serverName+"-monitor");
pool.setDaemon(true);
webServer.setThreadPool(pool);
connector = new SocketConnector(); connector.setPort(port);
connector.setHost(server);
connector.setMaxIdleTime(60000); // 1 min
webServer.addConnector(connector); ContextHandlerCollection col = new ContextHandlerCollection();
Context context = new Context(col, "/", Context.SESSIONS);
ResourceHandler resourceHandler = new ResourceHandler();
webServer.setHandlers(new Handler[] {col,resourceHandler });
webServer.addHandler(context);
// Set Java Melody storage Directory
System.setProperty("javamelody.storage-directory", "javamelody-"+pool.getName()); //add filter
Filter monitoringFilter = new net.bull.javamelody.MonitoringFilter();
context.addFilter(new FilterHolder(monitoringFilter), "/monitoring", Handler.REQUEST); Map<String,String> initParams = new HashMap<String,String>();
initParams.put("contextConfigLocation", "classpath:net/bull/javamelody/monitoring-spring.xml");
context.setInitParams(initParams); //add listener
EventListener listener = new ContextLoaderListener();
context.addEventListener(listener); context.addServlet(DefaultServlet.class, "/*"); } private void start(){
try{
webServer.join();
webServer.start();
}catch (Exception e){
log.error("Error starting httpserver", e);
}
} private void stop(){
try{
webServer.stop();
webServer.destroy();
}catch (Exception e){
log.error("Error stop httpserver", e);
} }
}

这个jetty加了shutdown hook,应用关闭的时候会自己关闭容器。

然后在你的Application里实例化这个类就行了;

需要的jar依赖名如下:

servlet-api-3.0.jar
org.springframework.web-3.1.0.RELEASE.jar
jrobin-1.5.9.1.jar
jetty-util-6.1.26.jar
jetty-6.1.26.jar
javamelody.jar
com.springsource.net.sf.cglib-2.2.0.jar

如果使用spring框架,监控配置就比较简单,可以对某个包所有类进行监控:

    <bean id="facadeMonitoringAdvisor" class="net.bull.javamelody.MonitoringSpringAdvisor">
<property name="pointcut">
<bean class="org.springframework.aop.support.JdkRegexpMethodPointcut">
<property name="pattern" value="org.langke.core.service.*" />
</bean>
</property>
</bean>

监控数据源:

    <bean id="springDataSourceBeanPostProcessor" class="net.bull.javamelody.SpringDataSourceBeanPostProcessor">
</bean> <bean id="wrappedDataSource" class="net.bull.javamelody.SpringDataSourceFactoryBean">
<property name="targetName" value="dataSource" />
</bean>

还有一种方式:注解

只需添加注解@net.bull.javamelody.MonitoredWithGuice在你的实现类或者你要监控的方法:使用net.bull.javamelody.MonitoringProxy类代理

详见:http://code.google.com/p/javamelody/wiki/UserGuide#10._Business_facades_(if_Guice)

如果不用Spring也不用Guice还有一种简单的方法实现监控

详见:http://code.google.com/p/javamelody/wiki/UserGuideAdvanced#Business_facades_(without_EJB3_and_without_Spring_and_without_Gu

具体的集成方式,稍后会在我的github发布出来

https://github.com/langke93/rest-nettyserver

javamelody对Java Application进行监控的更多相关文章

  1. Java 服务端监控方案(四. Java 篇)

    http://jerrypeng.me/2014/08/08/server-side-java-monitoring-java/ 这个漫长的系列文章今天要迎来最后一篇了,也是真正与 Java 有关的部 ...

  2. Java微服务监控及与普罗米集成

    一.    背景说明 Java服务级监控用于对每个应用占用的内存.线程池的线程数量.restful调用数量和响应时间.JVM状态.GC信息等进行监控,并可将指标信息同步至普罗米修斯中集中展示和报警.网 ...

  3. velocity模板引擎学习(4)-在standalone的java application中使用velocity及velocity-tools

    通常velocity是配合spring mvc之类的框架在web中使用,但velocity本身其实对运行环境没有过多的限制,在单独的java application中也可以独立使用,下面演示了利用ve ...

  4. maven: 打包可运行的jar包(java application)及依赖项处理

    IDE环境中,可以直接用exec-maven-plugin插件来运行java application,类似下面这样: <plugin> <groupId>org.codehau ...

  5. How to run a (Tomcat)Java application server on a Azure virtual machine

    http://www.windowsazure.com/en-us/documentation/articles/virtual-machines-java-run-tomcat-applicatio ...

  6. The differences between Java application and Java applet

    在Java语言中,能够独立运行的程序称为Java应用程序(Application).Java语言还有另外一种程序--Applet程序.Applet程序(也称Java小程序)是运行于各种网页文件中,用于 ...

  7. Java Applet与Java Application的区别

    转自:http://www.educity.cn/java/500609.html 在Java语言中,能够独立运行的程序称为Java应用程序(Application).Java语言还有另外一种程序-- ...

  8. How to deploy JAVA Application on Azure Service Fabric

    At this moment, Azure Service Fabric does not support JAVA application natively (but it's on the sup ...

  9. Java Applet与Java Application的特点

    java application是应用程序,用于桌面开发,java applet是小应用程序,一般嵌入到网页里运行.applet一般用于B/S页面上作为插件式的开发,而application主要是桌面 ...

随机推荐

  1. Java实现 LeetCode 827 最大人工岛(DFS+暴力模拟)

    827. 最大人工岛 在二维地图上, 0代表海洋, 1代表陆地,我们最多只能将一格 0 海洋变成 1变成陆地. 进行填海之后,地图上最大的岛屿面积是多少?(上.下.左.右四个方向相连的 1 可形成岛屿 ...

  2. Java实现 蓝桥杯 算法提高 菱形

    试题 算法提高 菱形 请编程输出一个菱形.输入为菱形中心到顶点的距离 样例输入 2 样例输出 import java.util.Scanner; public class Main { public ...

  3. Java实现 LeetCode 207 课程表

    207. 课程表 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] ...

  4. Java实现 蓝桥杯VIP 算法提高 笨小猴

    算法提高 笨小猴 时间限制:1.0s 内存限制:256.0MB 问题描述 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率 ...

  5. 第九届蓝桥杯JavaB组国(决)赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.三角形面积 已知三角形三个顶点在直角坐标系下的坐标分别为: (2.3, 2.5) (6.4, 3.1) (5.1, 7.2) 求该三角 ...

  6. java实现Prim算法

    1 问题描述 何为Prim算法? 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex ...

  7. struts 通配符的使用

    使用通配符可以将配置量降到最低,十分方便 新建一个javaweb项目 在项目中加入Struts.xml( 选中项目右键MyEclipse-->project facets-->Struts ...

  8. Istio的运维-诊断工具(istio 系列五)

    Istio的运维-诊断工具 在参考官方文档的时候发现环境偶尔会出现问题,因此插入一章与调试有关的内容,便于简单问题的定位.涵盖官方文档的诊断工具章节 目录 Istio的运维-诊断工具 使用istioc ...

  9. laravel里的队列学习

    首先,我们要搞明白几个概念,从小到大依次有:队列任务,队列,连接. 他们属于依次被包含的关系,一个队列里有许多的队列任务,一个连接中可以有许多队列. 队列任务:对每个用户都会进行的操作,理解为队列任务 ...

  10. is ==小数据池编码解码

    ==      比较      比较的是两边的值    is      比较      比较的是内存地址   判断两个东西指向的是不是同一个对象         取内存地址 id() 小数据池     ...