{"id":446,"date":"2014-12-18T22:57:49","date_gmt":"2014-12-19T07:57:49","guid":{"rendered":"http:\/\/blog.box.kr\/?p=446"},"modified":"2014-12-18T22:57:49","modified_gmt":"2014-12-19T07:57:49","slug":"%ed%8e%8cjeus-jms-%ed%86%b5%ea%b3%84-%ec%a0%95%eb%b3%b4-%ec%96%bb%ea%b8%b0","status":"publish","type":"post","link":"https:\/\/blog.box.kr\/?p=446","title":{"rendered":"[\ud38c]Jeus JMS \ud1b5\uacc4 \uc815\ubcf4 \uc5bb\uae30.."},"content":{"rendered":"<p>\u2605 <b>Jeus JMS \ud1b5\uacc4 \uc815\ubcf4 \uc5bb\uae30..<\/b><\/p>\n<p>&#8211; . JMX \uad6c\ub3d9 \ubc29\uc2dd<\/p>\n<p>-.\u00a0 JeusJmxUtil.java, QueStatInfo.java\u00a0 \ub450\uac1c \ud30c\uc77c \uad6c\ud604<\/p>\n<p>&nbsp;<\/p>\n<p>[1. JeusJmxUtil.java \uc18c\uc2a4..\u00a0 package \uba85\uc740 \uc54c\uc544\uc11c \ubc14\uafd4\uc8fc\ub294 \uc13c\uc2a4..~~]<\/p>\n<p>[ main \uba54\uc18c\ub4dc\uc5d0 \uc0d8\ud50c \ucf54\ub4dc \uc791\uc131\ud588\uc74c.]<\/p>\n<p><span style=\"color: #0000ff;\">package<\/span> com.krxapm.util;<\/p>\n<p><span style=\"color: #0000ff;\">import<\/span> java.util.<span style=\"color: #ff0000;\">ArrayList<\/span>;<br \/>\n<span style=\"color: #0000ff;\">import<\/span> java.util.<span style=\"color: #ff0000;\">HashMap<\/span>;<br \/>\n<span style=\"color: #0000ff;\">import<\/span> java.util.<span style=\"color: #ff0000;\">Hashtable<\/span>;<br \/>\n<span style=\"color: #0000ff;\">import<\/span> java.util.<span style=\"color: #ff0000;\">Iterator<\/span>;<br \/>\n<span style=\"color: #0000ff;\">import<\/span> java.util.<span style=\"color: #ff0000;\">List<\/span>;<br \/>\n<span style=\"color: #0000ff;\">import<\/span> java.util.<span style=\"color: #ff0000;\">Set<\/span>;<\/p>\n<p><span style=\"color: #0000ff;\">import<\/span> javax.management.MBeanServerConnection;<br \/>\n<span style=\"color: #0000ff;\">import<\/span> javax.management.MBeanServerInvocationHandler;<br \/>\n<span style=\"color: #0000ff;\">import<\/span> javax.management.ObjectName;<br \/>\n<span style=\"color: #0000ff;\">import<\/span> javax.naming.<span style=\"color: #ff0000;\">Context<\/span>;<\/p>\n<p><span style=\"color: #0000ff;\">import<\/span> jeus.jms.server.mbean.JMSQueueDestinationResourceMBean;<br \/>\n<span style=\"color: #0000ff;\">import<\/span> jeus.management.RemoteMBeanServerFactory;<br \/>\n<span style=\"color: #0000ff;\">import<\/span> jeus.management.j2ee.J2EEServerMBean;<br \/>\n<span style=\"color: #0000ff;\">import<\/span> jeus.management.j2ee.JEUSManagerMBean;<\/p>\n<p><span style=\"color: #0000ff;\">import<\/span> com.krxapm.app.jmx.<span style=\"color: #000000;\">info<\/span>.QueStatInfo;<\/p>\n<p><span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #0000ff;\">class<\/span> JeusJmxUtil {<br \/>\n<span style=\"color: #0000ff;\">public<\/span> MBeanServerConnection getMbean(<span style=\"color: #ff0000;\">HashMap<\/span> hmap){<br \/>\nMBeanServerConnection rmiMbeanServer = <span style=\"color: #0000ff;\">null<\/span>;<br \/>\n<span style=\"color: #0000ff;\">try<\/span> {<\/p>\n<p><span style=\"color: #ff0000;\">Hashtable<\/span> env = <span style=\"color: #0000ff;\">new<\/span> <span style=\"color: #ff0000;\">Hashtable<\/span>();<br \/>\nenv.put(<span style=\"color: #ff0000;\">Context<\/span>.INITIAL_CONTEXT_FACTORY, <span style=\"color: #ff00ff;\">&#8220;jeus.jndi.JEUSContextFactory&#8221;<\/span>);<br \/>\nenv.put(<span style=\"color: #ff0000;\">Context<\/span>.SECURITY_PRINCIPAL, hmap.<span style=\"color: #000000;\">get<\/span>(<span style=\"color: #ff00ff;\">&#8220;jeus_id&#8221;<\/span>).<span style=\"color: #000000;\">toString<\/span>());<br \/>\nenv.put(<span style=\"color: #ff0000;\">Context<\/span>.SECURITY_CREDENTIALS, hmap.<span style=\"color: #000000;\">get<\/span>(<span style=\"color: #ff00ff;\">&#8220;jeus_pw&#8221;<\/span>).<span style=\"color: #000000;\">toString<\/span>());<br \/>\nenv.put(<span style=\"color: #ff0000;\">Context<\/span>.PROVIDER_URL, hmap.<span style=\"color: #000000;\">get<\/span>(<span style=\"color: #ff00ff;\">&#8220;host_ip&#8221;<\/span>).<span style=\"color: #000000;\">toString<\/span>());<br \/>\n<span style=\"color: #008000;\">\/\/\u00a0\u00a0\u00a0\u00a0\u00a0 InitialContext ctx = new InitialContext(env);<\/span><br \/>\n<span style=\"color: #008000;\">\/\/\u00a0\u00a0\u00a0\u00a0\u00a0 String targetName = hmap.get(&#8220;host_id&#8221;).toString();<\/span><br \/>\n<span style=\"color: #008000;\">\/\/\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><br \/>\n<span style=\"color: #008000;\">\/\/\u00a0\u00a0\u00a0\u00a0\u00a0 JMXConnector connector = (JMXConnector) ctx.lookup(JMXConstants.JNDI_BINDING_PREFIX + targetName);<\/span><br \/>\n<span style=\"color: #008000;\">\/\/\u00a0\u00a0\u00a0\u00a0\u00a0 connector.connect();<\/span><br \/>\n<span style=\"color: #008000;\">\/\/\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><br \/>\n<span style=\"color: #008000;\">\/\/\u00a0\u00a0\u00a0\u00a0\u00a0 \/* JNDI \ud638\ucd9c \ubc29\uc2dd.. ObjectName \ub9ac\uc2a4\ud2b8 \uc804\uccb4\uac00 \uc548 \ucc0d\ud798.. *\/<\/span><br \/>\n<span style=\"color: #008000;\">\/\/\u00a0\u00a0\u00a0\u00a0\u00a0 rmiMbeanServer = connector.getMBeanServerConnection();<\/span><\/p>\n<p><span style=\"color: #008000;\">\/\/ JNDI \ubc29\uc2dd\ubcf4\ub2e4 Remote \ubc29\uc2dd\uc774 ObjectName \ub9ac\uc2a4\ud2b8\uac00 \uc548\uc815\uc801\uc73c\ub85c \ub098\uc634..<\/span><br \/>\nrmiMbeanServer = RemoteMBeanServerFactory.getMBeanServer(env);<br \/>\n} <span style=\"color: #0000ff;\">catch<\/span> (<span style=\"color: #ff0000;\">Throwable<\/span> t) {<br \/>\nt.<span style=\"color: #000000;\">printStackTrace<\/span>();<br \/>\n}<\/p>\n<p><span style=\"color: #0000ff;\">return<\/span> rmiMbeanServer;<br \/>\n}<\/p>\n<p><span style=\"color: #008000;\">\/**<\/span><br \/>\n<span style=\"color: #008000;\">\u00a0\u00a0 * Jeus JMS \ucee8\ud14c\uc774\ub108 \uc815\ubcf4 \uc5bb\uae30..<\/span><br \/>\n<span style=\"color: #008000;\">\u00a0\u00a0 * <\/span><br \/>\n<span style=\"color: #008000;\">\u00a0\u00a0 * @param mbConn<\/span><br \/>\n<span style=\"color: #008000;\">\u00a0\u00a0 * @return<\/span><br \/>\n<span style=\"color: #008000;\">\u00a0\u00a0 * @throws Exception<\/span><br \/>\n<span style=\"color: #008000;\">\u00a0\u00a0 *\/<\/span><\/p>\n<p><span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #ff0000;\">ArrayList<\/span> getConList(MBeanServerConnection mbConn) <span style=\"color: #0000ff;\">throws<\/span> <span style=\"color: #ff0000;\">Exception<\/span> {<\/p>\n<p><span style=\"color: #0000ff;\">int<\/span> i = <span style=\"color: #000000;\">0<\/span>;<br \/>\nObjectName filterName = <span style=\"color: #0000ff;\">null<\/span>;<br \/>\nfilterName = <span style=\"color: #0000ff;\">new<\/span> ObjectName(<span style=\"color: #ff00ff;\">&#8220;JEUS:jeusType=JeusManager,*&#8221;<\/span>);<\/p>\n<p><span style=\"color: #ff0000;\">Set<\/span> objectNames = mbConn.queryNames(filterName, <span style=\"color: #0000ff;\">null<\/span>);<br \/>\nJEUSManagerMBean[] jeusMangerMBean = <span style=\"color: #0000ff;\">new<\/span> JEUSManagerMBean[objectNames.<span style=\"color: #000000;\">size<\/span>()];<\/p>\n<p><span style=\"color: #ff0000;\">ArrayList<\/span> alist = <span style=\"color: #0000ff;\">new<\/span> <span style=\"color: #ff0000;\">ArrayList<\/span>();<\/p>\n<p><span style=\"color: #ff0000;\">Iterator<\/span> objectNamesIter = objectNames.<span style=\"color: #000000;\">iterator<\/span>();<br \/>\n<span style=\"color: #0000ff;\">while<\/span>(objectNamesIter.<span style=\"color: #000000;\">hasNext<\/span>()){<\/p>\n<p>ObjectName obj = (ObjectName) objectNamesIter.<span style=\"color: #000000;\">next<\/span>();<\/p>\n<p><span style=\"color: #ff0000;\">Class<\/span> conManagerClass = <span style=\"color: #ff0000;\">Class<\/span>.<span style=\"color: #000000;\">forName<\/span>(<span style=\"color: #ff00ff;\">&#8220;jeus.management.j2ee.JEUSManagerMBean&#8221;<\/span>);<br \/>\njeusMangerMBean[i] = (JEUSManagerMBean) MBeanServerInvocationHandler.newProxyInstance(mbConn, obj, conManagerClass,<span style=\"color: #0000ff;\">false<\/span>);<\/p>\n<p>ObjectName[] objs = jeusMangerMBean[i].getj2eeServerNames();<br \/>\n<span style=\"color: #008000;\">\/\/String[] conList = new String[objs.length];<\/span><br \/>\n<span style=\"color: #ff0000;\">ArrayList<\/span> conList = <span style=\"color: #0000ff;\">new<\/span> <span style=\"color: #ff0000;\">ArrayList<\/span>();<br \/>\n<span style=\"color: #0000ff;\">for<\/span>(<span style=\"color: #0000ff;\">int<\/span> j=<span style=\"color: #000000;\">0<\/span>; j&lt;objs.<span style=\"color: #000000;\">length<\/span>; j<span style=\"color: #000000;\">++<\/span>){<br \/>\n<span style=\"color: #008000;\">\/\/ \ucee8\ud14c\uc774\ub108 \uc815\ubcf4 \uc804\ubd80\ub97c \ub2f4\uc744 \uacbd\uc6b0 String[] \ubc30\uc5f4\ub85c \uc120\uc5b8\ud55c \ud6c4 \uc544\ub798 \uc8fc\uc11d\uc744 \uc81c\uac70\ud55c\ub2e4.<\/span><br \/>\n<span style=\"color: #008000;\">\/\/conList[j] = objs[j].getKeyProperty(&#8220;name&#8221;);<\/span><\/p>\n<p><span style=\"color: #008000;\">\/\/ JMSEngine\uc744 \ud3ec\ud568\ud558\ub294 \ucee8\ud14c\uc774\ub108 \uc815\ubcf4\ub9cc \uc5bb\uc5b4\uc62c \uacbd\uc6b0 \uc544\ub798 \ub85c\uc9c1 \uc0ac\uc6a9<\/span><br \/>\n<span style=\"color: #008000;\">\/\/ conList\ub294 ArrayList\ub85c \uad6c\ud604\ud55c\ub2e4.. (\ubca1\ud130 \uc0ac\uc6a9)<\/span><br \/>\n<span style=\"color: #ff0000;\">Class<\/span> j2eeManagerClass = <span style=\"color: #ff0000;\">Class<\/span>.<span style=\"color: #000000;\">forName<\/span>(<span style=\"color: #ff00ff;\">&#8220;jeus.management.j2ee.J2EEServerMBean&#8221;<\/span>);<br \/>\nJ2EEServerMBean j2eeServerMBean = (J2EEServerMBean) MBeanServerInvocationHandler.newProxyInstance(mbConn, objs[j], j2eeManagerClass, <span style=\"color: #0000ff;\">false<\/span>);<br \/>\nObjectName[] engineList = j2eeServerMBean.getEngines();<br \/>\n<span style=\"color: #0000ff;\">for<\/span>(<span style=\"color: #0000ff;\">int<\/span> k=<span style=\"color: #000000;\">0<\/span>; k&lt;engineList.<span style=\"color: #000000;\">length<\/span>; k<span style=\"color: #000000;\">++<\/span>){<br \/>\n<span style=\"color: #ff0000;\">String<\/span> engineType = engineList[k].getKeyProperty(<span style=\"color: #ff00ff;\">&#8220;jeusType&#8221;<\/span>);<br \/>\n<span style=\"color: #0000ff;\">if<\/span>(engineType.<span style=\"color: #000000;\">equals<\/span>(<span style=\"color: #ff00ff;\">&#8220;JMSEngine&#8221;<\/span>)){<br \/>\nconList.<span style=\"color: #000000;\">add<\/span>(objs[j].getKeyProperty(<span style=\"color: #ff00ff;\">&#8220;name&#8221;<\/span>));<br \/>\n}<br \/>\n}<br \/>\n}<\/p>\n<p><span style=\"color: #ff0000;\">HashMap<\/span> hmap = <span style=\"color: #0000ff;\">new<\/span> <span style=\"color: #ff0000;\">HashMap<\/span>();<br \/>\nhmap.put(<span style=\"color: #ff00ff;\">&#8220;node&#8221;<\/span>, obj.getKeyProperty(<span style=\"color: #ff00ff;\">&#8220;name&#8221;<\/span>));<br \/>\nhmap.put(<span style=\"color: #ff00ff;\">&#8220;conList&#8221;<\/span>, conList);<br \/>\nalist.<span style=\"color: #000000;\">add<\/span>(hmap);<\/p>\n<p>i<span style=\"color: #000000;\">++<\/span>;<br \/>\n}<\/p>\n<p><span style=\"color: #0000ff;\">return<\/span> alist;<br \/>\n}<\/p>\n<p><span style=\"color: #008000;\">\/**<\/span><br \/>\n<span style=\"color: #000000;\">*<\/span> JMS \ud1b5\uacc4 \uc815\ubcf4 \uc5bb\uae30<br \/>\n<span style=\"color: #000000;\">*<\/span><br \/>\n<span style=\"color: #000000;\">*<\/span> @param mbConn<br \/>\n<span style=\"color: #000000;\">*<\/span> @param conName<br \/>\n<span style=\"color: #000000;\">*<\/span> @<span style=\"color: #0000ff;\">return<\/span><br \/>\n<span style=\"color: #000000;\">*<\/span> @<span style=\"color: #0000ff;\">throws<\/span> <span style=\"color: #ff0000;\">Exception<\/span><br \/>\n*\/<br \/>\n<span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #ff0000;\">ArrayList<\/span> getJmsStat(MBeanServerConnection mbConn, <span style=\"color: #ff0000;\">String<\/span> conName) <span style=\"color: #0000ff;\">throws<\/span> <span style=\"color: #ff0000;\">Exception<\/span>{<br \/>\nObjectName jeusScope = <span style=\"color: #0000ff;\">new<\/span> ObjectName(RemoteMBeanServerFactory.SYSTEM_DOMAIN <span style=\"color: #000000;\">+<\/span><span style=\"color: #ff00ff;\">&#8220;:j2eeType=JeusService,jeusType=JMSDestinationResource,JMXManager=&#8221;<\/span><span style=\"color: #000000;\">+<\/span>conName<span style=\"color: #000000;\">+<\/span><span style=\"color: #ff00ff;\">&#8220;,*&#8221;<\/span>);<br \/>\n<span style=\"color: #ff0000;\">Set<\/span> jeusSet = mbConn.queryNames(jeusScope, <span style=\"color: #0000ff;\">null<\/span>);<\/p>\n<p>JMSQueueDestinationResourceMBean dstQueMbean=<span style=\"color: #0000ff;\">null<\/span>;<br \/>\n<span style=\"color: #ff0000;\">ArrayList<\/span> alist = <span style=\"color: #0000ff;\">new<\/span> <span style=\"color: #ff0000;\">ArrayList<\/span>();<\/p>\n<p><span style=\"color: #0000ff;\">for<\/span> (<span style=\"color: #ff0000;\">Iterator<\/span> i = jeusSet.<span style=\"color: #000000;\">iterator<\/span>(); i.<span style=\"color: #000000;\">hasNext<\/span>();) {<br \/>\nObjectName jmsDstObj = <span style=\"color: #0000ff;\">new<\/span> ObjectName(i.<span style=\"color: #000000;\">next<\/span>().<span style=\"color: #000000;\">toString<\/span>());<br \/>\ndstQueMbean = (JMSQueueDestinationResourceMBean)MBeanServerInvocationHandler.newProxyInstance(mbConn, jmsDstObj, JMSQueueDestinationResourceMBean.<span style=\"color: #0000ff;\">class<\/span>, <span style=\"color: #0000ff;\">false<\/span> );<br \/>\n<span style=\"color: #008000;\">\/\/System.out.println(&#8220;[JEUS Monitoring Service] &#8221; + i.next());<\/span><\/p>\n<p>QueStatInfo qsi = <span style=\"color: #0000ff;\">new<\/span> QueStatInfo();<br \/>\nqsi.<span style=\"color: #000000;\">setName<\/span>(dstQueMbean.<span style=\"color: #000000;\">getName<\/span>());<br \/>\nqsi.setExportName(dstQueMbean.getExportName());<\/p>\n<p><span style=\"color: #0000ff;\">try<\/span>{<br \/>\nqsi.setExpiredCount(<span style=\"color: #0000ff;\">new<\/span> <span style=\"color: #ff0000;\">Long<\/span>(dstQueMbean.getExpiredMessageCount()).<span style=\"color: #000000;\">toString<\/span>());<br \/>\nqsi.setDestCount(<span style=\"color: #0000ff;\">new<\/span> <span style=\"color: #ff0000;\">Long<\/span>(dstQueMbean.getMessageCount()).<span style=\"color: #000000;\">toString<\/span>());<br \/>\nqsi.setRemainCount(<span style=\"color: #0000ff;\">new<\/span> <span style=\"color: #ff0000;\">Long<\/span>(dstQueMbean.getRemainingMessages()).<span style=\"color: #000000;\">toString<\/span>());<br \/>\n<span style=\"color: #0000ff;\">if<\/span>(dstQueMbean.isTopic())<br \/>\nqsi.setPendingCount(<span style=\"color: #0000ff;\">new<\/span> <span style=\"color: #ff0000;\">Long<\/span>(dstQueMbean.getRemainingPendingMessages()).<span style=\"color: #000000;\">toString<\/span>());<br \/>\n<span style=\"color: #0000ff;\">else<\/span><br \/>\nqsi.setPendingCount(<span style=\"color: #ff00ff;\">&#8220;0&#8221;<\/span>);<\/p>\n<p>qsi.setWaitMaxTime(<span style=\"color: #0000ff;\">new<\/span> <span style=\"color: #ff0000;\">Long<\/span>(dstQueMbean.getMessageWaitMaxTime()).<span style=\"color: #000000;\">toString<\/span>());<br \/>\nqsi.setWaitMinTime(<span style=\"color: #0000ff;\">new<\/span> <span style=\"color: #ff0000;\">Long<\/span>(dstQueMbean.getMessageWaitMinTime()).<span style=\"color: #000000;\">toString<\/span>());<br \/>\nqsi.setWaitTotalTime(<span style=\"color: #0000ff;\">new<\/span> <span style=\"color: #ff0000;\">Long<\/span>(dstQueMbean.getMessageWaitTotalTime()).<span style=\"color: #000000;\">toString<\/span>());<br \/>\n}<span style=\"color: #0000ff;\">catch<\/span>(<span style=\"color: #ff0000;\">Exception<\/span> e){<br \/>\nqsi.setExpiredCount(<span style=\"color: #ff00ff;\">&#8220;0&#8221;<\/span>);<br \/>\nqsi.setDestCount(<span style=\"color: #ff00ff;\">&#8220;0&#8221;<\/span>);<br \/>\nqsi.setRemainCount(<span style=\"color: #ff00ff;\">&#8220;0&#8221;<\/span>);<br \/>\nqsi.setPendingCount(<span style=\"color: #ff00ff;\">&#8220;0&#8221;<\/span>);<\/p>\n<p>qsi.setWaitMaxTime(<span style=\"color: #ff00ff;\">&#8220;0&#8221;<\/span>);<br \/>\nqsi.setWaitMinTime(<span style=\"color: #ff00ff;\">&#8220;0&#8221;<\/span>);<br \/>\nqsi.setWaitTotalTime(<span style=\"color: #ff00ff;\">&#8220;0&#8221;<\/span>);<br \/>\n}<br \/>\n<span style=\"color: #ff0000;\">List<\/span> <span style=\"color: #000000;\">list<\/span> = dstQueMbean.getJMSConsumerResourceNames();<br \/>\n<span style=\"color: #ff0000;\">String<\/span> clientNames = <span style=\"color: #ff00ff;\">&#8220;&#8221;<\/span>;<br \/>\n<span style=\"color: #0000ff;\">for<\/span>(<span style=\"color: #0000ff;\">int<\/span> j =<span style=\"color: #000000;\">0<\/span>; j&lt;<span style=\"color: #000000;\">list<\/span>.<span style=\"color: #000000;\">size<\/span>(); j<span style=\"color: #000000;\">++<\/span>){<br \/>\n<span style=\"color: #0000ff;\">if<\/span>(j &gt; <span style=\"color: #000000;\">list<\/span>.<span style=\"color: #000000;\">size<\/span>())<br \/>\nclientNames <span style=\"color: #000000;\">+<\/span>= <span style=\"color: #000000;\">list<\/span>.<span style=\"color: #000000;\">get<\/span>(j).<span style=\"color: #000000;\">toString<\/span>()<span style=\"color: #000000;\">+<\/span><span style=\"color: #ff00ff;\">&#8220;,&#8221;<\/span>;<br \/>\n<span style=\"color: #0000ff;\">else<\/span><br \/>\nclientNames <span style=\"color: #000000;\">+<\/span>= <span style=\"color: #000000;\">list<\/span>.<span style=\"color: #000000;\">get<\/span>(j).<span style=\"color: #000000;\">toString<\/span>();<br \/>\n}<br \/>\nqsi.setClientNames(clientNames);<\/p>\n<p><span style=\"color: #0000ff;\">if<\/span>(dstQueMbean.isQueue()){<br \/>\nqsi.setQueueType(<span style=\"color: #ff00ff;\">&#8220;Queue&#8221;<\/span>);<br \/>\n}<span style=\"color: #0000ff;\">else<\/span> <span style=\"color: #0000ff;\">if<\/span>(dstQueMbean.isTopic()){<br \/>\nqsi.setQueueType(<span style=\"color: #ff00ff;\">&#8220;Topic&#8221;<\/span>);<br \/>\n}<br \/>\nalist.<span style=\"color: #000000;\">add<\/span>(qsi);<br \/>\n}<\/p>\n<p><span style=\"color: #0000ff;\">return<\/span> alist;<br \/>\n}<\/p>\n<p><span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #0000ff;\">static<\/span> <span style=\"color: #0000ff;\">void<\/span> <span style=\"color: #000000;\">main<\/span>(<span style=\"color: #ff0000;\">String<\/span>[] args) {<br \/>\n<span style=\"color: #ff0000;\">HashMap<\/span> hmap = <span style=\"color: #0000ff;\">new<\/span> <span style=\"color: #ff0000;\">HashMap<\/span>();<br \/>\nhmap.put(<span style=\"color: #ff00ff;\">&#8220;host_id&#8221;<\/span>, <span style=\"color: #ff00ff;\">&#8220;tmax-ae3898e485&#8221;<\/span>);<br \/>\nhmap.put(<span style=\"color: #ff00ff;\">&#8220;host_ip&#8221;<\/span>, <span style=\"color: #ff00ff;\">&#8220;localhost&#8221;<\/span>);<br \/>\nhmap.put(<span style=\"color: #ff00ff;\">&#8220;jndi_port&#8221;<\/span>, <span style=\"color: #ff00ff;\">&#8220;9736&#8221;<\/span>);<br \/>\nhmap.put(<span style=\"color: #ff00ff;\">&#8220;jeus_id&#8221;<\/span>, <span style=\"color: #ff00ff;\">&#8220;administrator&#8221;<\/span>);<br \/>\nhmap.put(<span style=\"color: #ff00ff;\">&#8220;jeus_pw&#8221;<\/span>, <span style=\"color: #ff00ff;\">&#8220;jeusadmin&#8221;<\/span>);<\/p>\n<p>JeusJmxUtil ju = <span style=\"color: #0000ff;\">new<\/span> JeusJmxUtil();<br \/>\nMBeanServerConnection mbconn = ju.getMbean(hmap);<br \/>\n<span style=\"color: #0000ff;\">try<\/span>{<br \/>\n<span style=\"color: #ff0000;\">ArrayList<\/span> conList = ju.getConList(mbconn);<br \/>\n<span style=\"color: #ff0000;\">ArrayList<\/span> queStatList = ju.getJmsStat(mbconn, <span style=\"color: #ff00ff;\">&#8220;tmax-ae3898e485_container1&#8221;<\/span>);<br \/>\n}<span style=\"color: #0000ff;\">catch<\/span>(<span style=\"color: #ff0000;\">Exception<\/span> e){<br \/>\ne.<span style=\"color: #000000;\">printStackTrace<\/span>();<br \/>\n}<br \/>\n}<br \/>\n}<\/p>\n<p>&nbsp;<\/p>\n<p>[2. QueStatInfo.java \uc18c\uc2a4..\u00a0 package \uba85\uc740 \uc54c\uc544\uc11c \ubc14\uafd4\uc8fc\ub294 \uc13c\uc2a4..~~]<\/p>\n<p><span style=\"color: #0000ff;\">package<\/span> com.krxapm.app.jmx.<span style=\"color: #000000;\">info<\/span>;<\/p>\n<p><span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #0000ff;\">class<\/span> QueStatInfo {<br \/>\n<span style=\"color: #0000ff;\">private<\/span> <span style=\"color: #ff0000;\">String<\/span> <span style=\"color: #000000;\">name<\/span>;<br \/>\n<span style=\"color: #0000ff;\">private<\/span> <span style=\"color: #ff0000;\">String<\/span> exportName;<br \/>\n<span style=\"color: #0000ff;\">private<\/span> <span style=\"color: #ff0000;\">String<\/span> expiredCount;<br \/>\n<span style=\"color: #0000ff;\">private<\/span> <span style=\"color: #ff0000;\">String<\/span> destCount;<br \/>\n<span style=\"color: #0000ff;\">private<\/span> <span style=\"color: #ff0000;\">String<\/span> remainCount;<br \/>\n<span style=\"color: #0000ff;\">private<\/span> <span style=\"color: #ff0000;\">String<\/span> pendingCount;<br \/>\n<span style=\"color: #0000ff;\">private<\/span> <span style=\"color: #ff0000;\">String<\/span> waitMaxTime;<br \/>\n<span style=\"color: #0000ff;\">private<\/span> <span style=\"color: #ff0000;\">String<\/span> waitMinTime;<br \/>\n<span style=\"color: #0000ff;\">private<\/span> <span style=\"color: #ff0000;\">String<\/span> waitTotalTime;<br \/>\n<span style=\"color: #0000ff;\">private<\/span> <span style=\"color: #ff0000;\">String<\/span> queueType;<br \/>\n<span style=\"color: #0000ff;\">private<\/span> <span style=\"color: #ff0000;\">String<\/span> clientNames;<br \/>\n<span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #ff0000;\">String<\/span> getClientNames() {<br \/>\n<span style=\"color: #0000ff;\">return<\/span> clientNames;<br \/>\n}<br \/>\n<span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #0000ff;\">void<\/span> setClientNames(<span style=\"color: #ff0000;\">String<\/span> clientNames) {<br \/>\n<span style=\"color: #0000ff;\">this<\/span>.clientNames = clientNames;<br \/>\n}<br \/>\n<span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #ff0000;\">String<\/span> getQueueType() {<br \/>\n<span style=\"color: #0000ff;\">return<\/span> queueType;<br \/>\n}<br \/>\n<span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #0000ff;\">void<\/span> setQueueType(<span style=\"color: #ff0000;\">String<\/span> queueType) {<br \/>\n<span style=\"color: #0000ff;\">this<\/span>.queueType = queueType;<br \/>\n}<br \/>\n<span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #ff0000;\">String<\/span> getDestCount() {<br \/>\n<span style=\"color: #0000ff;\">return<\/span> destCount;<br \/>\n}<br \/>\n<span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #0000ff;\">void<\/span> setDestCount(<span style=\"color: #ff0000;\">String<\/span> destCount) {<br \/>\n<span style=\"color: #0000ff;\">this<\/span>.destCount = destCount;<br \/>\n}<br \/>\n<span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #ff0000;\">String<\/span> getExpiredCount() {<br \/>\n<span style=\"color: #0000ff;\">return<\/span> expiredCount;<br \/>\n}<br \/>\n<span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #0000ff;\">void<\/span> setExpiredCount(<span style=\"color: #ff0000;\">String<\/span> expiredCount) {<br \/>\n<span style=\"color: #0000ff;\">this<\/span>.expiredCount = expiredCount;<br \/>\n}<br \/>\n<span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #ff0000;\">String<\/span> getExportName() {<br \/>\n<span style=\"color: #0000ff;\">return<\/span> exportName;<br \/>\n}<br \/>\n<span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #0000ff;\">void<\/span> setExportName(<span style=\"color: #ff0000;\">String<\/span> exportName) {<br \/>\n<span style=\"color: #0000ff;\">this<\/span>.exportName = exportName;<br \/>\n}<br \/>\n<span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #ff0000;\">String<\/span> <span style=\"color: #000000;\">getName<\/span>() {<br \/>\n<span style=\"color: #0000ff;\">return<\/span> <span style=\"color: #000000;\">name<\/span>;<br \/>\n}<br \/>\n<span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #0000ff;\">void<\/span> <span style=\"color: #000000;\">setName<\/span>(<span style=\"color: #ff0000;\">String<\/span> <span style=\"color: #000000;\">name<\/span>) {<br \/>\n<span style=\"color: #0000ff;\">this<\/span>.<span style=\"color: #000000;\">name<\/span> = <span style=\"color: #000000;\">name<\/span>;<br \/>\n}<br \/>\n<span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #ff0000;\">String<\/span> getPendingCount() {<br \/>\n<span style=\"color: #0000ff;\">return<\/span> pendingCount;<br \/>\n}<br \/>\n<span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #0000ff;\">void<\/span> setPendingCount(<span style=\"color: #ff0000;\">String<\/span> pendingCount) {<br \/>\n<span style=\"color: #0000ff;\">this<\/span>.pendingCount = pendingCount;<br \/>\n}<br \/>\n<span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #ff0000;\">String<\/span> getRemainCount() {<br \/>\n<span style=\"color: #0000ff;\">return<\/span> remainCount;<br \/>\n}<br \/>\n<span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #0000ff;\">void<\/span> setRemainCount(<span style=\"color: #ff0000;\">String<\/span> remainCount) {<br \/>\n<span style=\"color: #0000ff;\">this<\/span>.remainCount = remainCount;<br \/>\n}<br \/>\n<span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #ff0000;\">String<\/span> getWaitMaxTime() {<br \/>\n<span style=\"color: #0000ff;\">return<\/span> waitMaxTime;<br \/>\n}<br \/>\n<span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #0000ff;\">void<\/span> setWaitMaxTime(<span style=\"color: #ff0000;\">String<\/span> waitMaxTime) {<br \/>\n<span style=\"color: #0000ff;\">this<\/span>.waitMaxTime = waitMaxTime;<br \/>\n}<br \/>\n<span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #ff0000;\">String<\/span> getWaitMinTime() {<br \/>\n<span style=\"color: #0000ff;\">return<\/span> waitMinTime;<br \/>\n}<br \/>\n<span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #0000ff;\">void<\/span> setWaitMinTime(<span style=\"color: #ff0000;\">String<\/span> waitMinTime) {<br \/>\n<span style=\"color: #0000ff;\">this<\/span>.waitMinTime = waitMinTime;<br \/>\n}<br \/>\n<span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #ff0000;\">String<\/span> getWaitTotalTime() {<br \/>\n<span style=\"color: #0000ff;\">return<\/span> waitTotalTime;<br \/>\n}<br \/>\n<span style=\"color: #0000ff;\">public<\/span> <span style=\"color: #0000ff;\">void<\/span> setWaitTotalTime(<span style=\"color: #ff0000;\">String<\/span> waitTotalTime) {<br \/>\n<span style=\"color: #0000ff;\">this<\/span>.waitTotalTime = waitTotalTime;<br \/>\n}<br \/>\n}<\/p>\n<p>&nbsp;<\/p>\n<div class=\"autosourcing-stub\">\n<p><strong>[\ucd9c\ucc98]<\/strong> <a href=\"http:\/\/cafe.naver.com\/litave\/363\" target=\"_blank\">[Jeus JMS \uc815\ubcf4 \uc5bb\uae30] JMX \uad6c\ud604\ubc29\uc2dd.. (Lit\uc758 \ud504\ub85c\uadf8\ub7a8 \uc138\uc0c1)<\/a> |<strong>\uc791\uc131\uc790<\/strong> <a href=\"http:\/\/cafe.naver.com\/litave.cafe?iframe_url=\/CafeMemberNetworkView.nhn%3Fm=view%26memberid=mingi54\" target=\"_blank\">\uc778\ub77c\uc778<\/a><\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u2605 Jeus JMS \ud1b5\uacc4 \uc815\ubcf4 \uc5bb\uae30.. &#8211; . JMX \uad6c\ub3d9 \ubc29\uc2dd -.\u00a0 JeusJmxUtil.java, QueStatInfo.java\u00a0 \ub450\uac1c \ud30c\uc77c \uad6c\ud604 &nbsp; [1. JeusJmxUtil.java \uc18c\uc2a4..\u00a0 package \uba85\uc740 \uc54c\uc544\uc11c \ubc14\uafd4\uc8fc\ub294 \uc13c\uc2a4..~~] [ main \uba54\uc18c\ub4dc\uc5d0 \uc0d8\ud50c \ucf54\ub4dc \uc791\uc131\ud588\uc74c.] package com.krxapm.util; import java.util.ArrayList; import java.util.HashMap; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.Set; import javax.management.MBeanServerConnection; import javax.management.MBeanServerInvocationHandler; import javax.management.ObjectName; import javax.naming.Context; import jeus.jms.server.mbean.JMSQueueDestinationResourceMBean; import jeus.management.RemoteMBeanServerFactory; import jeus.management.j2ee.J2EEServerMBean; import jeus.management.j2ee.JEUSManagerMBean; import com.krxapm.app.jmx.info.QueStatInfo; public class JeusJmxUtil { public MBeanServerConnection getMbean(HashMap hmap){ MBeanServerConnection rmiMbeanServer = null; try { Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, &#8220;jeus.jndi.JEUSContextFactory&#8221;); env.put(Context.SECURITY_PRINCIPAL, hmap.get(&#8220;jeus_id&#8221;).toString()); env.put(Context.SECURITY_CREDENTIALS, hmap.get(&#8220;jeus_pw&#8221;).toString()); env.put(Context.PROVIDER_URL, hmap.get(&#8220;host_ip&#8221;).toString()); \/\/\u00a0\u00a0\u00a0\u00a0\u00a0 InitialContext ctx = new InitialContext(env); \/\/\u00a0\u00a0\u00a0\u00a0\u00a0 String targetName = hmap.get(&#8220;host_id&#8221;).toString(); \/\/\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u00a0\u00a0\u00a0\u00a0\u00a0 JMXConnector connector = (JMXConnector) ctx.lookup(JMXConstants.JNDI_BINDING_PREFIX + targetName); \/\/\u00a0\u00a0\u00a0\u00a0\u00a0 connector.connect(); \/\/\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u00a0\u00a0\u00a0\u00a0\u00a0 \/* JNDI \ud638\ucd9c \ubc29\uc2dd.. ObjectName \ub9ac\uc2a4\ud2b8 \uc804\uccb4\uac00 \uc548 \ucc0d\ud798.. *\/ \/\/\u00a0\u00a0\u00a0\u00a0\u00a0 rmiMbeanServer = connector.getMBeanServerConnection(); \/\/ JNDI \ubc29\uc2dd\ubcf4\ub2e4 Remote \ubc29\uc2dd\uc774 ObjectName \ub9ac\uc2a4\ud2b8\uac00 \uc548\uc815\uc801\uc73c\ub85c \ub098\uc634.. rmiMbeanServer = RemoteMBeanServerFactory.getMBeanServer(env); } catch (Throwable t) { t.printStackTrace(); } return rmiMbeanServer; } \/** \u00a0\u00a0 * Jeus JMS \ucee8\ud14c\uc774\ub108 \uc815\ubcf4 \uc5bb\uae30.. \u00a0\u00a0 * \u00a0\u00a0 * @param mbConn \u00a0\u00a0 * @return \u00a0\u00a0 * @throws Exception \u00a0\u00a0 *\/ public ArrayList getConList(MBeanServerConnection mbConn) throws Exception { int i = 0; ObjectName filterName = null; filterName = new ObjectName(&#8220;JEUS:jeusType=JeusManager,*&#8221;); Set objectNames = mbConn.queryNames(filterName, null); JEUSManagerMBean[] jeusMangerMBean [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_mi_skip_tracking":false,"ngg_post_thumbnail":0,"spay_email":"","jetpack_publicize_message":"","jetpack_is_tweetstorm":false,"jetpack_publicize_feature_enabled":true},"categories":[6],"tags":[],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack_publicize_connections":[],"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p5q9Zn-7c","jetpack-related-posts":[{"id":61,"url":"https:\/\/blog.box.kr\/?p=61","url_meta":{"origin":446,"position":0},"title":"WebtoB + JEUS + web application","date":"2014-06-12","format":false,"excerpt":"WebtoB + JEUS + web application webgosu.egloos.com\/9123240 1. WebtoB \uc124\uce58 1.1 \uc124\uce58\ud30c\uc77c, \ub77c\uc774\uc13c\uc2a4(license.dat)\uc900\ube44 1.2 \ub77c\uc774\uc13c\uc2a4 \uc801\uc6a9 : webtoB4.1licenselicense.dat 2. WebToB \uc2e4\ud589 2.1 \uc2e4\ud589\ud30c\uc77c\uc0dd\uc131(wsconfig) --> \ud658\uacbd\ud30c\uc77c \ucef4\ud30c\uc77c : wscfl -i [\ud658\uacbd\ud30c\uc77c] 2.2 \uc2e4\ud589 : wsboot --> wsboot -w (handler\uac00 process\ub4e4\uc744 \ud655\uc778\ud558\uba70 booting->\uc548\uc815\uc801\uc778 booting) 2.3 \uc885\ub8cc : wsdown --> wsdown -i (\uc9c8\uc758\ub97c\u2026","rel":"","context":"In &quot;JEUS &amp; WEBToB&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1268,"url":"https:\/\/blog.box.kr\/?p=1268","url_meta":{"origin":446,"position":1},"title":"\uae30\uae30 \uace0\uc720 \uc2dd\ubcc4(Identify) \uc5bb\uae30 device_info","date":"2021-05-18","format":false,"excerpt":"https:\/\/pub.dev\/packages\/device_infohttps:\/\/pub.dev\/packages\/device_info_plus import 'dart:io'; \/\/Platform \uc0ac\uc6a9\uc744 \uc704\ud55c \ud328\ud0a4\uc9c0 import 'package:flutter\/services.dart'; \/\/PlatformException \uc0ac\uc6a9\uc744 \uc704\ud55c \ud328\ud0a4\uc9c0 import 'package:device_info\/device_info.dart'; \/\/ \ub514\ubc14\uc774\uc2a4 \uc815\ubcf4 \uc0ac\uc6a9 \ud328\ud0a4\uc9c0 Future<String> getMobileId() async { \/\/ DeviceInfoPlugin \ud074\ub798\uc2a4 \uc0dd\uc131 final DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin(); \/\/ id \uc800\uc7a5\ud560 \ubcc0\uc218 String id = ''; try { \/\/ \ud50c\ub7ab\ud3fc \ud655\uc778 if (Platform.isAndroid) { \/\/\u2026","rel":"","context":"In &quot;flutter&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":105,"url":"https:\/\/blog.box.kr\/?p=105","url_meta":{"origin":446,"position":2},"title":"WebToB Admin \uba85\ub839","date":"2014-06-12","format":false,"excerpt":"1. WebtoB \uc124\uce58 1.1 \uc124\uce58 \ud30c\uc77c 1.2 \ub77c\uc774\uc13c\uc2a4 \uc801\uc6a9 : %webto_HOME%licenselicense.dat 1.3 \uc2e4\ud589\ud658\uacbd : wsconfig \ud30c\uc77c \uc0dd\uc131 - \ud658\uacbd\ud30c\uc77c \ucef4\ud30c\uc77c : wscfl -i [\ud658\uacbd\ud30c\uc77c] ex)wscfl -i sample.m 2. WebtoB \uc2e4\ud589 1.1 \uc2dc\uc791 : wsboot 1.2 \uc885\ub8cc : wsdown -i 3. WebtoB \uad00\ub9ac : wsadmin 3.1 : wi - \uc6f9\ud22c\ube44 \uc815\ubcf4\u2026","rel":"","context":"In &quot;JEUS &amp; WEBToB&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":74,"url":"https:\/\/blog.box.kr\/?p=74","url_meta":{"origin":446,"position":3},"title":"Logging\uc124\uc815 for JEUS5","date":"2014-06-12","format":false,"excerpt":"Logging\uc124\uc815 for JEUS5 \uc18c\uac1c \uc774 \ubb38\uc11c\ub294 JEUS 5\uc758 \uc6f9 \uad00\ub9ac\uc790\ub97c \uc0ac\uc6a9\ud55c logging \uc124\uc815 \ubc29\ubc95 \ubc0f customization \ubc29\ubc95, log4j \uc0ac\uc6a9\ubc95 \ub4f1\uc744 \uc124\uba85\ud55c\ub2e4. \uae30\ubcf8logger \ud30c\uc77c \ucd5c\ucd08 JEUS \uc124\uce58 \uc2dc, JEUS log\ub294 default\ub85c console handler\ub97c \uc0ac\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0 JEUS manager\uc640 \ubaa8\ub4e0 engine container\uc758 log message\uac00 stdout\ud615\ud0dc\ub85c \ucd9c\ub825\ub41c\ub2e4. \ub610\ud55c web container \uc758 access log\uac00 $JEUS_HOME\/logs\/<\ub178\ub4dc\uba85>\/<\ub178\ub4dc\uba85>_<\ucee8\ud14c\uc774\ub108\uba85>\/servlet\/accesslog\/access.log\u2026","rel":"","context":"In &quot;JEUS &amp; WEBToB&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":444,"url":"https:\/\/blog.box.kr\/?p=444","url_meta":{"origin":446,"position":4},"title":"[\ud38c]JMX\ub97c \uc774\uc6a9\ud558\uc5ec JVM \ubaa8\ub2c8\ud130\ub9c1 \ud558\uae30","date":"2014-12-18","format":false,"excerpt":"JMX\ub97c \uc774\uc6a9\ud558\uc5ec JVM \ubaa8\ub2c8\ud130\ub9c1 \ud558\uae30 JDK 1.5 \ubd80\ud130 JVM\uc5d0\ub294 Platform MBeanServer\uac00 \ub0b4\uc7a5\ub418\uc5b4 \uc788\uc5b4 jvm \ud30c\ub77c\ubbf8\ud130\ub85c\u00a0 Platform MBeanServer\uac00 \ub3d9\uc791\ud558\ub3c4\ub85d\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ubaa8\ub2c8\ud130\ub9c1 \ub300\uc0c1 \ud504\ub85c\uadf8\ub7a8 \uad6c\ub3d9\uc2dc \ub2e4\uc74c\uacfc \uac19\uc740 jvm \ud30c\ub77c\ubbf8\ud130\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc2e4\ud589\ud569\ub2c8\ub2e4. \u00a0 jvm \ud30c\ub77c\ubbf8\ud130: \u00a0 -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false \uc608\uc81c \uc18c\uc2a4 : \u00a0 import javax.management.MBeanServerConnection; import javax.management.ObjectName; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import\u2026","rel":"","context":"In &quot;jboss&amp;tomcat&quot;","img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1257,"url":"https:\/\/blog.box.kr\/?p=1257","url_meta":{"origin":446,"position":5},"title":"BLE \uc0ac\uc6a9\ud558\uae30","date":"2021-05-18","format":false,"excerpt":"\ub77c\uc774\ube0c\ub7ec\ub9ac \ucd94\uac00 \ubc0f SCAN \uae30\ub2a5 \uad6c\ud604flutter_ble_libhttps:\/\/pub.dev\/packages\/flutter_ble_libpermission_handlerhttps:\/\/pub.dev\/packages\/permission_handler\ud504\ub85c\uc81d\ud2b8\uc5d0 \uc548\ub4dc\ub85c\uc774\ub4dc SDK \ubc84\uc804\uc774 \ub0ae\uac8c \uc124\uc815\ub418\uc5b4 \uc544\ub798\uc640 \uac19\uc740 \uc5d0\ub7ec\uac00 \ubc1c\uc0dd\ud560 \uc218\uc774\ub2e4 ble_example\\android\\app\\src\\debug\\AndroidManifest.xml Error: uses-sdk:minSdkVersion 16 cannot be smaller than version 18 declared in library [:flutter_ble_lib] E:\\study\\flutter\\ble_example\\build\\flutter_ble_lib\\intermediates\\library_manifest\\debug\\AndroidManifest.xml as the library might be using APIs not available in 16 Suggestion: use a compatible library with a minSdk\u2026","rel":"","context":"In &quot;flutter&quot;","img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.box.kr\/wp-content\/uploads\/2021\/05\/image.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]}],"_links":{"self":[{"href":"https:\/\/blog.box.kr\/index.php?rest_route=\/wp\/v2\/posts\/446"}],"collection":[{"href":"https:\/\/blog.box.kr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.box.kr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.box.kr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.box.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=446"}],"version-history":[{"count":0,"href":"https:\/\/blog.box.kr\/index.php?rest_route=\/wp\/v2\/posts\/446\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.box.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=446"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.box.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=446"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.box.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=446"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}