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

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

  1. import java.util.EventListener;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4.  
  5. import javax.servlet.Filter;
  6.  
  7. import org.mortbay.jetty.Connector;
  8. import org.mortbay.jetty.Handler;
  9. import org.mortbay.jetty.Server;
  10. import org.mortbay.jetty.bio.SocketConnector;
  11. import org.mortbay.jetty.handler.ContextHandlerCollection;
  12. import org.mortbay.jetty.handler.ResourceHandler;
  13. import org.mortbay.jetty.servlet.Context;
  14. import org.mortbay.jetty.servlet.DefaultServlet;
  15. import org.mortbay.jetty.servlet.FilterHolder;
  16. import org.mortbay.thread.QueuedThreadPool;
  17. import org.springframework.web.context.ContextLoaderListener;
  18.  
  19. /**
  20. * 启动一个jetty容器,结合javamelody用于监控应用性能
  21. * @author langke
  22. * 2012-12-21
  23. */
  24. public class JavaMelodyMonitorServer {
  25. private ESLogger log = Loggers.getLogger(JavaMelodyMonitorServer.class);
  26. Server webServer;
  27. /**
  28. *
  29. * @param serverName 应用名称
  30. * @param host 绑定的IP地址
  31. * @param serverPort 应用端口,jetty启动的端口默认会在此基础上加1000,如果配置文件有配置jetty.listen.port则配置优先
  32. */
  33. public JavaMelodyMonitorServer(String serverName,String host,int serverPort) {
  34. init(serverName, host, serverPort);
  35. start();
  36. final JavaMelodyMonitorServer server = this;
  37. Runtime.getRuntime().addShutdownHook(new Thread() {
  38. @Override
  39. public void run() {
  40. try {
  41. log.info("shutdown mointorServer:{}", server);
  42. server.stop();
  43. } catch (Exception e) {
  44. log.error("run main stop error!", e);
  45. }
  46. }
  47.  
  48. });
  49. }
  50.  
  51. private void init(String serverName,String host,int serverPort){
  52. int defaultValue = serverPort+1000;
  53. int port = Config.get().getInt("jetty.listen.port", defaultValue);
  54. Connector connector = new SocketConnector();
  55. webServer = new Server();
  56. QueuedThreadPool pool = new QueuedThreadPool();
  57. pool.setMinThreads(Config.get().getInt("jetty.pool.MinThread", 3));
  58. pool.setMaxThreads(Config.get().getInt("jetty.pool.MaxThread", 32));
  59. String server = host;
  60. pool.setName(serverName+"-monitor");
  61. pool.setDaemon(true);
  62. webServer.setThreadPool(pool);
  63. connector = new SocketConnector();
  64.  
  65. connector.setPort(port);
  66. connector.setHost(server);
  67. connector.setMaxIdleTime(60000); // 1 min
  68. webServer.addConnector(connector);
  69.  
  70. ContextHandlerCollection col = new ContextHandlerCollection();
  71. Context context = new Context(col, "/", Context.SESSIONS);
  72. ResourceHandler resourceHandler = new ResourceHandler();
  73. webServer.setHandlers(new Handler[] {col,resourceHandler });
  74. webServer.addHandler(context);
  75. // Set Java Melody storage Directory
  76. System.setProperty("javamelody.storage-directory", "javamelody-"+pool.getName());
  77.  
  78. //add filter
  79. Filter monitoringFilter = new net.bull.javamelody.MonitoringFilter();
  80. context.addFilter(new FilterHolder(monitoringFilter), "/monitoring", Handler.REQUEST);
  81.  
  82. Map<String,String> initParams = new HashMap<String,String>();
  83. initParams.put("contextConfigLocation", "classpath:net/bull/javamelody/monitoring-spring.xml");
  84. context.setInitParams(initParams);
  85.  
  86. //add listener
  87. EventListener listener = new ContextLoaderListener();
  88. context.addEventListener(listener);
  89.  
  90. context.addServlet(DefaultServlet.class, "/*");
  91.  
  92. }
  93.  
  94. private void start(){
  95. try{
  96. webServer.join();
  97. webServer.start();
  98. }catch (Exception e){
  99. log.error("Error starting httpserver", e);
  100. }
  101. }
  102.  
  103. private void stop(){
  104. try{
  105. webServer.stop();
  106. webServer.destroy();
  107. }catch (Exception e){
  108. log.error("Error stop httpserver", e);
  109. }
  110.  
  111. }
  112. }

这个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框架,监控配置就比较简单,可以对某个包所有类进行监控:

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

监控数据源:

  1. <bean id="springDataSourceBeanPostProcessor" class="net.bull.javamelody.SpringDataSourceBeanPostProcessor">
  2. </bean>
  3.  
  4. <bean id="wrappedDataSource" class="net.bull.javamelody.SpringDataSourceFactoryBean">
  5. <property name="targetName" value="dataSource" />
  6. </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. ActiveMQ 笔记(六)ActiveMQ的消息存储和持久化

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.持久化机制 1.Activemq持久化 1.1 什么是持久化: 持久化就是高可用的机制,即使服务器宕 ...

  2. Java实现 LeetCode 640 求解方程(计算器的加减法计算)

    640. 求解方程 求解一个给定的方程,将x以字符串"x=#value"的形式返回.该方程仅包含'+',' - '操作,变量 x 和其对应系数. 如果方程没有解,请返回" ...

  3. Java实现字母去重

    描述 给定一个字符串S,每次操作你可以将其中任意一个字符修改成其他任意字符. 请你计算最少需要多少次操作,才能使得S中不存在两个相邻的相同字符. 输入 只包含小写字母的字符串S. 1 ≤ |S| ≤ ...

  4. 并发编程之sun.misc.Unsafe类

    1.Unsafe知识点整理 2.代码: package com.javabasic.unsafe; import java.lang.reflect.Field; import sun.misc.Un ...

  5. ASP.NET Core 3.1 WebApi+JWT+Swagger+EntityFrameworkCore构建REST API

    一.准备 使用vs2019新建ASP.NET Core Web应用程序,选用api模板: 安装相关的NuGet包: 二.编码 首先编写数据库模型: 用户表 User.cs: public class ...

  6. ffmpeg m3u8生成 剪辑及格式转换

    使用 ffmpeg 工具, 生成 m3u8 文件 ffmpeg -re -i 03.ts -c copy -f hls -hls_base_url /Users/admin/Downloads/dow ...

  7. 关于GatewayClient 介绍和使用

    GatewayClient ## 源码 https://github.com/walkor/GatewayClient 根据GatewayWorker版本,选择合适的GatewayClient版本,请 ...

  8. MATLAB作图之二

    "平滑"二维图像可以通过对图像进行插值实现.那么对于一条有大量"毛刺"的曲线,是不是也可以通过插值来平滑呢?答案是肯定的. "平滑"前 x ...

  9. Dubbo笔记(一)

    一.简介 在编写分布式场景下高并发.高扩展的系统对技能的要求很高,因为这个过程会涉及到序列化/反序列化.多线程.网络编程.设计模式.性能优化等众多专业知识.而Dubbo框架对这些专业知识做了更高层的抽 ...

  10. 数据湖&数据仓库,别再傻傻分不清了

    摘要:什么是数据湖?它有什么作用?今天将由华为云技术专家从理论出发,将问题抽丝剥茧,从技术维度娓娓道来. 什么是数据湖 如果需要给数据湖下一个定义,可以定义为这样:数据湖是一个存储企业的各种各样原始数 ...