ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品1区在线,欧美色爱综合,欧美一区二区三区在线视频http://www.aygfsteel.com/libin2722/category/37068.html虚其心,å¯è§£å¤©ä¸‹ä¹‹é—®åQ›ä¸“其心åQŒå¯æ²Õd¤©ä¸‹ä¹‹å­¦ï¼›é™å…¶å¿ƒï¼Œå¯æ‚Ÿå¤©ä¸‹ä¹‹ç†åQ›æ’其心åQŒå¯æˆå¤©ä¸‹ä¹‹ä¸šã€?/description>zh-cnTue, 07 Sep 2010 04:04:36 GMTTue, 07 Sep 2010 04:04:36 GMT60JGroupshttp://www.aygfsteel.com/libin2722/articles/330636.html½C¼ç‰©½C¼ç‰©Wed, 01 Sep 2010 14:43:00 GMThttp://www.aygfsteel.com/libin2722/articles/330636.htmlhttp://www.aygfsteel.com/libin2722/comments/330636.htmlhttp://www.aygfsteel.com/libin2722/articles/330636.html#Feedback0http://www.aygfsteel.com/libin2722/comments/commentRss/330636.htmlhttp://www.aygfsteel.com/libin2722/services/trackbacks/330636.html阅读全文

]]>
JMX Remotinghttp://www.aygfsteel.com/libin2722/articles/330634.html½C¼ç‰©½C¼ç‰©Wed, 01 Sep 2010 14:34:00 GMThttp://www.aygfsteel.com/libin2722/articles/330634.htmlhttp://www.aygfsteel.com/libin2722/comments/330634.htmlhttp://www.aygfsteel.com/libin2722/articles/330634.html#Feedback0http://www.aygfsteel.com/libin2722/comments/commentRss/330634.htmlhttp://www.aygfsteel.com/libin2722/services/trackbacks/330634.html

1 Introduction
    Java Management Extension (JMX) API定义于JSR 3åQŒç”¨äºŽåº”用程åºç®¡ç†ã€‚这些API对于被管ç†çš„应用½E‹åºæ¥è¯´æ˜¯æœ¬åœ°çš„。也ž®±æ˜¯è¯ß_¼Œåœ¨JSR 160å‘布之å‰åQŒå¦‚果客æˆïL«¯è¦é€šè¿‡JMXæ¥ç®¡ç†å’Œç›‘控˜qœç¨‹çš„应用程åºï¼Œòq¶æ²¡æœ‰æ ‡å‡†çš„åšæ³•。JSR 160扩展了JSR 3åQŒæä¾›äº†æ ‡å‡†çš„API用于˜qžæŽ¥åˆ°æ”¯æŒJMX的远½E‹åº”用程åºã€‚JSR 255ž®†ä¼šæŠŠJMXå‡çñ”åˆ?.0åQŒåƈå¯èƒ½ä½“现在Java 7中ã€?br />    ç›®å‰JSR 160定义了基于RMIåQˆæ”¯æŒRMI/JRMP å’?RMI/IIOPåQ‰çš„˜qžæŽ¥å™¨ï¼Œ˜q˜å®šä¹‰äº†å¯é€‰çš„JMXMP˜qžæŽ¥å™¨ï¼Œå®ƒåŸºäºŽTCP Socketå’ŒJavaåºåˆ—化机制ã€?/p>

 

2 JMX Remoting API
2.1 JMXServiceURL
    JMXServiceURL用于标识JMXConnectorServeråQŒå®ƒæ˜¯é‡‡ç”¨ä»¥ä¸‹åÅžå¼çš„字符ä¸ÔŒ¼š
    service:jmx:<protocol>://[[[ <host>]: <port>]/ <path>]
    "protocol" 指定了å议,例如åQšrmiã€iiopã€jmxmp 或è€?soapã€?host"ã€?port" å’? "path"是å¯é€‰çš„。JMXServiceURLòq¶ä¸­‘³ä»¥æè¿°æ‰€æœ‰çš„用于˜qžæŽ¥åˆ°JMXConnectorServer的酾|®ä¿¡æ¯ï¼ˆä¾‹å¦‚é…ç½® RMIClientSocketFactory å’ŒRMIServerSocketFactoryåQ‰ï¼Œå› æ­¤åœ¨æž„造JMXConnectorServer å’? JMXConnector的时候,˜q˜å¯èƒ½éœ€è¦é€šè¿‡ä¸€ä¸ªMap实例指定其它属性ã€?/p>

 

2.2 JMXConnectorServer
    JMXConnectorServer 是MBeanServer端的¾l„äšgåQŒå®ƒéœ€è¦è¢«å…Œ™”到MBeanServeråQšå¯ä»¥é€šè¿‡åœ¨åˆ›å»ºJMXConnectorServerçš„æ—¶å€™æ˜¾å¼æŒ‡å®? MBeanServeråQ›ä¹Ÿå¯ä»¥æŠŠJMXConnectorServeråQˆæœ¬íw«æ˜¯ä¸€ä¸ªMBeanåQ‰æ³¨å†Œåˆ°MBeanServer中ã€?br />    在被兌™”到MBeanServer之åŽåQŒéœ€è¦å¯åЍJMXConnectorServer以处ç†å®¢æˆïL«¯çš„è¯·æ±‚ã€‚åŒæ øP¼Œå¦‚æžœå¸Œæœ›åœæ­¢å¤„ç†å®¢æˆ·ç«¯çš„è¯äh±‚åQŒé‚£ä¹ˆéœ€ è¦åœæ­¢JMXConnectorServer。JMXConnectorServerè¢«åœæ­¢ä¹‹åŽï¼Œä¸åº”该试å›ùN‡æ–°å¯åŠ¨å®ƒåQŒè€Œæ˜¯åº”该ž®†å…¶ä¸¢å¼ƒã€?br />    最好通过JMXConnectorServerFactoryæ¥åˆ›å»ºJMXConnectorServeråQŒä¾‹å¦‚:

Java代ç 
  1. // The address of the connector server   
  2. JMXServiceURL address = new JMXServiceURL("service:jmx:rmi://host");  
  3.   
  4. // The environment map, null in this case   
  5. Map environment = null;  
  6.   
  7. // The MBeanServer to which the JMXConnectorServer will be attached to   
  8. MBeanServer server = MBeanServerFactory.createMBeanServer();  
  9.   
  10. // Create the JMXCconnectorServer   
  11. JMXConnectorServer cntorServer = JMXConnectorServerFactory.newJMXConnectorServer(address, environment, server);  
  12.   
  13. // Start the JMXConnectorServer   
  14. cntorServer.start();  

    在以上的例å­ä¸­ï¼Œåˆ›å¾JMXConnectorServer的时候指定了MBeanServer。以下是一个将JMXConnectorServerä½œäØ“MBean注册到MBeanServer的例å­ï¼š

Java代ç 
  1. // The address of the connector   
  2. JMXServiceURL address = new JMXServiceURL("service:jmx:rmi://host");  
  3.   
  4. // The environment map, null in this case   
  5. Map environment = null;  
  6.   
  7. JMXConnectorServer cntorServer = JMXConnectorServerFactory.newJMXConnectorServer(address, environment, null);  
  8.   
  9. // The MBeanServer to which the JMXConnectorServer will be registered in   
  10. MBeanServer server = MBeanServerFactory.createMBeanServer();  
  11.   
  12. // Register the JMXConnectorServer in the MBeanServer   
  13. ObjectName cntorServerName = ObjectName.getInstance("connectors:protocol=rmi");  
  14. server.registerMBean(cntorServer, cntorServerName);  
  15.   
  16. // Start the JMXConnectorServer   
  17. cntorServer.start();  
  18.   
  19. // An alternative way to start the JMXConnectorServer via the MBeanServer   
  20. server.invoke(cntorServerName, "start", null, null);  
  21.   
  22. // Yet another way to start the JMXConnectorServer via the MBeanServer   
  23. Object proxy = MBeanServerInvocationHandler.newProxyInstance(server, cntorServerName, JMXConnectorServerMBean.class, true);  
  24. JMXConnectorServerMBean cntorServerMBean = (JMXConnectorServerMBean)proxy;  
  25. cntorServerMBean.start();  

    éœ€è¦æ³¨æ„的是,在这个例å­ä¸­ä½¿ç”¨äº†ä¸‰¿Uä¸åŒçš„æ–¹å¼å¯åЍJMXConnectorServeråQšç¬¬ä¸€¿Uæ–¹å¼æ˜¯ç›´æŽ¥è°ƒç”¨cntorServer对象çš? startæ–ÒŽ³•åQ›ç¬¬äºŒç§æ–¹å¼æ˜¯é€šè¿‡MBeanServer调用MBean的方法;½W¬ä¸‰¿Uæ–¹å¼æ˜¯ä½¿ç”¨äº? MBeanServerInvocationHandleråQŒå®ƒ¾l§æ‰¿è‡ªInvocationHandleråQŒç”¨äºŽä»ŽMBeançš„ç®¡ç†æŽ¥å£å‘ MBeanServer中的 MBean è½¬å‘æ–ÒŽ³•调用。当调用从newProxyInstance()æ–ÒŽ³•˜q”回的代ç†å¯¹è±¡ä¸Šçš„toString()ã€hashCode() å’Œequals(Object)½{‰æ–¹æ³•æ—¶åQŒè¿™äº›æ–¹æ³•è°ƒç”¨åŒæ ·ä¹Ÿä¼šè¢«è½¬å‘到MBeanServer中的MBean åQŒå› æ­¤å½“且仅å½?MBean 在其½Ž¡ç†æŽ¥å£ä¸­å£°æ˜Žäº†˜q™äº›æ–ÒŽ³•æ—¶æ‰èƒ½å¦‚æ­¤æ“作,å¦åˆ™ä¼šæŠ›å‡ºå¼‚常ã€?/p>

 

2.3 JMXConnector
   JMXConnector是客æˆïL«¯çš„组ä»Óž¼Œå®¢æˆ·ç«¯ç¨‹åºé€šè¿‡å®ƒè¿žæŽ¥åˆ°˜qœç¨‹çš„MBeanServer。客æˆïL«¯å¯ä»¥é€šè¿‡JMXConnector获得˜qœç¨‹ MBeanServerçš„MBeanServerConnection 接å£åQŒåƈ以类似本地的方å¼ä½¿ç”¨å®ƒã€‚JMXConnector˜q˜æ”¯æŒåœ¨˜qœç¨‹çš„MBeanServer上注册本地或者远½E‹çš„通知监å¬å™¨ï¼Œä»¥æŽ¥æ”¶æ¥è‡ªè¿œ½E? MBeanServer的通知ã€?br />    最好通过JMXConnectorFactoryæ¥åˆ›å»ºJMXConnectoråQŒä¾‹å¦‚:

Java代ç 
  1. // The address of the connector server   
  2. JMXServiceURL address = ...;  
  3.   
  4. // The environment map, null in this case   
  5. Map environment = null;  
  6.   
  7. // Create the JMXCconnectorServer   
  8. JMXConnector cntor = JMXConnectorFactory.connect(address, environment);  
  9.   
  10. // Obtain a "stub" for the remote MBeanServer   
  11. MBeanServerConnection mbsc = cntor.getMBeanServerConnection();  
  12.   
  13. // Call the remote MBeanServer   
  14. String domain = mbsc.getDefaultDomain();  
  15. 也å¯ä»¥å…ˆå®žä¾‹åŒ–JMXConnectoråQŒç„¶åŽåœ¨˜qžæŽ¥åˆ°MBeanServeråQŒä¾‹å¦‚:  
  16. // The address of the connector server   
  17. JMXServiceURL address = ...;  
  18.   
  19. // The creation environment map, null in this case   
  20. Map creationEnvironment = null;  
  21.   
  22. // Create the JMXCconnectorServer   
  23. JMXConnector cntor = JMXConnectorFactory.newJMXConnector(address, creationEnvironment);  
  24.   
  25. // The connection environment map, null in this case   
  26. // May contain - for example - user's credentials   
  27. Map connectionEnvironment = null;  
  28.   
  29. // Connect   
  30. cntor.connect(connectionEnvironment);  
  31.   
  32. // Obtain a "stub" for the remote MBeanServer   
  33. MBeanServerConnection mbsc = cntor.getMBeanServerConnection();  
  34.   
  35. // Call the remote MBeanServer   
  36. String domain = mbsc.getDefaultDomain();  

    éœ€è¦æ³¨æ„的是,以上的例å­ä¸­é‡‡ç”¨äº†ä¸¤ä¸ªä¸åŒçš„Map对象ä¿å­˜ç›¸å…³çš„属性:一个用于实例化åQ›å¦å¤–一个用于连接。MBeanServerConnection 接å£åœ¨JMX 1.2中定义,用于支æŒremote API。由于之å‰ç‰ˆæœ¬çš„MBeanServer接å£ä¸èƒ½ç›´æŽ¥è¢«å®¢æˆïL«¯ä½¿ç”¨åQˆä¾‹å¦‚å…¶registerMBean(), deserialize(), getClassLoader()½{‰æ–¹æ³•对于客æˆïL«¯æ¥è¯´æ²¡æœ‰æ„义åQ‰ï¼Œå› æ­¤åœ¨JMX 1.2中,MBeanServer接壾l§æ‰¿è‡ªMBeanServerConnection接å£ã€?br />
    RMIConnector是标准的JMXConnector。由于它使用RMIåè®®åQŒå› æ­¤éœ€è¦ä¸€ä¸ªstub objectæ¥å¤„ç†RMI调用的细节。stub class通常存在于客æˆïL«¯çš„类路径上,但是stub objecté€šå¸¸æ˜¯ä»Žå‘½åæœåŠ¡å™¨å¤„ä¸‹è²åQŒå› æ­¤RMI客户端需è¦çŸ¥é“stub object被绑定到RMI server上的路径。JSR 160定义了两¿U获得stub object的方å¼ï¼š
    ½W¬ä¸€¿Uæ–¹å¼ä¸éœ€è¦å‘½åæœåС噍åQŒè€Œæ˜¯ž®†stub object¾~–ç ä¸ºJMXServiceURL的一部分åQŒå³"encoded form"。如果采用RMI/JRMPåè®®åQŒé‚£ä¹ˆå¯¹stub object被åºåˆ—化之åŽçš„æ‰€æœ‰å­—节进行Base64¾~–ç åQŒç„¶åŽå°†¾~–ç åŽçš„字符æ·ÕdŠ åˆ°JMXServiceURL中,òq¶ä¸”ä»?stub/开始;如果采用 RMI/ IIOPåQŒé‚£ä¹ˆIOR被添加到JMXServiceURL中,òq¶ä»¥/ior/开始。以下是个例å­ï¼š

Java代ç 
  1. // JRMP encoded form   
  2. service:jmx:rmi://localhost/stub/rO0ABXNyAC5qYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5ybWkuUk1JU2VydmVySW1wbF9TdHViAAAAAAAAAAICAAB4cgAaamF2YS5ybWkuc2VydmVyLlJlbW90ZVN0dWLp/tzJi+FlGgIAAHhyABxqYXZhLnJtaS5zZXJ2ZXIuUmVtb3RlT2JqZWN002G0kQxhMx4DAAB4cHc5AAtVbmljYXN0UmVmMgAADjE2LjE5Mi4xMjAuMTI5AAANcQAAAAAAAAAIAOgIQgAAAPlXjcJugAEAeA==  
  3.   
  4. // IIOP encoded form   
  5. service:jmx:iiop://localhost/ior/IOR:000000000000003b524d493a6a617661782e6d616e6167656d656e742e72656d6f74652e726d692e524d495365727665723a303030303030303030303030303030300000000000010000000000000068000102000000000f31362e3139322e3132302e31323900000d93000000000019afabcb0000000002578f08b80000000800000000000000000a0000000000000100000001000000200000000000010001000000020501000100010020000101090000000100010100  

    ½W¬äºŒ¿Uæ–¹å¼æ˜¯åœ¨JMXServiceURLä¸­æŒ‡å®šå‘½åæœåŠ¡å™¨å’Œstub object被绑定到的JNDI路径åQŒå³"JNDI form"。在JMXServiceURL中以/jndi/开始。将JNDI的相关酾|®ä¼ é€’ç»™RMIConnectorçš„æ–¹å¼æœ‰å¤šç§ã€‚例如URL 'rmi://namingHost:1099/jndiPath'æŒ‡æ˜Žå‘½åæœåŠ¡å™¨åœ¨å䨓'namingHost'的主æœÞZ¸Šòq¶ç›‘å?099端å£åQŒå‘½åæœåŠ? 器是rmiregistryåQŒèµ\径是'/jndiPath'ã€‚åŒæ ·URL 'iiop://namingHost:900/jndiPath'æŒ‡æ˜Žå‘½åæœåŠ¡å™¨åœ¨å䨓'namingHost'的主æœÞZ¸Šòq¶ç›‘å?00端å£åQŒå‘½åæœåС噍 是COSå‘½åæœåŠ¡åQŒèµ\径是'/jndiPath'。以下是个例å­ï¼š

Java代ç 
  1. // JNDI URL form for JRMP   
  2. service:jmx:rmi://rmiHost/jndi/rmi://namingHost:1099/jndiPath  
  3.   
  4. // JNDI URL form for IIOP   
  5. service:jmx:iiop://rmiHost/jndi/iiop://namingHost:900/jndiPath  

    此外åQŒJNDI属性也å¯ä»¥é€šè¿‡¾pÈ»Ÿå±žæ€§ã€ç±»è·¯å¾„上的'jndi.properties'æ–‡äšgã€åœ¨è°ƒç”¨JMXConnector.connect(Map environment)或者JMXConnectorFactory.connect(JMXServiceURL url, Map environment)æ–ÒŽ³•时传递的environment傿•°½{‰ä¸åŒæ–¹å¼æŒ‡å®šã€‚如果JNDI属性通过˜q™äº›æ–¹å¼æŒ‡å®šåQŒé‚£ä¹ˆJMXServiceURLä¸? å¯ä»¥ä½¿ç”¨½Ž€çŸ­çš„JNDIæ ¼å¼åQŒå³åªæŒ‡å®šJNDI path。以下是个例å­ï¼š

Java代ç 
  1. // JNDI short form for JRMP   
  2. service:jmx:rmi://rmiHost/jndi/jndiPath  
  3.   
  4. // JNDI short form for IIOP   
  5. service:jmx:iiop://rmiHost/jndi/jndiPath  
  6.   
  7. // Code example that uses the JNDI short form specifying JNDI properties via environment Map   
  8. // The JNDI environment   
  9. Map environment = new HashMap();  
  10. environment.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");  
  11. environment.put(Context.PROVIDER_URL, "rmi://namingHost:1099");  
  12. // The JNDI short form JMXServiceURL   
  13. JMXServiceURL url = new JMXServiceURL("service:jmx:rmi://rmiHost/jndi/jndiPath");  
  14. // Connect to the server side   
  15. JMXConnector connector = JMXConnectorFactory.connect(url, environment);  

 

2.4 Remote Notification
    JSR 160定义的连接器å¯ä»¥æŽ¥æ”¶åˆ°è¿œ½E‹MBeanå‘é€çš„通知。通知被传递的¾l†èŠ‚ä¾èµ–于连接器使用的åè®®ã€‚è¦æŽ¥æ”¶é€šçŸ¥åQŒå®¢æˆïL«¯å¿…é¡»è¦é€šè¿‡è°ƒç”¨ MBeanServerConnection.addNotificationListener(...)æ–ÒŽ³•æ¥æ³¨å†Œä¸€ä¸ªç›‘å¬å™¨åQŒè¿™ä¸ªæ–¹æ³•有两个é‡è²çš„版 本:
    ½W¬ä¸€ä¸ªç‰ˆæœ¬æŽ¥å—一个ObjectNameå®žä¾‹ä½œäØ“ç›‘å¬å™¨ï¼Œç”׃ºŽç›‘å¬å™¨æ˜¯˜qœç¨‹MBeanServer中的一个MBeanåQŒå› æ­¤æ–¹æ³•中的filterå’Œhandback傿•°å¿…须被传递到˜qœç¨‹çš„MBeanServeråQŒå› æ­¤å®ƒä»¬å¿…™åÀL˜¯å¯ä»¥è¢«åºåˆ—化的ã€?br />    å¦ä¸€ä¸ªç‰ˆæœ¬æŽ¥å—NotificationListener的实例作为监å¬å™¨ã€‚这个监å¬å™¨æ˜¯å®¢æˆïL«¯çš„æœ¬åœ°å¯¹è±¡ï¼Œè€Œä¸”监å¬å™¨å¯¹è±¡ä¸ä¼šè¢«ä¼ é€’到˜qœç¨‹çš? MBeanServeråQŒå› æ­¤å®ƒä¹Ÿä¸å¿…是å¯ä»¥è¢«åºåˆ—化的。NotificationFilter是å¦è¢«ä¼ é€’到˜qœç¨‹çš„MBeanServerå–决äº? connector使用的å议,handback对象ä¸ä¼šè¢«ä¼ é€’到˜qœç¨‹MBeanServer。在å¦ä¸€æ–šw¢åQŒè¿œ½E‹çš„MBeanå‘é€çš„通知必须是å¯ä»¥è¢«åºåˆ— 化的åQŒå› ä¸ºé€šçŸ¥ä¼šè¢«ä¼ é€’到客户端。以下是在远½E‹çš„MBean上注册监å¬å™¨çš„例å­ï¼š

Java代ç 
  1. // The address of the connector server   
  2. JMXServiceURL address = ...;  
  3.   
  4. // The JMXConnector   
  5. JMXConnector connector = JMXConnectorFactory.connect(address);  
  6.   
  7. // The MBeanServerConnection "stub"   
  8. MBeanServerConnection mbsc = connector.getMBeanServerConnection();  
  9.   
  10. // The MBeanServerDelegate emits notifications about registration/unregistration of MBeans   
  11. ObjectName delegateName = ObjectName.getInstance("JMImplementation:type=MBeanServerDelegate");  
  12.   
  13. NotificationListener listener = new NotificationListener()  
  14. {  
  15.    public void handleNotification(Notification notification, Object handback)  
  16.    {  
  17.       // Do something  
  18.    }  
  19. };  
  20.   
  21. mbsc.addNotificationListener(delegateName, listener, null, null);  

 

3 JMX Remoting Security
    JSR 160æä¾›äº†ä¸€¿U坿’æ‹”çš„è®¤è¯æœºåˆÓž¼Œå®ƒåŸºäºŽJMXAuthenticator接å£ã€‚JMXAuthenticator接å£ä¸­åªåŒ…å«å¦‚下一个方法,它接å—从 客户端得到的íw«ä†¾è¯æ˜Žä¿¡æ¯ä½œäØ“å‚æ•°åQŒè¿”回javax.security.auth.Subject对象的一个实例ã€?/p>

Java代ç 
  1. public  Subject authenticate(Object credentials)  throws  SecurityException  

    以下是在JMXConnectorServer 中ä‹É用JMXAuthenticator的例å­ï¼š

Java代ç 
  1. // The address of the connector server   
  2. JMXServiceURL address = ...;  
  3.   
  4. // The JMXAuthenticator implementation   
  5. JMXAuthenticator authenticator = ...;  
  6.   
  7. // The environment map   
  8. Map environment = new HashMap();  
  9. environment.put(JMXConnectorServer.AUTHENTICATOR, authenticator);  
  10.   
  11. // The MBeanServer to which the JMXConnectorServer will be attached to   
  12. MBeanServer server = MBeanServerFactory.createMBeanServer();  
  13.   
  14. // Create the JMXCconnectorServer   
  15. JMXConnectorServer cntorServer = JMXConnectorServerFactory.newJMXConnectorServer(address, environment, server);  
  16.   
  17. // Start the JMXConnectorServer   
  18. cntorServer.start();  

    以下是在JMXConnector中ä‹É用JMXAuthenticator的例å­ï¼š

Java代ç 
  1. // The address of the connector server   
  2. JMXServiceURL address = ...;  
  3.   
  4. // Create the JMXCconnectorServer   
  5. JMXConnector cntor = JMXConnectorFactory.newJMXConnector(address, null);  
  6.   
  7. // The credentials   
  8. Object credentials = ...;  
  9.   
  10. // The connection environment map   
  11. Map environment = new HashMap();  
  12. environment.put(JMXConnector.CREDENTIALS, credentials);  
  13.   
  14. // Connect and invoke an operation on the remote MBeanServer   
  15. try   
  16. {  
  17.    cntor.connect(environment);  
  18. }  
  19. catch  (SecurityException x)  
  20. {  
  21.    // Uh-oh ! Bad credentials !  
  22.    throw x;  
  23. }  
  24.   
  25. // Obtain a stub for the remote MBeanServer   
  26. MBeanServerConnection mbsc = cntor.getMBeanServerConnection();  
  27.   
  28. // Call the remote MBeanServer   
  29. ObjectName delegate = ObjectName.getInstance("JMImplementation:type=MBeanServerDelegate");  
  30. String id = mbsc.getAttribute(delegate, "MBeanServerId");  

    当调用从JMXConnector 得到的MBeanServerConnection 接å£ä¸Šçš„æ–ÒŽ³•æ—Óž¼Œæœ€¾lˆå‘生在˜qœç¨‹MBeanServer的调用会以认è¯åŽçš„Subject íw«ä†¾æ‰§è¡Œã€‚如果ä‹É用SecurityManageråQŒé‚£ä¹ˆè¿˜å¯ä»¥ä¸ÞZ¸åŒçš„Subject指定ä¸åŒçš„æƒé™ã€?/p>

]]>
Spring JMShttp://www.aygfsteel.com/libin2722/articles/330632.html½C¼ç‰©½C¼ç‰©Wed, 01 Sep 2010 14:33:00 GMThttp://www.aygfsteel.com/libin2722/articles/330632.htmlhttp://www.aygfsteel.com/libin2722/comments/330632.htmlhttp://www.aygfsteel.com/libin2722/articles/330632.html#Feedback0http://www.aygfsteel.com/libin2722/comments/commentRss/330632.htmlhttp://www.aygfsteel.com/libin2722/services/trackbacks/330632.html

1 DestinationResolver
    DestinationResolver接å£çš„作用是ž®†æŒ‡å®šçš„目的地åè§£æžä¸ºç›®çš„地实例。其定义如下åQ?/p>

Java代ç 
  1. public   interface  DestinationResolver {  
  2.     Destination resolveDestinationName(Session session, String destinationName,   
  3.         boolean pubSubDomain) throws JMSException;  
  4. }  

    傿•°pubSubDomain用于指定是ä‹É用“å‘å¸?è®¢é˜…â€æ¨¡å¼ï¼ˆè§£æžåŽçš„目的地是TopicåQ‰ï¼Œ˜q˜æ˜¯ä½¿ç”¨â€œç‚¹å¯¹ç‚¹â€æ¨¡å¼ï¼ˆè§£æžåŽçš„目的地是QueueåQ‰ã€?/p>

 

    CachingDestinationResolver接壾l§æ‰¿äº†DestinationResolveråQŒå¢žåŠ äº†¾~“存的功能,其接å£å®šä¹‰å¦‚下:

Java代ç 
  1. public   interface  CachingDestinationResolver  extends  DestinationResolver {  
  2.     void removeFromCache(String destinationName);  
  3.     void clearCache();  
  4. }  

    在目的地失效的时候,removeFromCacheæ–ÒŽ³•会被调用åQ›åœ¨JMS provider失效的时候,clearCacheæ–ÒŽ³•会被调用ã€?br />
1.1 DynamicDestinationResolver
    DynamicDestinationResolver实现了DestinationResolver接å£ã€‚æ ¹æ®æŒ‡å®šçš„目的地ååQŒDynamicDestinationResolver会动æ€åˆ›å»ºç›®çš„地实例。针对JMS1.1规范åQŒå®ƒé‡‡ç”¨å¦‚下æ–ÒŽ³•创å¾ç›®çš„圎ͼš

Java代ç 
  1. session.createTopic(topicName)  
  2. session.createQueue(queueName);  


1.2 JndiDestinationResolver
    JndiDestinationResolver¾l§æ‰¿è‡ªJndiLocatorSupportåQ? åŒæ—¶å®žçŽ°äº†CachingDestinationResolver接å£ã€‚如果在JMS provider中酾|®äº†é™æ€ç›®çš„地åQŒé‚£ä¹ˆJndiDestinationResolver通过JNDI查找的方å¼èŽ·å¾—ç›®çš„åœ°å®žä¾‹ã€?/p>


    JndiDestinationResolverçš„fallbackToDynamicDestination属性用于指定在JNDI查找å¤ÞpÓ|åŽï¼Œæ˜¯å¦ä½? 用动æ€ç›®çš„地åQŒé»˜è®¤å€¼æ˜¯false。JndiDestinationResolverçš„cache属性用于指定是å¦å¯¹ç›®çš„地实例进行缓存,默认值是 trueã€?/p>

 

1.3 BeanFactoryDestinationResolver
    BeanFactoryDestinationResolver实现了DestinationResolver接å£å’ŒBeanFactoryAware接å£ã€‚å®ƒä¼šæ ¹æ®æŒ‡å®šçš„目的地å从BeanFactory中查扄¡›®çš„地实例。以下是相关的代ç ï¼š

Java代ç 
  1. public  Destination resolveDestinationName(Session session, String destinationName,   
  2. boolean  pubSubDomain)  throws  JMSException {  
  3.     Assert.state(this.beanFactory != null, "BeanFactory is required");  
  4.     try {  
  5.         return (Destination) this.beanFactory.getBean(destinationName, Destination.class);  
  6.     }  
  7.     catch (BeansException ex) {  
  8.         throw new DestinationResolutionException(  
  9.             "Failed to look up Destinaton bean with name '" + destinationName + "'", ex);  
  10.     }  
  11. }  

 

2 JmsAccessor
    抽象¾c»JmsAccessor是JmsTemplateã€SimpleMessageListenerContainerå’? DefaultMessageListenerContainer½{‰concrete class的基¾c…R€‚JmsAccessor定义了如下几个用于访问JMSæœåŠ¡çš„å…±é€šå±žæ€§ã€?/p>

Java代ç 
  1. private  ConnectionFactory connectionFactory;  
  2. private   boolean  sessionTransacted =  false ;  
  3. private   int  sessionAcknowledgeMode = Session.AUTO_ACKNOWLEDGE;  


    JmsAccessoræä¾›äº†åˆ›å»ºConnectionå’ŒSession的方法,如下åQ?/p>

Java代ç 
  1. protected  Connection createConnection()  throws  JMSException {  
  2.     return getConnectionFactory().createConnection();  
  3. }  
  4.   
  5. protected  Session createSession(Connection con)  throws  JMSException {  
  6.     return con.createSession(isSessionTransacted(), getSessionAcknowledgeMode());  
  7. }  

 
2.1 JmsDestinationAccessor
    抽象¾c»JmsDestinationAccessor¾l§æ‰¿è‡ªJmsAccessoråQŒå¢žåŠ äº†destinationResolverå’? pubSubDomain属性。destinationResolver的默认值是DynamicDestinationResolver的实例,也就æ˜? 说默认采用动æ€ç›®çš„地解æžçš„æ–¹å¼ï¼›pubSubDomain用于指定是ä‹É用“å‘å¸?è®¢é˜…â€æ¨¡å¼è¿˜æ˜¯ä‹Éç”¨â€œç‚¹å¯¹ç‚¹â€æ¨¡å¼ï¼Œé»˜è®¤å€¼æ˜¯falseã€?br />
    JmsDestinationAccessoræä¾›äº†ç”¨äºŽè§£æžç›®çš„地的方法,如下åQ?/p>

Java代ç 
  1. protected  Destination resolveDestinationName(Session session, String destinationName)   
  2. throws  JMSException {  
  3.     return getDestinationResolver().resolveDestinationName(session, destinationName,   
  4.         isPubSubDomain());  
  5. }  


2.2 AbstractJmsListeningContainer
    AbstractJmsListeningContainer¾l§æ‰¿è‡ªJmsDestinationAccessoråQŒä½œä¸ºæ‰€æœ‰Message Listener Container的公共基¾c…R€‚å®ƒä¸»è¦æä¾›äº†JMS connection的生命周期管ç†çš„功能åQŒä½†æ˜¯æ²¡æœ‰å¯¹æ¶ˆæ¯æŽ¥æ”¶çš„æ–¹å¼ï¼ˆä¸ÕdŠ¨æŽ¥æ”¶æ–¹å¼æˆ–者异步接收方å¼ï¼‰½{‰åšä»ÖM½•å‡å®šã€‚该¾cÖM¸»è¦çš„属性如下:

Java代ç 
  1. private  String clientId;  
  2. private  Connection sharedConnection;  

    clientId通常用于æŒä¹…订阅åQ›sharedConnectionä¿å­˜äº†è¢«å…׃ínçš„JMS connectionã€?/p>

 

    该类定义了如下的抽象æ–ÒŽ³•åQŒä»¥ä¾¿å­¾cÕd¯ä»¥å†³å®šæ˜¯å¦ä‹É用共享的JMS connectionã€?/p>

Java代ç 
  1. protected   abstract   boolean  sharedConnectionEnabled();  

 

2.3 AbstractMessageListenerContainer
    AbstractMessageListenerContainer¾l§æ‰¿è‡ªAbstractJmsListeningContaineråQŒä¹Ÿæ˜¯ä½œä¸ºæ‰€æœ‰Message Listener Container的公共基¾c…R€‚该¾cÖM¸»è¦çš„属性如下:

Java代ç 
  1. private   volatile  Object destination;  
  2. private   volatile  Object messageListener;  
  3. private   boolean  exposeListenerSession =  true ;  

    destination用于指定接收消æ¯çš„目的地ã€?br />     messageListenerç”¨äºŽæŒ‡å®šå¤„ç†æ¶ˆæ¯çš„listener。对于messageListeneråQŒå®ƒæ—¢å¯ä»¥æ˜¯½W¦åˆJMS规范çš? javax.jms.MessageListeneråQŒä¹Ÿå¯ä»¥æ˜¯Springç‰ÒŽœ‰çš? org.springframework.jms.listener.SessionAwareMessageListenerã€? SessionAwareMessageListener的定义如下:

Java代ç 
  1. public   interface  SessionAwareMessageListener {  
  2.     void onMessage(Message message, Session session) throws JMSException;  
  3. }  

    è·Ÿjavax.jms.MessageListener相比åQŒè¿™ä¸ªæŽ¥å£çš„onMessageæ–ÒŽ³•增加了一个Session ¾cÕdž‹çš„傿•ŽÍ¼Œå¯ä»¥é€šè¿‡˜q™ä¸ªsessionå‘é€å›žå¤æ¶ˆæ¯ï¼ˆreply messageåQ‰ã€?/p>


    如果使用了SessionAwareMessageListener ¾cÕdž‹çš„message listeneråQŒé‚£ä¹ˆexposeListenerSession傿•°æŒ‡å®šäº†ä¼ å…¥onMessageæ–ÒŽ³•çš„session傿•°æ˜¯å¦æ˜¯åˆ›å»ÞZº† MessageConsumerçš„sessionåQŒé»˜è®¤å€¼æ˜¯true。如果是falseåQŒé‚£ä¹? AbstractMessageListenerContainer会在connection上新å»ÞZ¸€ä¸ªsessionåQŒåƈ传入onMessageæ–ÒŽ³•ã€?br />
2.4 AbstractPollingMessageListenerContainer
    AbstractPollingMessageListenerContainer¾l§æ‰¿è‡ªAbstractMessageListenerContaineråQŒå®ƒæä¾›äº†å¯¹äºŽä¸»åŠ¨æŽ¥æ”¶æ¶ˆæ?polling)的支æŒï¼Œä»¥åŠæ”¯æŒå¤–部的事务管ç†ã€?/p>

Java代ç 
  1. private   boolean  pubSubNoLocal =  false ;  
  2. private   long  receiveTimeout = DEFAULT_RECEIVE_TIMEOUT;  
  3. private  PlatformTransactionManager transactionManager;  

    如果使用“å‘å¸?è®¢é˜…â€æ¨¡å¼ï¼Œé‚£ä¹ˆpubSubNoLocal 属性指定通过æŸä¸ª˜qžæŽ¥å‘é€åˆ°æŸä¸ªTopic的消æ¯ï¼Œæ˜¯å¦åº”该被投递回˜q™ä¸ª˜qžæŽ¥ã€?/p>


    receiveTimeout属性用于指定调用MessageConsumerçš„receiveæ–ÒŽ³•æ—¶çš„­‘…æ—¶æ—‰™—´åQŒé»˜è®¤å€¼æ˜¯1¿U’ã€‚éœ€è¦æ³¨æ„的是,˜q™ä¸ªå€¼åº”该比transactionManager 中指定的事务­‘…æ—¶æ—‰™—´ç•¥å°ã€?/p>


    通常情况下,应该为transactionManager讄¡½®ä¸€ä¸? org.springframework.transaction.jta.JtaTransactionManager的实例,此外也è¦è®„¡½®ä¸€ä¸ªæ”¯æŒ? XAçš„ConnectionFactoryã€‚éœ€è¦æ³¨æ„的是,XA 事务å¯ÒŽ€§èƒ½æœ‰è¾ƒå¤§çš„å½±å“ã€?br />     å¦‚æžœåªæ˜¯å¸Œæœ›ä½¿ç”¨local JMS transactionåQŒé‚£ä¹ˆåªè¦è®¾¾|®sessionTransacted为true或者ä‹É用JmsTransactionManagerå›_¯ã€‚实际上åQ? 如果讄¡½®äº†éžJTAçš„transactionManageråQŒé‚£ä¹ˆsessionTransacted属性会自动被设¾|®æˆtrueã€?br />     ç”׃ºŽlocal JMS transaction无法åŒå…¶å®ƒlocal transactionåQˆä¾‹å¦‚local database transactionåQ‰è¿›è¡Œå调,因此客户端程åºå¯èƒ½éœ€è¦å¯¹é‡å‘的消æ¯è¿›è¡Œæ£€æŸ¥ã€‚JMSè§„èŒƒè¦æ±‚åQšJMS provider应该ž®†é‡å‘消æ¯çš„JMSRedelivered属性设¾|®äØ“trueã€?br />
2.5 SimpleMessageListenerContainer
    SimpleMessageListenerContainer¾l§æ‰¿è‡ªAbstractMessageListenerContaineråQŒä‹É用异步方å¼? 接收消æ¯åQˆä¹Ÿž®±æ˜¯é€šè¿‡MessageConsumer上注册MessageListenerçš„æ–¹å¼æŽ¥æ”¶æ¶ˆæ¯ï¼‰ã€‚该¾cÖM¸»è¦çš„属性如下:

Java代ç 
  1. private   boolean  pubSubNoLocal =  false ;  
  2. private   int  concurrentConsumers =  1 ;  
  3. private  Set sessions;  
  4. private  Set consumers;  
  5. private  TaskExecutor taskExecutor;  

    如果使用“å‘å¸?è®¢é˜…â€æ¨¡å¼ï¼Œé‚£ä¹ˆpubSubNoLocal 属性指定通过æŸä¸ª˜qžæŽ¥å‘é€åˆ°æŸä¸ªTopic的消æ¯ï¼Œæ˜¯å¦åº”该被投递回˜q™ä¸ª˜qžæŽ¥ã€?/p>

 

    SimpleMessageListenerContainerå…许创å¾å¤šä¸ªSessionå’ŒMessageConsumeræ¥æŽ¥æ”¶æ¶ˆæ¯ã€‚具体的个数ç”? concurrentConsumerså±žæ€§æŒ‡å®šã€‚éœ€è¦æ³¨æ„çš„æ˜¯ï¼Œåº”è¯¥åªæ˜¯åœ¨Destination为Queue的时候æ‰ä½¿ç”¨å¤šä¸ª MessageConsumeråQˆQueue中的一个消æ¯åªèƒ½è¢«ä¸€ä¸ªConsumer接收åQ‰ï¼Œè™½ç„¶ä½¿ç”¨å¤šä¸ªMessageConsumer会æé«˜æ¶ˆæ¯å¤„ç? 的性能åQŒä½†æ˜¯æ¶ˆæ¯å¤„ç†çš„™åºåºå´å¾—ä¸åˆ°ä¿è¯åQšæ¶ˆæ¯è¢«æŽ¥æ”¶çš„顺åºä»ç„¶æ˜¯æ¶ˆæ¯å‘逿—¶çš„顺åºï¼Œä½†æ˜¯ç”׃ºŽæ¶ˆæ¯å¯èƒ½ä¼šè¢«òq¶å‘处ç†åQŒå› æ­¤æ¶ˆæ¯å¤„ç†çš„™åºåºå¯èƒ½å’Œæ¶ˆæ¯å‘é€çš„ ™åºåºä¸åŒã€‚此外,ä¸åº”该在Destination为Topic的时候ä‹É用多个MessageConsumeråQŒè¿™æ˜¯å› ä¸ºå¤šä¸? MessageConsumerä¼šæŽ¥æ”¶åˆ°åŒæ ·çš„æ¶ˆæ¯ã€?/p>

    SimpleMessageListenerContainer创å¾çš„Sessionå’ŒMessageConsumer分别ä¿å­˜åœ¨sessionså’Œconsumers属性中ã€?/p>


    taskExecutor属性的默认值是nullåQŒä¹Ÿž®±æ˜¯è¯ß_¼Œå¯¹MessageListeneråQˆæˆ–è€? SessionAwareMessageListeneråQ‰çš„回调是在MessageConsumer的内部线½E‹ä¸­æ‰§è¡Œã€‚如果指定了 taskExecutoråQŒé‚£ä¹ˆå›žè°ƒæ˜¯åœ¨TaskExecutor内部的线½E‹ä¸­æ‰§è¡Œã€‚以下是相关的代ç ï¼š

Java代ç 
  1. protected  MessageConsumer createListenerConsumer( final  Session session)   
  2. throws  JMSException {  
  3.     Destination destination = getDestination();  
  4.     if (destination == null) {  
  5.         destination = resolveDestinationName(session, getDestinationName());  
  6.     }  
  7.     MessageConsumer consumer = createConsumer(session, destination);  
  8.   
  9.     if (this.taskExecutor != null) {  
  10.         consumer.setMessageListener(new MessageListener() {  
  11.             public void onMessage(final Message message) {  
  12.                 taskExecutor.execute(new Runnable() {  
  13.                     public void run() {  
  14.                         processMessage(message, session);  
  15.                     }  
  16.                 });  
  17.             }  
  18.         });  
  19.     }  
  20.     else {  
  21.         consumer.setMessageListener(new MessageListener() {  
  22.             public void onMessage(Message message) {  
  23.                 processMessage(message, session);  
  24.             }  
  25.         });  
  26.     }  
  27.   
  28.     return consumer;  
  29. }  

    éœ€è¦æ³¨æ„的是,如果指定了taskExecutoråQŒé‚£ä¹ˆæ¶ˆæ¯åœ¨è¢«taskExecutor内部的线½E‹å¤„ç†å‰åQŒå¯èƒ½å·²¾l被¼‹®è®¤˜q‡äº†åQˆå¤–层的 onMessageæ–ÒŽ³•å¯èƒ½å·²ç»æ‰§è¡Œ¾l“æŸäº†ï¼‰ã€‚因此如果ä‹É用事务Session或者Session.CLIENT_ACKNOWLEDGE¾cÕdž‹çš„确认模 å¼ï¼Œé‚£ä¹ˆå¯èƒ½ä¼šå¯¼è‡´é—®é¢˜ã€?/p>

 

    该类的sharedConnectionEnabledæ–ÒŽ³•åQˆåœ¨AbstractJmsListeningContainer中定义)æ€ÀL˜¯˜q”回trueåQ? å› æ­¤SimpleMessageListenerContainer会ä‹É用共享的JMS connectionã€?br />
2.6 DefaultMessageListenerContainer
    DefaultMessageListenerContainer¾l§æ‰¿è‡? AbstractPollingMessageListenerContaineråQŒä¸»è¦ä‹Éç”¨åŒæ­¥çš„æ–¹å¼æŽ¥æ”¶æ¶ˆæ¯åQˆä¹Ÿž®±æ˜¯é€šè¿‡å¾ªçŽ¯è°ƒç”¨ MessageConsumer.receiveçš„æ–¹å¼æŽ¥æ”¶æ¶ˆæ¯ï¼‰ã€‚该¾cÖM¸»è¦çš„属性如下:

Java代ç 
  1. private   int  concurrentConsumers =  1 ;  
  2. private   int  maxConcurrentConsumers =  1 ;  
  3. private   int  maxMessagesPerTask = Integer.MIN_VALUE;  
  4. private   int  idleTaskExecutionLimit =  1 ;  
  5. private   final  Set scheduledInvokers =  new  HashSet();  
  6. private  TaskExecutor taskExecutor;  
  7. private   int  cacheLevel = CACHE_AUTO;  

    è·ŸSimpleMessageListenerContainerä¸€æ øP¼ŒDefaultMessageListenerContainer也支æŒåˆ›å»ºå¤šä¸? Sessionå’ŒMessageConsumeræ¥æŽ¥æ”¶æ¶ˆæ¯ã€‚è·ŸSimpleMessageListenerContainerä¸åŒçš? 是,DefaultMessageListenerContainer创å¾äº†concurrentConsumers所指定个数çš? AsyncMessageListenerInvokeråQˆå®žçŽîCº†SchedulingAwareRunnable接å£åQ‰ï¼Œòq¶äº¤¾l? taskExecutor˜q行ã€?/p>


    maxMessagesPerTask属性的默认值是Integer.MIN_VALUEåQŒä½†æ˜¯å¦‚果设¾|®çš„taskExecutoråQˆé»˜è®¤å€¼æ˜¯ SimpleAsyncTaskExecutoråQ‰å®žçŽîCº†SchedulingTaskExecutor接å£òq¶ä¸”å…? prefersShortLivedTasksæ–ÒŽ³•˜q”回trueåQˆä¹Ÿž®±æ˜¯è¯´è¯¥TaskExecutor們֑于短期ä“Q务)åQŒé‚£ä¹? maxMessagesPerTask属性会自动被设¾|®äØ“10ã€?br />     如果maxMessagesPerTask属性的值å°äº?åQŒé‚£ä¹ˆAsyncMessageListenerInvoker.runæ–ÒŽ³•会在循环中åå¤å°è¯? 接收消æ¯åQŒåƈ在接收到消æ¯åŽè°ƒç”¨MessageListeneråQˆæˆ–者SessionAwareMessageListeneråQ‰ï¼›å¦‚æžœ maxMessagesPerTask属性的å€ég¸ž®äºŽ0åQŒé‚£ä¹ˆAsyncMessageListenerInvoker.runæ–ÒŽ³•里最多会ž®è¯•æŽ¥æ”¶æ¶ˆæ¯ maxMessagesPerTask‹Æ¡ï¼Œæ¯æ¬¡æŽ¥æ”¶æ¶ˆæ¯çš„超时时间由其父¾c? AbstractPollingMessageListenerContainerçš„receiveTimeout属性指定。如果在˜q™äº›ž®è¯•中都没有接收 到消æ¯ï¼Œé‚£ä¹ˆAsyncMessageListenerInvokerçš„idleTaskExecutionCount属性会被ç¯åŠ ã€‚åœ¨runæ–ÒŽ³•执行å®? 毕å‰ä¼šå¯¹idleTaskExecutionCount˜q›è¡Œ‹‚€æŸ¥ï¼Œå¦‚æžœè¯¥å€ÆD¶…˜q‡äº† DefaultMessageListenerContainer.idleTaskExecutionLimitåQˆé»˜è®¤å€?åQ‰ï¼Œé‚£ä¹ˆ˜q™ä¸ª AsyncMessageListenerInvokerå¯èƒ½ä¼šè¢«é”€æ¯ã€?/p>


    所有AsyncMessageListenerInvoker实例都ä¿å­˜åœ¨scheduledInvokers中,实例的个数å¯ä»¥åœ¨ concurrentConsumerså’ŒmaxConcurrentConsumers之间‹¹®åŠ¨ã€‚è·Ÿ SimpleMessageListenerContainerä¸€æ øP¼Œåº”è¯¥åªæ˜¯åœ¨Destination为Queue的时候æ‰ä½¿ç”¨å¤šä¸ª AsyncMessageListenerInvoker实例ã€?/p>

 

    cacheLevel属性用于指定是å¦å¯¹JMS资溘q›è¡Œ¾~“å­˜åQŒå¯é€‰çš„值是CACHE_NONE = 0ã€CACHE_CONNECTION = 1ã€CACHE_SESSION = 2ã€CACHE_CONSUMER = 3å’ŒCACHE_AUTO = 4。默认情况下åQŒå¦‚æžœtransactionManager属性ä¸ä¸ºnullåQŒé‚£ä¹ˆcacheLevel被自动设¾|®äØ“CACHE_NONEåQˆä¸˜q›è¡Œ¾~? 存)åQŒå¦åˆ™cacheLevel被自动设¾|®äØ“CACHE_CONSUMERã€?/p>


    如果cacheLevel属性值大于等于CACHE_CONNECTIONåQŒé‚£ä¹ˆsharedConnectionEnabledæ–ÒŽ³•åQˆåœ¨AbstractJmsListeningContainer中定义)˜q”回trueåQŒä¹Ÿž®±æ˜¯è¯´ä‹É用共享的JMS˜qžæŽ¥ã€?/p>

 

 

3 SingleConnectionFactory
    SingleConnectionFactory实现了ConnectionFactory接å£åQŒå…¶createConnectionæ–ÒŽ³•æ€ÀL˜¯˜q”回相åŒçš? Connection。å¯ä»¥åœ¨SingleConnectionFactory的构造函æ•îC¸­ä¼ å…¥Connection对象或è€? ConnectionFactory对象åQŒç”¨æ¥åˆ›å»ø™¢«ä»£ç†çš„连接对象ã€? SingleConnectionFactory.createConnectionæ–ÒŽ³•˜q”回的连接是个代ç†ï¼Œå®ƒå¿½ç•¥äº†å¯¹stopå’Œcloseæ–ÒŽ³•的调ç”? åQˆè¿žæŽ¥ä¼šåœ¨SingleConnectionFactory.destroyæ–ÒŽ³•中关闭)ã€?/p>


    SingleConnectionFactoryçš„reconnectOnExceptionå±žæ€§ç”¨æ¥æŒ‡å®šæ˜¯å¦åœ¨˜qžæŽ¥æŠ›å‡ºJMSException的时候,对连接进行釾|®ï¼Œé‡ç½®åŽå¦‚æžœå†è°ƒç”¨createConnectionæ–ÒŽ³•åQŒé‚£ä¹ˆä¼š˜q”回一个新的连接ã€?/p>


    éœ€è¦æ³¨æ„的是,AbstractJmsListeningContainer¾cÈš„抽象æ–ÒŽ³•sharedConnectionEnabled指定了是å¦åœ¨ message listener container内部使用å…׃ínçš„JMS˜qžæŽ¥ã€‚因此通常情况下ä¸éœ€è¦äØ“å•独的message listener container讄¡½®SingleConnectionFactoryåQˆåŠå…¶å­¾c»ï¼‰åQ›å¦‚果希望在ä¸åŒçš„message listener container之间å…׃ínJMS˜qžæŽ¥åQŒé‚£ä¹ˆå¯ä»¥è€ƒè™‘使用SingleConnectionFactoryã€?br />
3.1 CachingConnectionFactory
    CachingConnectionFactory¾l§æ‰¿è‡ªSingleConnectionFactoryåQŒå¢žåŠ äº†å¯¹Sessionå’ŒMessageProducer¾~“存的功能。该¾cÖM¸»è¦çš„属性如下:

Java代ç 
  1. private   int  sessionCacheSize =  1 ;  
  2. private   boolean  cacheProducers =  true ;  

    sessionCacheSize属性指定了被缓存的Session实例的个敎ͼˆé»˜è®¤å€¼æ˜¯1åQ‰ï¼Œä¹Ÿå°±æ˜¯è¯´åQŒå¦‚æžœåŒæ—¶è¯·æ±‚çš„Session个数大于sessionCacheSizeåQŒé‚£ä¹ˆè¿™äº›Sessionä¸ä¼šè¢«ç¼“存,而是正常的被创å¾å’Œé”€æ¯ã€?/p>


    cacheProducers属性指定了是å¦å¯¹MessageProducer˜q›è¡Œ¾~“å­˜åQŒé»˜è®¤å€¼æ˜¯trueã€?/p>

]]>
ActiveMQ5.0实战ä¸?使用Springå‘é€?消费topicå’Œqueue消æ¯http://www.aygfsteel.com/libin2722/articles/249400.html½C¼ç‰©½C¼ç‰©Wed, 31 Dec 2008 14:10:00 GMThttp://www.aygfsteel.com/libin2722/articles/249400.htmlhttp://www.aygfsteel.com/libin2722/comments/249400.htmlhttp://www.aygfsteel.com/libin2722/articles/249400.html#Feedback0http://www.aygfsteel.com/libin2722/comments/commentRss/249400.htmlhttp://www.aygfsteel.com/libin2722/services/trackbacks/249400.html½Ž€ä»?/h3>

实战一 , 实战二介¾l了ActiveMQ的基本概念和é…置方å¼.

本篇ž®†é€šè¿‡ä¸€ä¸ªå®žä¾‹ä»‹¾lä‹É用springå‘é€?消费topic, queue¾cÕdž‹æ¶ˆæ¯çš„æ–¹æ³? 䏿‡‚topicå’Œqueueçš„google ä¹?

 

如图½C? TOPICå’ŒQUEUE分别代表一个topic和一个queue消æ¯é€šé“.

  1. TopicMessageProducerå‘topicå‘逿¶ˆæ? TopicConsumerAå’ŒTopicConsumerB则从topic消费消æ¯.
  2. QueueMessageProducerå‘Queueå‘逿¶ˆæ? QueueConsumer从Queue中消è´Ò޶ˆæ?

Springæ•´åˆJMS

ž®±åƒå¯¹orm, web的支æŒä¸€æ ? springåŒæ ·æ”¯æŒjms, 为整åˆjms到已有的™å¹ç›®æä¾›äº†å¾ˆå¤šä¾¿åˆ©çš„æ–ÒŽ³•. 本篇主è¦è®²å®žæˆ? 是所以先从酾|®å¼€å§? springé…ç½®jms基本上需è¦?个部åˆ?

  1. ConnectionFactory. å’ŒjmsæœåŠ¡å™¨çš„˜qžæŽ¥, å¯ä»¥æ˜¯å¤–部的jms server, 也å¯ä»¥ä‹É用embedded ActiveMQ Broker.
  2. Destination. 有topicå’Œqueueä¸¤ç§æ–¹å¼.
  3. JmsTemplate. springæä¾›çš„jms模æ¿.
  4. MessageConverter. 消æ¯è½¬æ¢å™?
  5. MessageProducer. 消æ¯ç”Ÿäñ”è€?
  6. MessageConsumer. æ¶ˆæ¯æ¶ˆè´¹è€?
  7. MessageListener. 消æ¯ç›‘å¬å™?
  8. MessageListenerContainer. 消æ¯ç›‘å¬å®¹å™¨

下é¢ä»¥å®žä¾‹çš„æ–¹å¼ä»‹ç»ä¸Šé¢8个部åˆ?

1. ConnectionFactory

Xmlä»£ç  å¤åˆ¶ä»£ç 
  1. <amq:connectionFactory id="jmsConnectionFactory" brokerURL="vm://localhost" />  

 brokerURL是指è¦è¿žæŽ¥çš„activeMQ server的地å€, activeMQæä¾›äº†å¤š¿UbrokerURL, 集体å¯å‚è§æ–‡æ¡?一般我们ä‹É用嵌套的ActiveMQ server. é…置如下, ˜q™ä¸ªé…置使用消æ¯çš„存储机åˆ? æœåС噍é‡å¯ä¹Ÿä¸ä¼šä¸¢å¤±æ¶ˆæ¯.

Xmlä»£ç  å¤åˆ¶ä»£ç 
  1. <!--  embedded ActiveMQ Broker -->  
  2.     <amq:broker useJmx="false" persistent="true">  
  3.         <amq:persistenceAdapter>  
  4.             <amq:amqPersistenceAdapter directory="d:/amq"/>  
  5.         </amq:persistenceAdapter>  
  6.         <amq:transportConnectors>  
  7.             <amq:transportConnector uri="tcp://localhost:61616" />  
  8.                        <amq:transportConnector uri="vm://localhost:0" />  
  9.         </amq:transportConnectors>  
  10.     </amq:broker>  

 2. Destination

 åœ¨å®žä¾‹ä¸­æˆ‘们使用了两¿Udestination

Xmlä»£ç  å¤åˆ¶ä»£ç 
  1. <!--  ActiveMQ destinations  -->  
  2. <!--  ä½¿ç”¨topicæ–¹å¼-->  
  3. <amq:topic name="TOPIC" physicalName="JMS-TEST-TOPIC" />  
  4. <!--  ä½¿ç”¨Queueæ–¹å¼-->  
  5. <amq:queue name="QUEUE" physicalName="JMS-TEST-QUEUE" />  

 3. JmsTemplate

Xmlä»£ç  å¤åˆ¶ä»£ç 
  1. <!--  Spring JmsTemplate config -->  
  2.     <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">  
  3.         <property name="connectionFactory">  
  4.             <!--  lets wrap in a pool to avoid creating a connection per send -->  
  5.             <bean class="org.springframework.jms.connection.SingleConnectionFactory">  
  6.                 <property name="targetConnectionFactory" ref="jmsConnectionFactory" />  
  7.             </bean>  
  8.         </property>  
  9.         <!-- custom MessageConverter -->  
  10.         <property name="messageConverter" ref="defaultMessageConverter" />  
  11.     </bean>  

  4. MessageConverter

   MessageConverter实现的是org.springframework.jms.support.converter.MessageConverter接å£, æä¾›æ¶ˆæ¯çš„è{æ¢åŠŸèƒ? DefaultMessageConverter的实现è§é™„äšg.

Xmlä»£ç  å¤åˆ¶ä»£ç 
  1. <bean id="defaultMessageConverter" class="com.andyao.activemq.DefaultMessageConverter" />  

  5. MessageProducer

   实例拥有两个消æ¯ç”Ÿäñ”è€? 消æ¯ç”Ÿäñ”者都是POJO, 实现è§é™„ä»?

Xmlä»£ç  å¤åˆ¶ä»£ç 
  1. <!-- POJO which send Message uses  Spring JmsTemplate -->  
  2.     <bean id="topicMessageProducer" class="com.andyao.activemq.TopicMessageProducer">  
  3.         <property name="template" ref="jmsTemplate" />  
  4.         <property name="destination" ref="TOPIC" />  
  5.     </bean>  
  6.     <bean id="queueMessageProducer" class="com.andyao.activemq.QueuMessageProducer">  
  7.         <property name="template" ref="jmsTemplate" />  
  8.         <property name="destination" ref="QUEUE" />  
  9.     </bean>  

 6. MessageConsumer

 TOPICé€šé“æœ‰ä¸¤ä¸ªæ¶ˆæ¯æ¶ˆè´¹è€? QUEUEæœ‰ä¸€ä¸ªæ¶ˆæ¯æ¶ˆè´¹è€?/p>

Xmlä»£ç  å¤åˆ¶ä»£ç 
  1. <!--  Message Driven POJO (MDP) -->  
  2.     <!-- consumer1 for topic a -->  
  3.     <bean id="topicConsumerA" class="com.andyao.activemq.TopicConsumerA" />  
  4.     <!-- consumer2 for topic a -->  
  5.     <bean id="topicConsumerB" class="com.andyao.activemq.TopicConsumerB" />  
  6.     <!-- consumer for queue -->  
  7.     <bean id="queueConsumer" class="com.andyao.activemq.QueueConsumer" />  

  7. MessageListener

æ¯ä¸€ä¸ªæ¶ˆæ¯æ¶ˆè´¹è€…都对应一个MessageListener

Xmlä»£ç  å¤åˆ¶ä»£ç 
  1. <bean id="topicListenerA" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">  
  2.         <constructor-arg ref="topicConsumerA" />  
  3.         <!--  may be other method -->  
  4.         <property name="defaultListenerMethod" value="receive" />  
  5.         <!-- custom MessageConverter define -->  
  6.         <property name="messageConverter" ref="defaultMessageConverter" />  
  7.     </bean>  
  8.   
  9.     <bean id="topicListenerB" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">  
  10.         <constructor-arg ref="topicConsumerB" />  
  11.         <!--  may be other method -->  
  12.         <property name="defaultListenerMethod" value="receive" />  
  13.         <!-- custom MessageConverter define -->  
  14.         <property name="messageConverter" ref="defaultMessageConverter" />  
  15.     </bean>  
  16.   
  17.     <bean id="queueListener" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">  
  18.         <constructor-arg ref="queueConsumer" />  
  19.         <!--  may be other method -->  
  20.         <property name="defaultListenerMethod" value="receive" />  
  21.         <!-- custom MessageConverter define -->  
  22.         <property name="messageConverter" ref="defaultMessageConverter" />  
  23.     </bean>  

 8. MessageListenerContainer

 æœ‰å‡ ä¸ªMessageListener既有几个MessageListenerContainer

Xmlä»£ç  å¤åˆ¶ä»£ç 
  1. <bean id="topicListenerContainerA" class="org.springframework.jms.listener.DefaultMessageListenerContainer">  
  2.         <property name="connectionFactory" ref="jmsConnectionFactory" />  
  3.         <property name="destination" ref="TOPIC" />  
  4.         <property name="messageListener" ref="topicListenerA" />  
  5.     </bean>  
  6.   
  7.     <bean id="topicListenerContainerB" class="org.springframework.jms.listener.DefaultMessageListenerContainer">  
  8.         <property name="connectionFactory" ref="jmsConnectionFactory" />  
  9.         <property name="destination" ref="TOPIC" />  
  10.         <property name="messageListener" ref="topicListenerB" />  
  11.     </bean>  
  12.        
  13.     <bean id="queueListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">  
  14.         <property name="connectionFactory" ref="jmsConnectionFactory" />  
  15.         <property name="destination" ref="QUEUE" />  
  16.         <property name="messageListener" ref="queueListener" />  
  17.     </bean>  

  Summary

写springé…置文äšg的时å€? è¦æŠŠMessageProducer, MessageConsumer,MessageListener,MessageListenerContainer几个地方弄清æ¥?

  1. å¯ä»¥æœ‰ä¸€ä¸ªæˆ–者多个消æ¯ç”Ÿäº§è€…å‘åŒä¸€ä¸ªdestinationå‘逿¶ˆæ?
  2. queue¾cÕdž‹çš„åªèƒ½æœ‰ä¸€ä¸ªæ¶ˆæ¯æ¶ˆè´¹è€?
  3. topic¾cÕdž‹çš„å¯ä»¥æœ‰å¤šä¸ªæ¶ˆæ¯æ¶ˆè´¹è€?
  4. æ¯ä¸ªæ¶ˆè´¹è€…对应一个MessageListener和一个MessageListenerContainer.

 



]]>
ActiveMQ5.0实战äº? 基本é…ç½®http://www.aygfsteel.com/libin2722/articles/249399.html½C¼ç‰©½C¼ç‰©Wed, 31 Dec 2008 14:09:00 GMThttp://www.aygfsteel.com/libin2722/articles/249399.htmlhttp://www.aygfsteel.com/libin2722/comments/249399.htmlhttp://www.aygfsteel.com/libin2722/articles/249399.html#Feedback0http://www.aygfsteel.com/libin2722/comments/commentRss/249399.htmlhttp://www.aygfsteel.com/libin2722/services/trackbacks/249399.html½Ž€ä»?/h3>

上一½‹‡http://www.javaeye.com/topic/15317介ç»äº†ActiveMQ5.0的安装,˜q™ä¸€½‹‡å°†ä»‹ç»çš„é…¾|®ã€‚ActiveMQ包å«äº†å¾ˆå¤šfeaturesåQˆè¯¦è§?a target="_blank">http://activemq.apache.org/features.html åQ‰ï¼Œ  
ä¸åŒçš„需求,ä¸åŒçš„环境,需è¦ä¸åŒçš„featuresåQŒå½“焉™œ€è¦ä¸åŒçš„é…置。在˜q™é‡Œæˆ‘åªå†™äº†æœ€åŸºæœ¬çš„é…¾|®ï¼Œ½Ž—是抛砖了,希望引出更多关于ActiveMQ的高¾U§é…¾|®ã€?br /> å‡è®¾å·²ç»æ­£ç¡®å®‰è£…ActiveMQ5.0åQŒåŒæ—¶åŠå…¶IP地å€ä¸?92.168.1.148åQŒå…·ä½“ä‹É用时å¯ä»¥æ”¹äؓ自己的IP。下é¢è®²è§£çš„é…置实现的features如下åQ?/p>

  1. 客户端å¯ä»¥é€šè¿‡tcp://192.168.1.148˜qžæŽ¥ActiveMQã€?
  2. æ¶ˆæ¯æŒä¹…化ä¿å­˜ï¼Œé‡å¯æœåС噍ä¸ä¼šä¸¢å¤±æ¶ˆæ¯ã€?
  3. å¯ä»¥é€šè¿‡http://192.168.1.148:8161/admin监控ActiveMQæœåŠ¡å™?

é…ç½®

ActiveMQ默认使用的是XMLæ ¼å¼é…ç½®åQŒä»Ž4.0版本开始用MBean的方å¼å®žçްXMLé…ç½®åQŒé…¾|®æ–‡ä»¶åœ¨${activemq.home}/conf目录下,文äšgå䨓activemq.xml。最新的默认é…ç½®è§?br /> http://svn.apache.org/repos/asf/activemq/trunk/assembly/src/release/conf/activemq.xml 。下é¢äؓ本篇文章使用的酾|®ï¼ŒåŠé‡è¦éƒ¨åˆ†çš„解释ã€?/p>

 

Xmlä»£ç  å¤åˆ¶ä»£ç 
  1. <beans  
  2.   xmlns="http://www.springframework.org/schema/beans"  
  3.   xmlns:amq="http://activemq.org/config/1.0"  
  4.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd   
  5.   http://activemq.org/config/1.0 http://activemq.apache.org/schema/activemq-core.xsd   
  6.   http://activemq.apache.org/camel/schema/spring>  
  7.     
  8.   <!-- persistent="true"è¡¨ç¤ºè¦æŒä¹…化存储消æ¯åQŒå’Œå­å…ƒç´ persistenceAdapter¾l“åˆä½¿ç”¨ -->  
  9.   <!-- dataDirectory默认的存储æŒä¹…化数æ®çš„ç›®å½?nbsp;-->  
  10.   <!-- brokerName è®„¡½®brokerçš„nameåQŒåœ¨æ³¨æ„在网¾lœä¸Šå¿…须是唯一çš?->  
  11.   <!-- æ›´å¤šå‚考http://activemq.apache.org/xbean-xml-reference-50.html#XBeanXMLReference5.0-brokerelement -->  
  12.   <broker xmlns="http://activemq.org/config/1.0" brokerName="192.168.1.148" persistent ="true" dataDirectory="${activemq.base}/data" useShutdownHook="false">  
  13.     
  14.     <!-- Destination specific policies using destination names or wildcards -->  
  15.     <!-- wildcardsæ„义è§http://activemq.apache.org/wildcards.html -->  
  16.     <destinationPolicy>  
  17.       <policyMap>  
  18.         <policyEntries>  
  19.        <!-- ˜q™é‡Œä½¿ç”¨äº†wildcardsåQŒè¡¨½Cºæ‰€æœ‰ä»¥EUCITA开头的topic -->  
  20.           <policyEntry topic="EUCITA.>" producerFlowControl="false" memoryLimit="10mb">  
  21.             <!-- åˆ†å‘½{–ç•¥ -->  
  22.         <dispatchPolicy>  
  23.           <!-- æŒ‰é¡ºåºåˆ†å?nbsp;-->  
  24.               <strictOrderDispatchPolicy/>  
  25.             </dispatchPolicy>  
  26.         <!--  æ¢å¤½{–ç•¥-->  
  27.             <subscriptionRecoveryPolicy>  
  28.           <!-- åªæ¢å¤æœ€åŽä¸€ä¸ªmessage -->  
  29.               <lastImageSubscriptionRecoveryPolicy/>  
  30.             </subscriptionRecoveryPolicy>  
  31.           </policyEntry>  
  32.         </policyEntries>  
  33.       </policyMap>  
  34.     </destinationPolicy>  
  35.   
  36.     <!-- The transport connectors ActiveMQ will listen to -->  
  37.     <transportConnectors>  
  38.        <transportConnector name="openwire" uri="tcp://192.168.1.148:61616" discoveryUri="multicast://default"/>  
  39.        <transportConnector name="ssl"     uri="ssl://192.168.1.148:61617"/>  
  40.        <transportConnector name="stomp"   uri="stomp://192.168.1.148:61613"/>  
  41.        <transportConnector name="xmpp"    uri="xmpp://192.168.1.148:61222"/>  
  42.     </transportConnectors>  
  43.       
  44.     <!-- æ¶ˆæ¯æŒä¹…化方å¼?nbsp;-->  
  45.     <persistenceAdapter>  
  46.       <amqPersistenceAdapter directory="${activemq.base}/data"/>  
  47.     </persistenceAdapter>  
  48. </broker>  
  49.   
  50.   <!-- lets create a command agent to respond to message based admin commands on the ActiveMQ.Agent topic -->  
  51.     <commandAgent xmlns="http://activemq.org/config/1.0"/>  
  52.      
  53.   <!-- An embedded servlet engine for serving up the Admin console -->  
  54.   <jetty xmlns="http://mortbay.com/schemas/jetty/1.0">  
  55.     <connectors>  
  56.       <nioConnector port="8161" />  
  57.     </connectors>  
  58.   
  59.     <handlers>  
  60.       <webAppContext contextPath="/admin" resourceBase="${activemq.base}/webapps/admin" logUrlOnStart="true" />        
  61.       <webAppContext contextPath="/demo" resourceBase="${activemq.base}/webapps/demo" logUrlOnStart="true" />          
  62.     </handlers>  
  63.   </jetty>    
  64. </beans>  

注释

关于XMLé…置中元素的具体信æ¯å¯ä»¥å‚è€?a >http://activemq.apache.org/xbean-xml-reference-50.html 下é¢ä»‹ç»æœ¬ç¯‡é…置使用的一些é‡è¦å…ƒç´ ã€?

DispathPolicy

ActiveMQ支æŒ3中ä¸åŒçš„分命{–ç•¥åQˆé¿å…翻译了以åŽè¯¯è§£åQŒè¿™é‡Œç”¨åŽŸæ–‡åQ‰ï¼š

  1. <roundRobinDispatchPolicy>åQšSimple dispatch policy that sends a message to every subscription that matches the message.
  2. <simpleDispatchPolicy>åQšSimple dispatch policy that sends a message to every subscription that matches the message.
  3. <strictOrderDispatchPolicy>åQšDispatch policy that causes every subscription to see messages in the same order.

SubscriptionRecoveryPolicy

ActiveMQ支æŒ6¿Uæ¢å¤ç­–略,å¯ä»¥è‡ªè¡Œé€‰æ‹©ä½¿ç”¨ä¸åŒçš„ç­–ç•?/p>

  1. <fixedCountSubscriptionRecoveryPolicy>åQ?keep a fixed count of last messages.
  2. <fixedSizedSubscriptionRecoveryPolicy>åQ?keep a fixed amount of memory available in RAM for message history which is evicted in time order.
  3. <lastImageSubscriptionRecoveryPolicy>åQšonly keep the last message.
  4. <noSubscriptionRecoveryPolicy>åQšdisable recovery of messages.
  5. <queryBasedSubscriptionRecoveryPolicy>åQšperform a user specific query mechanism to load any messages they may have missed.
  6. <timedSubscriptionRecoveryPolicy>åQškeep a timed buffer of messages around in memory and use that to recover new subscriptions.

PersistenceAdapter

http://activemq.apache.org/persistence 讲解了关于persistence的信æ¯ã€‚ActiveMQ5.0使用AMQ Message Store æŒä¹…化消æ¯ï¼Œ˜q™ç§æ–¹å¼æä¾›äº†å¾ˆå¥½çš„æ€§èƒ½åQˆThe AMQ Message Store is an embeddable transactional message storage solution that is extremely fast and reliable.åQ?默认使用该存储方å¼å³å¯ï¼Œå¦‚果想ä‹É用JDBCæ¥å­˜å‚¨ï¼Œå¯ä»¥æŸ¥æ‰¾æ–‡æ¡£é…ç½®ã€?nbsp;

Summary

æœ¬ç¯‡æ–‡ç« åªæä¾›äº†åŸºæœ¬é…置信æ¯ã€‚å¦‚æžœéœ€è¦æ›´å¤šçš„æ–‡ç« åQŒå¯ä»¥æŸ¥çœ‹ActiveMQ的文档ã€?/p>

讲了安装和简å•çš„é…ç½®åQŒä¸‹ä¸€½‹‡å°†ä»‹ç»å’ŒSping的整åˆï¼Œä»¥åŠå¤šä¸ªqueueåQŒå¤šä¸ªtopicåQŒå¤šä¸ªproduceråQŒå¤šä¸ªconsumer的酾|®ï¼Œä½¿ç”¨ã€?/p>

]]>
ActiveMQ5.0实战一: 安装é…ç½®ActiveMQ5.0http://www.aygfsteel.com/libin2722/articles/249398.html½C¼ç‰©½C¼ç‰©Wed, 31 Dec 2008 14:09:00 GMThttp://www.aygfsteel.com/libin2722/articles/249398.htmlhttp://www.aygfsteel.com/libin2722/comments/249398.htmlhttp://www.aygfsteel.com/libin2722/articles/249398.html#Feedback0http://www.aygfsteel.com/libin2722/comments/commentRss/249398.htmlhttp://www.aygfsteel.com/libin2722/services/trackbacks/249398.html½Ž€ä»?/h3>

  ActiveMQ 是开æºçš„JMS实现åQŒGeronimo应用æœåŠ¡å™¨å°±æ˜¯ä‹É用的ActiveMQæä¾›JMSæœåŠ¡ã€‚ActiveMQ5.0相比以å‰ç‰ˆæœ¬æä¾›äº†ä¸€äº›éžå¸¸æœ‰ç”¨çš„æ–°åŠŸèƒ½ï¼š

  1. AMQ Message Store (Faster Persistence!)
  2. Cursors (To handle very large number of stored messages)
  3. Blob Messages
  4. Command Agent
  5. Enterprise Integration Patterns via Camel Integration
  6. Logging a warning if you forget to start a Connection
  7. Message Transformation
  8. Mirrored Queues
  9. Flow Control 

鉴于目å‰å…³äºŽActiveMQ5.0的文章比较少åQŒæ•…准备写一¾pÕdˆ—ActiveMQçš„ä‹É用方é¢çš„æ–‡ç« ã€‚本½‹‡å…ˆä»Žå®‰è£…开始ã€?nbsp;

安装

  1. åœ?a >http://activemq.apache.org/download.html 下è²5.0.0å‘行包,解压到需è¦å®‰è£…ActiveMQ的文件夹åQŒè®°ä¸?path/to/activemqã€?
  2. unix环境activemqæ–‡äšg多wœ€è¦æ‰§è¡Œæƒé™ï¼Œæ‰§è¡Œå¦‚下命ä×o  chmod -R 755 /path/to/activemq 

å¯åЍ

  1. window环境˜q行/path/to/activemq/bin/activemq.bat
  2. unix环境˜q行/path/to/activemq/bin/activemq

‹¹‹è¯•

ActiveMQ默认使用的TCP˜qžæŽ¥ç«¯å£æ˜?1616, 通过查看该端å£çš„ä¿¡æ¯å¯ä»¥‹¹‹è¯•ActiveMQæ˜¯å¦æˆåŠŸå¯åЍ

  1. window环境˜q行  netstat -an|find "61616"
  2. unix环境˜q行netstat -an|grep 61616

监控

ActiveMQ5.0版本默认å¯åЍæ—Óž¼Œå¯åŠ¨äº†å†…¾|®çš„jettyæœåŠ¡å™¨ï¼Œæä¾›ä¸€ä¸ªdemo应用和用于监控ActiveMQçš„admin应用ã€?/p>

adminåQ?a >http://127.0.0.1:8161/admin/

demoåQ?a >http://127.0.0.1:8161/demo/

 

点击demo应用中的“ Market data publisher ”åQŒå°±ä¼šå‘一些测试的消æ¯ã€‚è{到admin™åµé¢çš„topics menu下é¢åQˆqueueå’Œtopicçš„åŒºåˆ«è§ http://andyao.javaeye.com/blog/153173 åQ‰ï¼Œå¯ä»¥çœ‹åˆ°æ¶ˆæ¯åœ¨å¢žé•Ñ€?/p>

é…ç½®

ActiveMQ5.0的酾|®æ–‡ä»¶åœ¨/path/to/activemq/conf目录下é¢ã€‚主è¦é…¾|®æ–‡ä»¶äØ“activemq.xmlåQŒå…·ä½“çš„é…ç½®ž®†åœ¨åŽç®‹æ–‡ç« ä¸­è¯¦¾l†è¯´æ˜Žã€?/p>

]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º ÎäÊ¤ÏØ| Ç±É½ÏØ| º£³ÇÊÐ| Á躣ÊÐ| Ëɽ­Çø| ³à·åÊÐ| ʯÃÞÏØ| Äþ°²ÊÐ| ÒÍÁ¼ÏØ| Õý¶¨ÏØ| ÇàÖÝÊÐ| ÂåÄÏÏØ| ·áÌ¨Çø| Û²³ÇÏØ| ôë½­ÏØ| Öз½ÏØ| ÈÕ¿¦ÔòÊÐ| ÂéÑô| ÎÞ¼«ÏØ| ÀÖ¶¼ÏØ| ÖÛÇúÏØ| ¾°¹È| ¤Î÷ÏØ| ÉîÛÚÊÐ| Î÷Ï¿ÏØ| ÑôȪÊÐ| °¢ÍßÌáÏØ| ÀË¿¨×ÓÏØ| ÉÏÈÄÊÐ| °¢¶ûɽÊÐ| Ã×ÁÖÏØ| ¸£¶¦ÊÐ| ³Ç²½| ÎåºÓÏØ| ¶¨ÈÕÏØ| аͶû»¢ÓÒÆì| ´ó¶É¿ÚÇø| Âó¸ÇÌáÏØ| Ǭ°²ÏØ| DZ½­ÊÐ| °ËËÞÏØ|