001    package railo.commons.management;
002    
003    import java.lang.management.MemoryNotificationInfo;
004    import java.lang.management.MemoryType;
005    import java.util.Map;
006    
007    import javax.management.Notification;
008    import javax.management.NotificationListener;
009    import javax.management.openmbean.CompositeDataSupport;
010    
011    import railo.aprint;
012    import railo.runtime.config.Config;
013    import railo.runtime.config.ConfigServer;
014    import railo.runtime.config.ConfigServerImpl;
015    import railo.runtime.engine.Controler;
016    
017    public class MemoryNotificationListener implements NotificationListener {
018    
019            private Map<String, MemoryType> types;
020    
021            public MemoryNotificationListener(Map<String, MemoryType> types) {
022                    this.types=types;
023            }
024    
025            @Override
026            public void handleNotification(Notification not, Object handback) {
027                    
028                    if (not.getType().equals(MemoryNotificationInfo.MEMORY_THRESHOLD_EXCEEDED)) {
029                            CompositeDataSupport data=(CompositeDataSupport) not.getUserData();
030                            
031                            
032                            String poolName = (String) data.get("poolName");
033                            MemoryType type = types.get(poolName);
034                            if(type==MemoryType.HEAP){
035                                    // clear heap
036                                    aprint.e("Clear heap!");
037                            }
038                            else if(type==MemoryType.NON_HEAP) {
039                                    // clear none-heap
040                                    ConfigServerImpl.checkPermGenSpace((Config) handback,false);
041                            }
042                            
043                            /*CompositeDataSupport usage=(CompositeDataSupport) data.get("usage");
044                            print.e(poolName);
045                            print.e(types.get(poolName));
046                            print.e(data.get("count"));
047                            
048                            print.e(usage.get("committed"));
049                            print.e(usage.get("init"));
050                            print.e(usage.get("max"));
051                            print.e(usage.get("used"));
052    
053                            long max=Caster.toLongValue(usage.get("max"),0);
054                            long used=Caster.toLongValue(usage.get("used"),0);
055                            long free=max-used;
056                            print.o("m:"+max);
057                            print.o("f:"+free);
058                            print.o("%:"+(100L*used/max));
059                            //not.*/
060                    }
061                    /*
062                    javax.management.openmbean.CompositeDataSupport(
063                            compositeType=javax.management.openmbean.CompositeType(
064                                    name=java.lang.management.MemoryUsage,
065                                    items=(
066                                            (itemName=committed,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),
067                                            (itemName=init,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),
068                                            (itemName=max,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),
069                                            (itemName=used,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)))),contents={committed=101580800, init=65404928, max=110362624, used=101085960})
070    
071                    
072                    
073                    javax.management.openmbean.CompositeDataSupport(
074                                    compositeType=javax.management.openmbean.CompositeType(
075                                            name=java.lang.management.MemoryNotificationInfo,
076                                            items=(
077                                                            (itemName=count,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),
078                                                            (itemName=poolName,itemType=javax.management.openmbean.SimpleType(name=java.lang.String)),
079                                                            (itemName=usage,itemType=javax.management.openmbean.CompositeType(name=java.lang.management.MemoryUsage,items=((itemName=committed,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),(itemName=init,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),(itemName=max,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),(itemName=used,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long))))))),contents={count=1, poolName=CMS Old Gen, usage=javax.management.openmbean.CompositeDataSupport(compositeType=javax.management.openmbean.CompositeType(name=java.lang.management.MemoryUsage,items=((itemName=committed,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),(itemName=init,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),(itemName=max,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),(itemName=used,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)))),contents={committed=101580800, init=65404928, max=110362624, used=101085944})})
080    
081                    */
082                    /*
083                    print.e(data.getCompositeType());
084                    print.e(not.getSource().getClass().getName());
085                    print.e(not.getSource());
086                    ObjectName on=(ObjectName) not.getSource();
087                    print.e(on.getKeyPropertyList());
088                    */
089                    
090                    
091                    
092                    /*
093                    print.e(not.getUserData().getClass().getName());
094                    print.e(not.getUserData());
095                    
096                    print.e(not.getMessage());
097                    print.e(not.getSequenceNumber());
098                    print.e(not.getTimeStamp());
099                    print.e(not.getType());*/
100            }
101    
102    }