??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲AV成人精品一区二区三区,亚洲狠狠成人综合网,国产精品亚洲一区二区在线观看http://m.tkk7.com/libin2722/category/46220.html虚其心,可解天下之问Q专其心Q可d下之学;静其心,可悟天下之理Q恒其心Q可成天下之业?/description>zh-cnWed, 01 Sep 2010 15:28:36 GMTWed, 01 Sep 2010 15:28:36 GMT60ActiveMQ in Action(7)http://m.tkk7.com/libin2722/articles/330631.htmlC物C物Wed, 01 Sep 2010 14:29:00 GMThttp://m.tkk7.com/libin2722/articles/330631.htmlhttp://m.tkk7.com/libin2722/comments/330631.htmlhttp://m.tkk7.com/libin2722/articles/330631.html#Feedback0http://m.tkk7.com/libin2722/comments/commentRss/330631.htmlhttp://m.tkk7.com/libin2722/services/trackbacks/330631.html2Q?Q? Wildcards
    Wildcards用来支持联合的名字分层体p(federated name hierarchiesQ。它不是JMS规范的一部分Q而是ActiveMQ的扩展。ActiveMQ支持以下三种wildcardsQ?/p>
  • "." 用于作ؓ路径上名字间的分隔符?/li>
  • "*" 用于匚w路径上的M名字?/li>
  • ">" 用于递归地匹配Q何以q个名字开始的destination?/li>

   作ؓ一U组l事件和订阅感兴那部分信息的一U方法,q个概念在金融市场领域已l流行了一D|间了。设想你有以下两个destinationQ?/p>

  • PRICE.STOCK.NASDAQ.IBM QIBM在NASDAQ的股P
  • PRICE.STOCK.NYSE.SUNW QSUN在纽U证怺易所的股P

   订阅者可以明地指定destination的名字来订阅消息Q或者它也可以用wildcards来定义一个分层的模式来匹配它希望订阅的destination。例如:

Subscription Meaning
PRICE.> Any price for any product on any exchange
PRICE.STOCK.> Any price for a stock on any exchange
PRICE.STOCK.NASDAQ.* Any stock price on NASDAQ
PRICE.STOCK.*.IBM Any IBM stock price on any exchange

 

2Q?Q? Async Sends
    ActiveMQ支持以同步(syncQ方式或者异步(asyncQ方式向broker发送消息?使用何种方式对sendҎ的gq有巨大的媄响。对于生产者来_既然延迟是决定吞吐量的重要因素,那么使用异步发送方式会极大地提高系l的性能?br />    ActiveMQ~省使用异步传输方式。但是按照JMS规范Q当在事务外发送持久化消息的时候,ActiveMQ会强制用同步发送方式。在q种情况下, 每一ơ发送都是同步的Q而且d到收到broker的应{。这个应{保证了broker已经成功地将消息持久化,而且不会丢失。但是这样作也严重地影响? 性能?br />    如果你的pȝ可以容忍量的消息丢失,那么可以在事务外发送持久消息的时候,选择使用异步方式。以下是几种不同的配|方式:

Java代码
  1. cf =  new  ActiveMQConnectionFactory( "tcp://locahost:61616?jms.useAsyncSend=true" );  
  2. ((ActiveMQConnectionFactory)connectionFactory).setUseAsyncSend(true);  
  3. ((ActiveMQConnection)connection).setUseAsyncSend(true);  

 

2Q?Q? Dispatch Policies
2Q?Q?Q? Round Robin Dispatch Policy
    ?Q?Q?节介绍qActiveMQ的prefetch机制QActiveMQ的缺省参数是针对处理大量消息时的高性能和高吞吐量而设|的。所以缺? 的prefetch参数比较大,而且~省的dispatch policies会尝试尽可能快的填满prefetch~冲。然而在有些情况下,例如只有量的消息而且单个消息的处理时间比较长Q那么在~省? prefetch和dispatch policies下,q些量的消息L們֐于被分发C别的consumer上。这样就会因载的不均衡分配而导致处理时间的增加?br />    Round robin dispatch policy会尝试^均分发消息,以下是ActiveMQ配置文g的一个例子:

Xml代码
  1. < destinationPolicy >   
  2.   <policyMap>  
  3.     <policyEntries>  
  4.       <policyEntry topic="FOO.>">  
  5.         <dispatchPolicy>  
  6.           <roundRobinDispatchPolicy />  
  7.         </dispatchPolicy>  
  8.       </policyEntry>  
  9.     </policyEntries>  
  10.   </policyMap>  
  11. </ destinationPolicy >   

 

2Q?Q?Q? Strict Order Dispatch Policy
    有时候需要保证不同的topic consumer以相同的序接收消息。通常ActiveMQ会保证topic consumer以相同的序接收来自同一个producer的消息。然而,׃多线E和异步处理Q不同的topic consumer可能会以不同的顺序接收来自不同producer的消息。例如有两个producerQ分别是P和Q。差不多是同一旉内,P发送了 P1、P2和P3三个消息QQ发送了Q1和Q2两个消息。两个不同的consumer可能会以以下序接收到消息:

   consumer1: P1 P2 Q1 P3 Q2
    consumer2: P1 Q1 Q2 P2 P3
    Strict order dispatch policy 会保证每个topic consumer会以相同的顺序接收消息,代h是性能上的损失。以下是采用了strict order dispatch policy后,两个不同的consumer可能以以下的序接收消息Q?br />    consumer1: P1 P2 Q1 P3 Q2
    consumer2: P1 P2 Q1 P3 Q2

   以下是ActiveMQ配置文g的一个例子:

Xml代码
  1. < destinationPolicy >   
  2.   <policyMap>  
  3.     <policyEntries>  
  4.       <policyEntry topic=""FOO.>">  
  5.         <dispatchPolicy>  
  6.           <strictOrderDispatchPolicy />  
  7.         </dispatchPolicy>  
  8.       </policyEntry>  
  9.     </policyEntries>  
  10.   </policyMap>  
  11. </ destinationPolicy >   

 

2Q?Q?0 Message Cursors
    当producer发送的持久化消息到达broker之后Qbroker首先会把它保存在持久存储中。接下来Q如果发现当前有z跃的consumerQ? 且这个consumer消费消息的速度能跟上producer生消息的速度Q那么ActiveMQ会直接把消息传递给broker内部跟这? consumer兌的dispatch queueQ如果当前没有活跃的consumer或者consumer消费消息的速度跟不上producer生消息的速度Q那么ActiveMQ会? Pending Message Cursors保存Ҏ息的引用。在需要的时候,Pending Message Cursors把消息引用传递给broker内部跟这个consumer兌的dispatch queue。以下是两种Pending Message CursorsQ?/p>

  • VM Cursor。在内存中保存消息的引用?/li>
  • File Cursor。首先在内存中保存消息的引用Q如果内存用量辑ֈ上限Q那么会把消息引用保存到临时文g中?/li>

   在缺省情况下QActiveMQ 5.0Ҏ使用的Message Store来决定用何U类型的Message CursorsQ但是你可以Ҏdestination来配|Message Cursors?/p>    对于topicQ可以用的pendingSubscriberPolicy 有vmCursor和fileCursor。可以用的PendingDurableSubscriberMessageStoragePolicy? vmDurableCursor ?fileDurableSubscriberCursor。以下是ActiveMQ配置文g的一个例子:

Xml代码
  1. <destinationPolicy>  
  2.   <policyMap>  
  3.     <policyEntries>  
  4.       <policyEntry topic="org.apache.>">  
  5.         <pendingSubscriberPolicy>  
  6.           <vmCursor />  
  7.         </pendingSubscriberPolicy>  
  8.         <PendingDurableSubscriberMessageStoragePolicy>  
  9.           <vmDurableCursor/>  
  10.         </PendingDurableSubscriberMessageStoragePolicy>  
  11.       </policyEntry>  
  12.     </policyEntries>  
  13.   </policyMap>  
  14. </destinationPolicy>  

   对于queueQ可以用的pendingQueuePolicy有vmQueueCursor ?fileQueueCursor。以下是ActiveMQ配置文g的一个例子:

Xml代码
  1. <destinationPolicy>  
  2.   <policyMap>  
  3.     <policyEntries>  
  4.       <policyEntry queue="org.apache.>">  
  5.         <pendingQueuePolicy>  
  6.           <vmQueueCursor />  
  7.         </pendingQueuePolicy>  
  8.       </policyEntry>  
  9.     </policyEntries>  
  10.   </policyMap>  
  11. </destinationPolicy>  

 

2Q?Q?1 Optimized Acknowledgement
    ActiveMQ~省支持扚w认消息。由于批量确认会提高性能Q因此这是缺省的认方式。如果希望在应用E序中禁止经q优化的认方式Q那么可以采用如下方法:

Java代码
  1. cf = new ActiveMQConnectionFactory ("tcp://locahost:61616?jms.optimizeAcknowledge=false");  
  2. ((ActiveMQConnectionFactory)connectionFactory).setOptimizeAcknowledge(false);  
  3. ((ActiveMQConnection)connection).setOptimizeAcknowledge(false);  

 

2Q?Q?2 Producer Flow Control
    同步发送消息的producer会自动用producer flow control Q对于异步发送消息的producerQ要使用producer flow controlQ你先要为connection配置一个ProducerWindowSize参数Q如下:

Java代码
  1. ((ActiveMQConnectionFactory)cf).setProducerWindowSize(1024000);  
    ProducerWindowSize是producer在发送消息的q程中,收到broker对于之前发送消息的认之前Q?能够发送消息的最大字节数。你也可以禁用producer flow controlQ以下是ActiveMQ配置文g的一个例子:
Java代码
  1. <destinationPolicy>  
  2.   <policyMap>  
  3.     <policyEntries>  
  4.       <policyEntry topic="FOO.>" producerFlowControl="false">  
  5.         <dispatchPolicy>  
  6.           <strictOrderDispatchPolicy/>  
  7.         </dispatchPolicy>  
  8.       </policyEntry>  
  9.     </policyEntries>  
  10.   </policyMap>  
  11. </destinationPolicy>  

 

2Q?Q?3 Message Transformation
    有时候需要在JMS provider内部q行message的{换。从4.2版本PActiveMQ 提供了一个MessageTransformer 接口用于q行消息转换Q如下:

Java代码
  1. public interface MessageTransformer {  
  2.     Message producerTransform(Session session, MessageProducer producer, Message message) throws JMSException;  
  3.     Message consumerTransform(Session session, MessageConsumer consumer, Message message)throws JMSException;  
  4. }  
    通过在以下对象上通过调用setTransformerҎ来设|MessageTransformerQ?ul>
  • ActiveMQConnectionFactory
  • ActiveMQConnection
  • ActiveMQSession
  • ActiveMQMessageConsumer
  • ActiveMQMessageProducer
  •    MessageTransformer接口支持Q?

    • 在消息被发送到JMS provider的消息ȝ前进行{换。通过producerTransformҎ?/li>
    • 在消息到达消息ȝ后,但是在consumer接收到消息前q行转换。通过consumerTransformҎ?/li>

       以下是个单的例子Q ?

     

    Java代码
    1. public class SimpleMessage implements Serializable {  
    2.     //  
    3.     private static final long serialVersionUID = 2251041841871975105L;  
    4.       
    5.     //  
    6.     private String id;  
    7.     private String text;  
    8.       
    9.     public String getId() {  
    10.         return id;  
    11.     }  
    12.     public void setId(String id) {  
    13.         this.id = id;  
    14.     }  
    15.     public String getText() {  
    16.         return text;  
    17.     }  
    18.     public void setText(String text) {  
    19.         this.text = text;  
    20.     }  
    21. }  
        在producer内发送ObjectMessageQ如下:
    Java代码
    1. SimpleMessage sm = new SimpleMessage();  
    2. sm.setId("1");  
    3. sm.setText("this is a sample message");  
    4. ObjectMessage message = session.createObjectMessage();  
    5. message.setObject(sm);  
    6. producer.send(message);  

       在consumer的session上设|一个MessageTransformer用于ObjectMessage转换成TextMessageQ如下:

    Java代码
    1. ((ActiveMQSession)session).setTransformer(new MessageTransformer() {  
    2. public Message consumerTransform(Session session, MessageConsumer consumer, Message message) throws JMSException {  
    3.     ObjectMessage om = (ObjectMessage)message;  
    4.     XStream xstream = new XStream();  
    5.     xstream.alias("simple message", SimpleMessage.class);  
    6.     String xml = xstream.toXML(om.getObject());  
    7.     return session.createTextMessage(xml);  
    8. }  
    9.   
    10. public Message producerTransform(Session session, MessageProducer consumer, Message message) throws JMSException {  
    11.     return null;  
    12. }  
    13. });


    C物 2010-09-01 22:29 发表评论
    ]]>
    ActiveMQ in Action(6)http://m.tkk7.com/libin2722/articles/330629.htmlC物C物Wed, 01 Sep 2010 14:28:00 GMThttp://m.tkk7.com/libin2722/articles/330629.htmlhttp://m.tkk7.com/libin2722/comments/330629.htmlhttp://m.tkk7.com/libin2722/articles/330629.html#Feedback0http://m.tkk7.com/libin2722/comments/commentRss/330629.htmlhttp://m.tkk7.com/libin2722/services/trackbacks/330629.html2Q? Features
        ActiveMQ包含了很多功能强大的Ҏ,下面要介l其中的几个?br />2Q?Q? Exclusive Consumer
        Queue中的消息是按照顺序被分发到consumers的。然而,当你有多个consumers同时从相同的queue中提取消息时Q你失去这个保 证。因些消息是被多个线Eƈ发的处理。有的时候,保证消息按照序处理是很重要的。例如,你可能不希望在插入订单操作结束之前执行更新这个订单的? 作?br />    ActiveMQ?.x版本起开始支持Exclusive Consumer Q或者说Exclusive QueuesQ? Broker会从多个consumers中挑选一个consumer来处理queue中所有的消息Q从而保证了消息的有序处理。如果这个consumer 失效Q那么broker会自动切换到其它的consumer?br />    可以通过Destination Options 来创Z个Exclusive ConsumerQ如下:

    Java代码
    1. queue =  new  ActiveMQQueue( "TEST.QUEUE?consumer.exclusive=true" );  
    2. consumer = session.createConsumer(queue);  
        Z说一下,可以lconsumer讄优先U,以便针对|络情况Q如network hopsQ进行优化,如下Q?div class="dp-highlighter">
    Java代码
    1. queue = new ActiveMQQueue("TEST.QUEUE?consumer.exclusive=true &consumer.priority=10");  

     

    2Q?Q? Message Groups
        用Apache官方文档的话_Message Groups rockQ它是Exclusive Consumer功能的增强。逻辑上,Message Groups 可以看成是一Uƈ发的Exclusive Consumer。跟所有的消息都由唯一的consumer处理不同QJMS 消息属性JMSXGroupID 被用来区分message group。Message GroupsҎ保证所有具有相同JMSXGroupID 的消息会被分发到相同的consumerQ只要这个consumer保持activeQ。另外一斚wQMessage GroupsҎ也是一U负载均衡的机制?br />    在一个消息被分发到consumer之前Qbroker首先查消息JMSXGroupID属性。如果存在,那么broker 会检查是否有某个consumer拥有q个message group。如果没有,那么broker会选择一个consumerQƈ它兌到这个message group。此后,q个consumer会接收这个message group的所有消息,直到Q?/p>

    • Consumer被关闭?/li>
    • Message group被关闭。通过发送一个消息,q设|这个消息的JMSXGroupSeq??/li>

       ?.1版本开始,ActiveMQ支持一个布字DJMSXGroupFirstForConsumer 。当某个message group的第一个消息被发送到consumer的时候,q个字段被设|。如果客户用failover transportq接到broker。在׃|络问题{造成客户重新q接到broker的时候,相同message group的消息可能会被分发到不同与之前的consumerQ因此JMSXGroupFirstForConsumer字段也会被重新设|。?

       以下是用message groups的例子:

    Java代码
    1. Mesasge message = session.createTextMessage("<foo>hey</foo>");  
    2. message.setStringProperty("JMSXGroupID""IBM_NASDAQ_20/4/05");  
    3. ...  
    4. producer.send(message);  

    2Q?Q? JMS Selectors
        JMS Selectors用于在订阅中Q基于消息属性对q行消息的过滤。JMS Selectors由SQL92语法定义。以下是个Selectors的例子:
    Java代码
    1. consumer = session.createConsumer(destination, "JMSType = 'car' AND weight > 2500");  
         在JMS Selectors表达式中Q可以用IN、NOT IN、LIKE{,例如Q?br />    LIKE '12%3' Q?123' trueQ?12993' trueQ?1234' falseQ?br />    LIKE 'l_se' Q?lose' trueQ?loose' falseQ?br />    LIKE '\_%' ESCAPE '\' Q?_foo' trueQ?foo' falseQ?br />    需要注意的是,JMS Selectors表达式中的日期和旉需要用标准的long型毫U倹{另外表辑ּ中的属性不会自动进行类型{换,例如Q?br />
    Java代码
    1. myMessage.setStringProperty("NumberOfOrders""2");  
        "NumberOfOrders > 1" 求值结果是false。关于JMS Selectors的详l文档请参考javax.jms.Message的javadoc?br />    上一节介绍的Message Groups虽然可以保证h相同message group的消息被唯一的consumer序处理Q但是却不能定被哪个consumer处理。在某些情况下,Message Groups可以和JMS Selector一起工作,例如Q?br />    设想有三个consumers分别是A、B和C。你可以在producer中ؓ消息讄三个message groups分别?A"?B"?C"。然后oconsumer A使用"JMXGroupID = 'A'"作ؓselector。B和C也同理。这样就可以保证message group A的消息只被consumer A处理。需要注意的是,q种做法有以下缺点:
    • producer必须知道当前正在q行的consumersQ也是说producer和consumer被耦合C赗?/li>
    • 如果某个consumer失效Q那么应该被q个consumer消费的消息将会一直被U压在broker上?/li>

    2Q?Q? Pending Message Limit Strategy
        首先要介l一下prefetch机制。ActiveMQ通过prefetch机制来提高性能Q这意味q客L的内存里可能会缓存一定数量的消息。缓存消 息的数量由prefetch limit来控制。当某个consumer的prefetch buffer已经辑ֈ上限Q那么broker不会再向consumer分发消息Q直到consumer向broker发送消息的认。可以通过? ActiveMQConnectionFactory或者ActiveMQConnection上设|ActiveMQPrefetchPolicy对象 来配|prefetch policy。也可以通过connection options或者destination options来配|。例如:
        tcp://localhost:61616?jms.prefetchPolicy.all=50
        tcp://localhost:61616?jms.prefetchPolicy.queuePrefetch=1
        queue = new ActiveMQQueue("TEST.QUEUE?consumer.prefetchSize=10");
        prefetch size的缺省值如下:

    • persistent queues (default value: 1000)
    • non-persistent queues (default value: 1000)
    • persistent topics (default value: 100)
    • non-persistent topics (default value: Short.MAX_VALUE -1)

        慢消费者会在非持久的topics上导致问题:一旦消息积压v来,会导致broker把大量消息保存在内存中,broker也会因此而变慢。未? ActiveMQ可能会实现磁盘缓存,但是q也q是会存在性能问题。目前ActiveMQ使用Pending Message Limit Strategy来解册个问题。除了prefetch buffer之外Q你q要配置~存消息的上限,过q个上限后,新消息到来时会丢弃旧消息。通过在配|文件的destination map中配|PendingMessageLimitStrategyQ可以ؓ不用的topic namespace配置不同的策略。目前有以下两种Q?/p>

    • ConstantPendingMessageLimitStrategy。这个策略用常量限制?br />例如Q?lt;constantPendingMessageLimitStrategy limit="50"/>
    • PrefetchRatePendingMessageLimitStrategy。这个策略用prefetch size的倍数限制?br />例如Q?lt;prefetchRatePendingMessageLimitStrategy multiplier="2.5"/>

       在以上两U方式中Q如果设|?意味着除了prefetch之外不再~存消息Q如果设|?1意味着止丢弃消息。?
        此外Q你q可以配|消息的丢弃{略Q目前有以下两种Q?/p>

    • oldestMessageEvictionStrategy。这个策略丢弃最旧的消息?/li>
    • oldestMessageWithLowestPriorityEvictionStrategy。这个策略丢弃最旧的Q而且h最低优先的消息?/li>

       以下是个ActiveMQ配置文g的例子:

    Xml代码
    1. <broker persistent="false" brokerName="${brokername}" xmlns="http://activemq.org/config/1.0">  
    2.     <destinationPolicy>  
    3.       <policyMap>  
    4.         <policyEntries>  
    5.           <policyEntry topic="PRICES.>">  
    6.             <!--  10 seconds worth -->  
    7.             <subscriptionRecoveryPolicy>  
    8.               <timedSubscriptionRecoveryPolicy recoverDuration="10000" />  
    9.             </subscriptionRecoveryPolicy>  
    10.               
    11.             <!-- lets force old messages to be discarded for slow consumers -->  
    12.             <pendingMessageLimitStrategy>  
    13.               <constantPendingMessageLimitStrategy limit="10"/>  
    14.             </pendingMessageLimitStrategy>  
    15.           </policyEntry>  
    16.         </policyEntries>  
    17.       </policyMap>  
    18.     </destinationPolicy>  
    19.     ...  
    20. </broker>  

     

    2Q?Q? Composite Destinations
        ?.1版本? ActiveMQ支持composite destinations。它允许用一个虚拟的destination 代表多个destinations。例如你可以通过composite destinations在一个操作中同时?2个queue发送消息。在composite destinations中,多个destination之间采用","分割。例如:

    Java代码
    1. Queue queue = new ActiveMQQueue("FOO.A,FOO.B,FOO.C");  

       如果你希望用不同类型的destinationQ那么需要加上前~如queue:// 或topic://Q例如: 

    Java代码
    1. Queue queue = new ActiveMQQueue("FOO.A,topic://NOTIFY.FOO.A");   

       以下是ActiveMQ配置文gq行配置的一个例子:

    Xml代码
    1. <destinationInterceptors>  
    2.   <virtualDestinationInterceptor>  
    3.     <virtualDestinations>  
    4.       <compositeQueue name="MY.QUEUE">  
    5.         <forwardTo>  
    6.           <queue physicalName="FOO" />  
    7.           <topic physicalName="BAR" />  
    8.         </forwardTo>  
    9.       </compositeQueue>  
    10.     </virtualDestinations>  
    11.   </virtualDestinationInterceptor>  
    12. </destinationInterceptors>  

       可以在{发前Q先通过JMS Selector判断一个消息是否需要{发,例如Q?/p>

    Xml代码
    1. <destinationInterceptors>  
    2.   <virtualDestinationInterceptor>  
    3.     <virtualDestinations>  
    4.       <compositeQueue name="MY.QUEUE">  
    5.         <forwardTo>  
    6.           <filteredDestination selector="odd = 'yes'" queue="FOO"/>  
    7.           <filteredDestination selector="i = 5" topic="BAR"/>  
    8.         </forwardTo>  
    9.       </compositeQueue>  
    10.     </virtualDestinations>  
    11.   </virtualDestinationInterceptor>  
    12. </destinationInterceptors>  

     

    2Q?Q? Mirrored Queues
        每个queue中的消息只能被一个consumer消费。然而,有时候你可能希望能够监视生者和消费者之间的消息。你可以通过使用Virtual Destinations 来徏立一个virtual queue 来把消息转发到多个queues中。但? 为系l中每个queue都进行如此的配置可能会很ȝ?
        ActiveMQ支持Mirrored Queues。Broker会把发送到某个queue的所有消息{发到一个名U类似的topicQ因此监控程序可以订阅这个mirrored queue topic。ؓ了启用Mirrored QueuesQ首先要BrokerService的useMirroredQueues属性设|成trueQ然后可以通过 destinationInterceptors讄其它属性,如mirror topic的前~Q缺省是"VirtualTopic.Mirror."。以下是ActiveMQ配置文g的一个例子:

    Xml代码
    1. <broker xmlns="http://activemq.org/config/1.0" brokerName="MirroredQueuesBroker1" useMirroredQueues="true">  
    2.   
    3.   <transportConnectors>  
    4.     <transportConnector uri="tcp://localhost:61616"/>  
    5.   </transportConnectors>  
    6.     
    7.   <destinationInterceptors>  
    8.       <mirroredQueue copyMessage = "true" prefix="Mirror.Topic"/>  
    9.   </destinationInterceptors>  
    10.   ...  
    11. </broker>  
        假如某个producer向名为Foo.Bar的queue中发送消息,那么你可以通过订阅名ؓMirror.Topic.Foo.Bar的topic来获得发送到Foo.Bar中的所有消息?img src ="http://m.tkk7.com/libin2722/aggbug/330629.html" width = "1" height = "1" />

    C物 2010-09-01 22:28 发表评论
    ]]>
    ActiveMQ in Action(4)http://m.tkk7.com/libin2722/articles/330626.htmlC物C物Wed, 01 Sep 2010 14:27:00 GMThttp://m.tkk7.com/libin2722/articles/330626.htmlhttp://m.tkk7.com/libin2722/comments/330626.htmlhttp://m.tkk7.com/libin2722/articles/330626.html#Feedback0http://m.tkk7.com/libin2722/comments/commentRss/330626.htmlhttp://m.tkk7.com/libin2722/services/trackbacks/330626.html2Q? Security
        ActiveMQ支持可插拔的安全机制Q用以在不同的provider之间切换?br />2Q?Q? Simple Authentication Plugin
        Simple Authentication Plugin适用于简单的认证需求,或者用于徏立测试环境。它允许在XML配置文g中指定用戗用L和密码等信息。以下是ActiveMQ配置的一个例子:

    Xml代码
    1. < plugins >   
    2.   ...  
    3.   <simpleAuthenticationPlugin>  
    4.     <users>  
    5.       <authenticationUser username="system" password="manager" groups="users,admins"/>  
    6.       <authenticationUser username="user" password="password" groups="users"/>  
    7.       <authenticationUser username="guest" password="password" groups="guests"/>  
    8.     </users>  
    9.   </simpleAuthenticationPlugin>  
    10. </ plugins >   

     

    2Q?Q? JAAS Authentication Plugin
        JAAS Authentication Plugin依赖标准的JAAS机制来实现认证。通常情况下,你需要通过讄java.security.auth.login.configpȝ属性来 配置login modules的配|文件。如果没有指定这个系l属性,那么JAAS Authentication Plugin会缺省用login.config作ؓ文g名。以下是一个login.config文g的例子:

    activemq-domain {
        org.apache.activemq.jaas.PropertiesLoginModule required debug=true         org.apache.activemq.jaas.properties.user="users.properties"         org.apache.activemq.jaas.properties.group="groups.properties";
    };
        q个login.config文g中设|了两个属性:org.apache.activemq.jaas.properties.user? org.apache.activemq.jaas.properties.group分别用来指向user.properties? group.properties文g。需要注意的是,PropertiesLoginModule使用本地文g的查找方式,而且查找旉用的base directory是login.config文g所在的目录。因此这个login.config说明user.properties? group.properties文g存放在跟login.config文g相同的目录里?br />    以下是ActiveMQ配置的一个例子:

    Xml代码
    1. < plugins >   
    2.   ...  
    3.   <jaasAuthenticationPlugin configuration="activemq-domain" />  
    4. </ plugins >   

        Z以上的配|,在JAAS的LoginContext中会使用activemq-domain中配|的PropertiesLoginModule来进行登陆?br />    ActiveMQ JAASq支持LDAPLoginModule、CertificateLoginModule、TextFileCertificateLoginModule{login module?/p>

     

    2Q?Q? Custom Authentication Implementation
        可以通过~码的方式ؓActiveMQ增加认证功能。例如编写一个类l承自XBeanBrokerService?

    Java代码
    1. package  com.yourpackage;  
    2.   
    3. import  java.net.URI;  
    4. import  java.util.HashMap;  
    5. import  java.util.Map;  
    6.   
    7. import  org.apache.activemq.broker.Broker;  
    8. import  org.apache.activemq.broker.BrokerFactory;  
    9. import  org.apache.activemq.broker.BrokerService;  
    10. import  org.apache.activemq.security.SimpleAuthenticationBroker;  
    11. import  org.apache.activemq.xbean.XBeanBrokerService;  
    12.   
    13. public   class  SimpleAuthBroker  extends  XBeanBrokerService {  
    14.     //  
    15.     private String user;  
    16.     private String password;  
    17.       
    18.     @SuppressWarnings("unchecked")  
    19.     protected Broker addInterceptors(Broker broker) throws Exception {  
    20.         broker = super.addInterceptors(broker);  
    21.         Map passwords = new HashMap();  
    22.         passwords.put(getUser(), getPassword());  
    23.         broker = new SimpleAuthenticationBroker(broker, passwords, new HashMap());  
    24.         return broker;  
    25.     }  
    26.       
    27.     public String getUser() {  
    28.         return user;  
    29.     }  
    30.   
    31.     public void setUser(String user) {  
    32.         this.user = user;  
    33.     }  
    34.   
    35.     public String getPassword() {  
    36.         return password;  
    37.     }  
    38.   
    39.     public void setPassword(String password) {  
    40.         this.password = password;  
    41.     }  
    42. }  
        以下是ActiveMQ配置文g的一个例子:
    Xml代码
    1. <beans>  
    2.   … ?/span>
    3.   <auth:SimpleAuthBroker  
    4.     xmlns:auth="java://com.yourpackage"  
    5.     xmlns="http://activemq.org/config/1.0" brokerName="SimpleAuthBroker1" user="user" password="password" useJmx="true">  
    6.     
    7.     <transportConnectors>  
    8.       <transportConnector uri="tcp://localhost:61616"/>  
    9.     </transportConnectors>  
    10.   </auth:SimpleAuthBroker>  
    11.   … ?/span>
    12. </beans>  

       在这个配|文件中增加了一个namespace authQ用于指向之前编写的哪个cR同时ؓSimpleAuthBroker注入了两个属性值user和passwordQ因此在? SimpleAuthBroker改写的addInterceptorsҎ里,可以使用q两个属性进行认证了。ActiveMQ提供? SimpleAuthenticationBrokercȝ承自BrokerFilterQ可以简单的看成是Broker的AdaptorQ,它的构造函 C的两个Map分别是userPasswords和userGroups?SimpleAuthenticationBroker? addConnectionҎ中用userPasswordsq行认证Q同时会把userGroups的信息保存到 ConnectionContext??/p>

     

    2Q?Q? Authorization Plugin
        可以通过Authorization Plugin证后的用h权,以下ActiveMQ配置文g的一个例子:

    Xml代码
    1. <plugins>  
    2.   <jaasAuthenticationPlugin configuration="activemq-domain"/>  
    3.     
    4.   <authorizationPlugin>  
    5.     <map>  
    6.       <authorizationMap>  
    7.         <authorizationEntries>  
    8.           <authorizationEntry queue=">" read="admins" write="admins" admin="admins" />  
    9.           <authorizationEntry queue="USERS.>" read="users" write="users" admin="users" />  
    10.           <authorizationEntry queue="GUEST.>" read="guests" write="guests,users" admin="guests,users" />  
    11.             
    12.           <authorizationEntry topic=">" read="admins" write="admins" admin="admins" />  
    13.           <authorizationEntry topic="USERS.>" read="users" write="users" admin="users" />  
    14.           <authorizationEntry topic="GUEST.>" read="guests" write="guests,users" admin="guests,users" />  
    15.   
    16.           <authorizationEntry topic="ActiveMQ.Advisory.>" read="guests,users" write="guests,users" admin="guests,users"/>  
    17.         </authorizationEntries>  
    18.       </authorizationMap>  
    19.     </map>  
    20.   </authorizationPlugin>  
    21. </plugins>


    C物 2010-09-01 22:27 发表评论
    ]]>
    ActiveMQ in Action(5)http://m.tkk7.com/libin2722/articles/330627.htmlC物C物Wed, 01 Sep 2010 14:27:00 GMThttp://m.tkk7.com/libin2722/articles/330627.htmlhttp://m.tkk7.com/libin2722/comments/330627.htmlhttp://m.tkk7.com/libin2722/articles/330627.html#Feedback0http://m.tkk7.com/libin2722/comments/commentRss/330627.htmlhttp://m.tkk7.com/libin2722/services/trackbacks/330627.html2Q? Clustering
        ActiveMQ从多U不同的斚w提供了集的支持?br />2Q?Q? Queue consumer clusters
        ActiveMQ支持订阅同一个queue的consumers上的集群。如果一个consumer失效Q那么所有未被确? QunacknowledgedQ的消息都会被发送到q个queue上其它的consumers。如果某个consumer的处理速度比其? consumers更快Q那么这个consumer׃消费更多的消息?br />    需要注意的是,W者发现AcitveMQ5.0版本的Queue consumer clusters存在一个bugQ采用AMQ Message StoreQ运行一个producerQ两个consumerQƈ采用如下的配|文Ӟ

    Xml代码
    1. < beans >   
    2.   <broker xmlns="http://activemq.org/config/1.0" brokerName="BugBroker1" useJmx="true">  
    3.     
    4.     <transportConnectors>  
    5.       <transportConnector uri="tcp://localhost:61616"/>  
    6.     </transportConnectors>  
    7.       
    8.     <persistenceAdapter>  
    9.       <amqPersistenceAdapter directory="activemq-data/BugBroker1" maxFileLength="32mb"/>  
    10.     </persistenceAdapter>  
    11.        
    12.   </broker>  
    13. </ beans >   

       那么l过一D|间后可能会报出如下错误:
    ERROR [ActiveMQ Transport: tcp:///127.0.0.1:1843 - RecoveryListenerAdapter.java:58 - RecoveryListenerAdapter] Message id ID:versus-1837-1203915536609-0:2:1:1:419 could not be recovered from the data store!
        Apache官方文档_此bug已经被修正,预定?.1.0版本上体现?/p>

     

    2Q?Q? Broker clusters
        一个常见的场景是有多个JMS brokerQ有一个客戯接到其中一个broker。如果这个broker失效Q那么客户会自动重新q接到其它的broker。在ActiveMQ中 用failover:// 协议来实现这个功能。ActiveMQ3.x版本的reliable://协议已经变更为failover://?br />    如果某个|络上有多个brokers而且客户使用静态发玎ͼ使用Static Transport或Failover TransportQ或动态发玎ͼ使用Discovery TransportQ,那么客户可以Ҏ地在某个broker失效的情况下切换到其它的brokers。然而,stand alone brokersq不了解其它brokers上的consumersQ也是说如果某个broker上没有consumersQ那么这个broker上的? 息可能会因得不到处理而积压v来。目前的解决Ҏ是用Network of brokersQ以便在broker之间存储转发消息。ActiveMQ在未来会有更好的Ҏ,用来在客L处理q个问题?br />    从ActiveMQ1.1版本PActiveMQ支持networks of brokers。它支持分布式的queues和topics。一个broker会相同对待所有的订阅QsubscriptionQ:不管他们是来自本地的 客户q接Q还是来自远EbrokerQ它都会递送有关的消息拯到每个订阅。远Ebroker得到q个消息拯后,会依ơ把它递送到其内部的本地q接上? 有两U方式配|Network of brokersQ一U是使用static transportQ如下:

    Xml代码
    1. < broker   brokerName = "receiver"   persistent = "false"   useJmx = "false" >   
    2.   <transportConnectors>  
    3.     <transportConnector uri="tcp://localhost:62002"/>  
    4.   </transportConnectors>  
    5.   <networkConnectors>  
    6.     <networkConnector uri="static:( tcp://localhost:61616,tcp://remotehost:61616)"/>  
    7.   </networkConnectors>  
    8.   … ?/span>
    9. </ broker >   
        另外一U是使用multicast discoveryQ如下:
    Xml代码
    1. <broker name="sender" persistent="false" useJmx="false">  
    2.   <transportConnectors>  
    3.     <transportConnector uri="tcp://localhost:0" discoveryUri="multicast://default"/>  
    4.   </transportConnectors>  
    5.   <networkConnectors>  
    6.     <networkConnector uri="multicast://default"/>  
    7.   </networkConnectors>  
    8.   ...  
    9. </broker>  
        Network Connector有以下属性:
    PropertyDefault ValueDescription
    namebridgename of the network - for more than one network connector between the same two brokers - use different names
    dynamicOnlyfalseif true, only forward messages if a consumer is active on the connected broker
    decreaseNetworkConsumerPriorityfalsedecrease the priority for dispatching to a Queue consumer the further away it is (in network hops) from the producer
    networkTTL1the number of brokers in the network that messages and subscriptions can pass through
    conduitSubscriptionstruemultiple consumers subscribing to the same destination are treated as one consumer by the network
    excludedDestinationsemptydestinations matching this list won't be forwarded across the network
    dynamicallyIncludedDestinationsemptydestinations that match this list will be forwarded across the network n.b. an empty list means all destinations not in the excluded list will be forwarded
    staticallyIncludedDestinationsemptydestinations that match will always be passed across the network - even if no consumers have ever registered an interest
    duplexfalseif true, a network connection will be used to both produce AND Consume messages. This is useful for hub and spoke scenarios when the hub is behind a firewall etc.

        关于conduitSubscriptions属性,q里E稍说明一下。设x两个brokersQ分别是brokerA和brokerBQ它们之间用 forwarding bridgeq接。有一个consumerq接到brokerAq订阅queueQQ.TEST。有两个consumersq接到brokerBQ也是订 阅queueQQ.TEST。这三个consumers有相同的优先U。然后启动一个producerQ它发送了30条消息到brokerA。如? conduitSubscriptions=trueQ那么brokerA上的consumer会得?5条消息, 另外15条消息会发送给brokerB。此时负载ƈ不均衡,因ؓ此时brokerAbrokerB上的两个consumers视ؓ一个;如果 conduitSubscriptions=falseQ那么每个consumer上都会收?0条消息。以下是关于NetworkConnector? 性的一个例子:

    Xml代码
    1. <networkConnectors>  
    2.   <networkConnector uri="static://(tcp://localhost:61617)"  
    3.      name="bridge" dynamicOnly="false" conduitSubscriptions="true"  
    4.      decreaseNetworkConsumerPriority="false">  
    5.      <excludedDestinations>  
    6.        <queue physicalName="exclude.test.foo"/>  
    7.        <topic physicalName="exclude.test.bar"/>  
    8.      </excludedDestinations>  
    9.      <dynamicallyIncludedDestinations>  
    10.        <queue physicalName="include.test.foo"/>  
    11.        <topic physicalName="include.test.bar"/>  
    12.      </dynamicallyIncludedDestinations>  
    13.      <staticallyIncludedDestinations>  
    14.        <queue physicalName="always.include.queue"/>  
    15.        <topic physicalName="always.include.topic"/>  
    16.      </staticallyIncludedDestinations>  
    17.   </networkConnector>  
    18. </networkConnectors>  

     

    2Q?Q? Master Slave
        在一个网l内q行多个brokers或者stand alone brokers时存在一个问题,q就是消息在物理上只被一个broker持有Q因此当某个broker失效Q那么你只能{待直到它重启后Q这? broker上的消息才能够被l箋发送(如果没有讄持久化,那么在这U情况下Q消息将会丢失)。Master Slave 背后的想法是Q消息被复制到slave brokerQ因此即使master broker遇到了像g故障之类的错误,你也可以立即切换到slave broker而不丢失M消息?br />    Master Slave是目前ActiveMQ推荐的高可靠性和定w的解x案。以下是几种不同的类型:

    Master Slave TypeRequirementsProsCons
    Pure Master SlaveNoneNo central point of failureRequires manual restart to bring back a failed master and can only support 1 slave
    Shared File System Master SlaveA Shared File system such as a SANRun as many slaves as required. Automatic recovery of old mastersRequires shared file system
    JDBC Master SlaveA Shared databaseRun as many slaves as required. Automatic recovery of old mastersRequires a shared database. Also relatively slow as it cannot use the high performance journal

     

    2Q?Q?Q? Pure Master Slave
        Pure Master Slave的工作方式如下:

    • Slave broker消费master broker上所有的消息状态,例如消息、确认和事务状态等。只要slave brokerq接Cmaster brokerQ它不会Q也不被允许Q启动Q何network connectors或者transport connectorsQ所以唯一的目的就是复制master broker的状态?/li>
    • Master broker只有在消息成功被复制到slave broker之后才会响应客户。例如,客户的commith只有在master broker和slave broker都处理完毕commith之后才会l束?/li>
    • 当master broker失效的时候,slave broker有两U选择Q一U是slave broker启动所有的network connectors和transport connectorsQ这允许客户端切换到slave brokerQ另外一U是slave broker停止。这U情况下Qslave broker只是复制了master broker的状态?/li>
    • 客户应该使用failover transportq且应该首先试q接master broker。例如:
      failover://(tcp://masterhost:61616,tcp://slavehost:61616)?randomize=false
      讄randomize为false可以让客户L首先试q接master brokerQslave brokerq不会接受Q何连接,直到它成Zmaster brokerQ?/li>

       Pure Master Slaveh以下限制Q?/p>

    • 只能有一个slave brokerq接到master broker?/li>
    • 在因master broker失效而导致slave broker成ؓmaster之后Q之前的master broker只有在当前的master brokerQ原slave brokerQ停止后才能重新生效?/li>
    • Master broker失效后而切换到slave broker后,最安全的恢复master broker的方式是人工处理。首先要停止slave brokerQ这意味着所有的客户也要停止Q。然后把slave broker的数据目录中所有的数据拯到master broker的数据目录中。然后重启master broker和slave broker?/li>

       Master broker不需要特D的配置。Slave broker需要进行以下配|?/p>

    Xml代码
    1. <broker masterConnectorURI="tcp://masterhost:62001" shutdownOnMasterFailure="false">  
    2.     ...  
    3.     <transportConnectors>  
    4.       <transportConnector uri="tcp://slavehost:61616"/>  
    5.    </transportConnectors>  
    6. </broker>  

        其中的masterConnectorURI用于指向master brokerQshutdownOnMasterFailure用于指定slave broker在master broker失效的时候是否需要停止。此外,也可以用如下配|:

    Xml代码
    1. <broker brokerName="slave" useJmx="false"  deleteAllMessagesOnStartup="true"  xmlns="http://activemq.org/config/1.0">  
    2.   ...  
    3.   <services>  
    4.     <masterConnector remoteURI"tcp://localhost:62001" userName="user" password="password"/>  
    5.   </services>  
    6. </broker>  

       需要注意的是,W者认为ActiveMQ5.0版本的Pure Master Slave仍然不够E_?

     

    2Q?Q?Q? Shared File System Master Slave
        如果你用SAN或者共享文件系l,那么你可以用Shared File System Master Slave。基本上Q你可以q行多个brokerQ这些broker׃n数据目录。当W一个broker得到文g上的排他锁之后,其它的broker便会 在@环中{待获得q把锁。客L使用failover transport来连接到可用的broker。当master broker失效的时候会释放q把锁,q时候其中一个slave broker会得到这把锁从而成为master broker。以下是ActiveMQ配置的一个例子:

    Xml代码
    1. <broker useJmx="false"  xmlns="http://activemq.org/config/1.0">  
    2.    <persistenceAdapter>  
    3.       <journaledJDBC dataDirectory="/sharedFileSystem/broker"/>  
    4.    </persistenceAdapter>  
    5.    … ?/span>
    6. </broker>  

     

    2Q?Q?Q? JDBC Master Slave
        JDBC Master Slave的工作原理跟Shared File System Master SlavecMQ只是采用了数据库作为持久化存储。以下是ActiveMQ配置的一个例子:

    Xml代码
    1. <beans>  
    2.   <broker xmlns="http://activemq.org/config/1.0" brokerName="JdbcMasterBroker">  
    3.     ...  
    4.     <persistenceAdapter>  
    5.       <jdbcPersistenceAdapter dataSource="#mysql-ds"/>  
    6.     </persistenceAdapter>  
    7.       
    8.   </broker>  
    9.     
    10.   <bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
    11.     <property name="driverClassName" value="com.mysql.jdbc.Driver"/>  
    12.     <property name="url" value="jdbc:mysql://localhost:3306/test?relaxAutoCommit=true"/>  
    13.     <property name="username" value="username"/>  
    14.     <property name="password" value="passward"/>  
    15.     <property name="poolPreparedStatements" value="true"/>  
    16.   </bean>   
    17. </beans>  

       需要注意的是,如果你用MySQL数据库,需要首先执行以下三条语句:QApache官方文档_此bug已经被修正,预定?.1.0版本上体玎ͼ

    Sql代码
    1. ALTER TABLE activemq_acks ENGINE = InnoDB;  
    2. ALTER TABLE activemq_lock ENGINE = InnoDB;  
    3. ALTER TABLE activemq_msgs ENGINE = InnoDB;


    C物 2010-09-01 22:27 发表评论
    ]]>
    ActiveMQ in Action(3)http://m.tkk7.com/libin2722/articles/330625.htmlC物C物Wed, 01 Sep 2010 14:26:00 GMThttp://m.tkk7.com/libin2722/articles/330625.htmlhttp://m.tkk7.com/libin2722/comments/330625.htmlhttp://m.tkk7.com/libin2722/articles/330625.html#Feedback0http://m.tkk7.com/libin2722/comments/commentRss/330625.htmlhttp://m.tkk7.com/libin2722/services/trackbacks/330625.html2Q? Persistence
    2Q?Q? AMQ Message Store
        AMQ Message Store是ActiveMQ5.0~? 省的持久化存储。Message commands被保存到transactional journalQ由rolling data logsl成Q。Messages被保存到data logs中,同时被reference storeq行索引以提高存取速度。Date logs׃些单独的data log文gl成Q缺省的文g大小?2MQ如果某个消息的大小过了data log文g的大,那么可以修改配置以增加data log文g的大。如果某个data log文g中所有的消息都被成功消费了,那么q个data log文g会被标讎ͼ以便在下一轮的清理中被删除或者归档。以下是光|的一个例子:

    Xml代码
    1. < broker   brokerName = "broker"   persistent = "true"   useShutdownHook = "false" >   
    2.   <persistenceAdapter>  
    3.      <amqPersistenceAdapter directory="${activemq.base}/data" maxFileLength="32mb"/>  
    4.   </persistenceAdapter>  
    5. </ broker >   
    Property name Default value Comments
    directory activemq-data the path to the directory to use to store the message store data and log files
    useNIO true use NIO to write messages to the data logs
    syncOnWrite false sync every write to disk
    maxFileLength 32mb a hint to set the maximum size of the message data logs
    persistentIndex true use a persistent index for the message logs. If this is false, an in-memory structure is maintained
    maxCheckpointMessageAddSize 4kb the maximum number of messages to keep in a transaction before automatically committing
    cleanupInterval 30000 time (ms) before checking for a discarding/moving message data logs that are no longer used
    indexBinSize 1024 default number of bins used by the index. The bigger the bin size - the better the relative performance of the index
    indexKeySize 96 the size of the index key - the key is the message id
    indexPageSize 16kb the size of the index page - the bigger the page - the better the write performance of the index
    directoryArchive archive the path to the directory to use to store discarded data logs
    archiveDataLogs false if true data logs are moved to the archive directory instead of being deleted

     

    2Q?Q? Kaha Persistence
        Kaha Persistence 是一个专门针Ҏ息持久化的解x案。它对典型的消息使用模式q行了优化。在Kaha中,数据被追加到data logs中。当不再需要log文g中的数据的时候,log文g会被丢弃。以下是光|的一个例子:

    Xml代码
    1. < broker   brokerName = "broker"   persistent = "true"   useShutdownHook = "false" >   
    2.       <persistenceAdapter>  
    3.         <kahaPersistenceAdapter directory="activemq-data" maxDataFileLength="33554432"/>  
    4.       </persistenceAdapter>  
    5. </ broker >   

     

    2Q?Q? JDBC Persistence
        目前支持的数据库有Apache Derby, Axion, DB2, HSQL, Informix, MaxDB, MySQL, Oracle, Postgresql, SQLServer, Sybase?br />    如果你用的数据库不被支持,那么可以调整StatementProvider 来保证用正的SQL方言Qflavour of SQLQ。通常l大多数数据库支持以下adaptorQ?

    • org.activemq.store.jdbc.adapter.BlobJDBCAdapter
    • org.activemq.store.jdbc.adapter.BytesJDBCAdapter
    • org.activemq.store.jdbc.adapter.DefaultJDBCAdapter
    • org.activemq.store.jdbc.adapter.ImageJDBCAdapter

       也可以在配置文g中直接指定JDBC adaptorQ例如:

    Xml代码
    1. < jdbcPersistenceAdapter    adapterClass = "org.apache.activemq.store.jdbc.adapter.ImageBasedJDBCAdaptor" />   
        以下是其配置的一个例子:

     

    Xml代码
    1. <persistence>  
    2.       <jdbcPersistence dataSourceRef=" mysql-ds"/>  
    3. </persistence>  
    4.   
    5. <bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
    6.       <property name="driverClassName" value="com.mysql.jdbc.Driver"/>  
    7.       <property name="url" value="jdbc:mysql://localhost/activemq?relaxAutoCommit=true"/>  
    8.       <property name="username" value="activemq"/>  
    9.       <property name="password" value="activemq"/>  
    10.       <property name="poolPreparedStatements" value="true"/>  
    11. </bean>  

        需要注意的是,如果使用MySQLQ那么需要设|relaxAutoCommit 标志为true?/p>

     

    2Q?Q? Disable Persistence
        以下是其配置的一个例子:

    Xml代码
    1. <broker persistent="false">  
    2. </broker>


    C物 2010-09-01 22:26 发表评论
    ]]>
    ActiveMQ in Action(2)http://m.tkk7.com/libin2722/articles/330624.htmlC物C物Wed, 01 Sep 2010 14:26:00 GMThttp://m.tkk7.com/libin2722/articles/330624.htmlhttp://m.tkk7.com/libin2722/comments/330624.htmlhttp://m.tkk7.com/libin2722/articles/330624.html#Feedback0http://m.tkk7.com/libin2722/comments/commentRss/330624.htmlhttp://m.tkk7.com/libin2722/services/trackbacks/330624.html2Q? Transport
        ActiveMQ目前支持的transport有:VM Transport、TCP Transport、SSL Transport、Peer Transport、UDP Transport、Multicast Transport、HTTP and HTTPS Transport、Failover Transport、Fanout Transport、Discovery Transport、ZeroConf Transport{。以下简单介l其中的几种Q更多请参考Apache官方文档?/p>

     

    2Q?Q? VM Transport
        VM transport允许在VM内部通信Q从而避免了|络传输的开销。这时候采用的q接不是socketq接Q而是直接地方法调用? W一个创建VM q接的客户会启动一个embed VM brokerQ接下来所有用相同的broker name的VMq接都会使用q个broker。当q个broker上所有的q接都关闭的时候,q个broker也会自动关闭?br />    以下是配|语法:

       vm://brokerName?transportOptions

       例如Qvm://broker1?marshal=false&broker.persistent=false

       Transport Options的可选值如下:

    Option Name Default Value Description
    Marshal false If true, forces each command sent over the transport to be marshlled and unmarshlled using a WireFormat
    wireFormat default The name of the WireFormat to use
    wireFormat.*   All the properties with this prefix are used to configure the wireFormat
    create true If the broker should be created on demand if it does not allready exist. Only supported in ActiveMQ 4.1
    broker.*   All the properties with this prefix are used to configure the broker. See Configuring Wire Formats for more information

     

       以下是高U配|语法:

       vm:(broker:(tcp://localhost)?brokerOptions)?transportOptions

       vm:broker:(tcp://localhost)?brokerOptions

        例如Qvm:(broker:(tcp://localhost:6000)?persistent=false)?marshal=false

        Transport Options的可选值如下:

    Option Name Default Value Description
    marshal false If true, forces each command sent over the transport to be marshlled and unmarshlled using a WireFormat
    wireFormat default The name of the WireFormat to use
    wireFormat.*   All the properties with this prefix are used to configure the wireFormat

     

       使用配置文g的配|语法:  
        vm://localhost?brokerConfig=xbean:activemq.xml
        例如Qvm:// localhost?brokerConfig=xbean:com/test/activemq.xml

     

       使用Spring的配|:

    Xml代码
    1. < bean   id = "broker"   class = "org.apache.activemq.xbean.BrokerFactoryBean" >   
    2.   <property name="config" value="classpath:org/apache/activemq/xbean/activemq.xml" />  
    3.   <property name="start" value="true" />  
    4. </ bean >   
    5.   
    6. < bean   id = "connectionFactory"   class = "org.apache.activemq.ActiveMQConnectionFactory"   depends-on = "broker" >   
    7.   <property name="brokerURL" value="vm://localhost"/>  
    8. </ bean >   

       如果persistent是trueQ那么ActiveMQ会在当前目录下创Z个缺省值是activemq-data的目录用于持久化保存数据。需要注 意的是,如果E序中启动了多个不同名字的VM brokerQ那么可能会有如下警告:Failed to start jmx connector: Cannot bind to URL [rmi://localhost:1099/jmxrmi]: javax.naming.NameAlreadyBoundException…可以通过在transportOptions中追? broker.useJmx=false来禁用JMX来避免这个警告?/p>

     

    2Q?Q? TCP Transport
        TCP transport 允许客户端通过TCP socketq接到远E的broker。以下是配置语法Q?br />    tcp://hostname:port?transportOptions
        Transport Options的可选值如下:

    Option Name Default Value Description
    minmumWireFormatVersion 0 The minimum version wireformat that is allowed
    trace false Causes all commands that are sent over the transport to be logged
    useLocalHost true When true, it causes the local machines name to resolve to "localhost".
    socketBufferSize 64 * 1024 Sets the socket buffer size in bytes
    soTimeout 0 sets the socket timeout in milliseconds
    connectionTimeout 30000 A non-zero value specifies the connection timeout in milliseconds. A zero value means wait forever for the connection to be established. Negative values are ignored.
    wireFormat default The name of the WireFormat to use
    wireFormat.*   All the properties with this prefix are used to configure the wireFormat. See Configuring Wire Formats for more information

       例如Qtcp://localhost:61616?trace=false

     

    2Q?Q? Failover Transport
        Failover Transport是一U重新连接的机制Q它工作于其它transport的上层,用于建立可靠的传输。它的配|语法允许制定Q意多个复合的URI? Failover transport会自动选择其中的一个URI来尝试徏立连接。如果没有成功,那么会选择一个其它的URI来徏立一个新的连接。以下是配置语法Q?br />    failover:(uri1,...,uriN)?transportOptions
        failover:uri1,...,uriN
        Transport Options的可选值如下:

    Option Name D efault Value Description
    initialReconnectDelay 10 How long to wait before the first reconnect attempt (in ms)
    maxReconnectDelay 30000 The maximum amount of time we ever wait between reconnect attempts (in ms)
    useExponentialBackOff true Should an exponential backoff be used between reconnect attempts
    backOffMultiplier 2 The exponent used in the exponential backoff attempts
    maxReconnectAttempts 0 If not 0, then this is the maximum number of reconnect attempts before an error is sent back to the client
    randomize true use a random algorithm to choose the URI to use for reconnect from the list provided
    backup false initialize and hold a second transport connection - to enable fast failover

       例如Qfailover:(tcp://localhost:61616,tcp://remotehost:61616)?initialReconnectDelay=100

     

    2Q?Q? Discovery transport
        Discovery transport是可靠的tranport。它使用Discovery transport来定位用来连接的URI列表。以下是配置语法Q?br />    discovery:(discoveryAgentURI)?transportOptions
        discovery:discoveryAgentURI
        Transport Options的可选值如下:

    Option Name Default Value Description
    initialReconnectDelay 10 How long to wait before the first reconnect attempt
    maxReconnectDelay 30000 The maximum amount of time we ever wait between reconnect attempts
    useExponentialBackOff true Should an exponential backoff be used btween reconnect attempts
    backOffMultiplier 2 The exponent used in the exponential backoff attempts
    maxReconnectAttempts 0 If not 0, then this is the maximum number of reconnect attempts before an error is sent back to the client

       例如Qdiscovery:(multicast://default)?initialReconnectDelay=100  
        Z使用Discovery来发现brokerQ需要ؓbroker启用discovery agent?以下是XML配置文g中的一个例子:

    Xml代码
    1. < broker   name = "foo" >   
    2.    <transportConnectors>  
    3.       <transportConnector uri="tcp://localhost:0" discoveryUri="multicast://default"/>  
    4.     </transportConnectors>  
    5.     ...  
    6. </ broker >   

       在用Failover Transport或Discovery transport{能够自动重q的transport的时候,需要注意的是:设想有两个brokerQ它们都启用AMQ Message Store作ؓ持久化存储,有一个producer和一个consumerq接到某个queue。当因其中一个broker失效时而切换到另一? broker的时候,如果失效的broker的queue中还有未被consumer消费的消息,那么q个queue里的消息仍然滞留在失效broker 的中Q直到失效的broker被修复ƈ重新切换回这个被修复的broker后,之前被保留的消息才会被consumer消费掉。如果被处理的消息有时序? Ӟ那么应用E序需要处理这个问题。另外也可以通过ActiveMQ集群来解册个问题?/p>

       在transport重连的时候,可以在connection上注册TransportListener来获得回调,例如Q?/p>

    Java代码
    1. (ActiveMQConnection)connection).addTransportListener( new  TransportListener() {  
    2.     public void onCommand(Object cmd) {  
    3.     }  
    4.   
    5.     public void onException(IOException exp) {  
    6.     }  
    7.   
    8.     public void transportInterupted() {  
    9.         // The transport has suffered an interruption from which it hopes to recover.  
    10.     }  
    11.   
    12.     public void transportResumed() {  
    13.         // The transport has resumed after an interruption.  
    14.     }  
    15. });


    C物 2010-09-01 22:26 发表评论
    ]]>
    ActiveMQ in Action(1)http://m.tkk7.com/libin2722/articles/330623.htmlC物C物Wed, 01 Sep 2010 14:25:00 GMThttp://m.tkk7.com/libin2722/articles/330623.htmlhttp://m.tkk7.com/libin2722/comments/330623.htmlhttp://m.tkk7.com/libin2722/articles/330623.html#Feedback0http://m.tkk7.com/libin2722/comments/commentRss/330623.htmlhttp://m.tkk7.com/libin2722/services/trackbacks/330623.html

    1 JMS
        在介lActiveMQ之前Q首先简要介l一下JMS规范?br />1Q? JMS的基本构?br />1Q?Q? q接工厂
        q接工厂是客L来创接的对象Q例如ActiveMQ提供的ActiveMQConnectionFactory?/p>


    1Q?Q? q接
        JMS Connection装了客户与JMS提供者之间的一个虚拟的q接?/p>


    1Q?Q? 会话
        JMS Session是生产和消费消息的一个单U程上下文。会话用于创建消息生产者(producerQ、消息消费者(consumerQ和消息QmessageQ等。会话提供了一个事务性的上下文,在这个上下文中,一l发送和接收被组合到了一个原子操作中?/p>


    1Q?Q? 目的?br />    目的地是客户用来指定它生产的消息的目标和它消费的消息的来源的对象。JMS1.0.2规范中定义了两种消息传递域Q点对点QPTPQ消息传递域和发?订阅消息传递域?br />点对Ҏ息传递域的特点如下:

    • 每个消息只能有一个消费者?/li>
    • 消息的生产者和消费者之间没有时间上的相x。无论消费者在生者发送消息的时候是否处于运行状态,它都可以提取消息?/li>

       发布/订阅消息传递域的特点如下:

    • 每个消息可以有多个消费者?/li>
    • 生者和消费者之间有旉上的相关性。订阅一个主题的消费者只能消费自它订阅之后发布的消息。JMS规范允许客户创徏持久订阅Q这在一定程度上放松了时间上的相x要求。持久订阅允许消费者消费它在未处于Ȁzȝ态时发送的消息?/li>

      在点对点消息传递域中,目的地被成ؓ队列QqueueQ;在发?订阅消息传递域中,目的地被成ؓ主题QtopicQ?/p>

     

    1Q?Q? 消息生?br />    消息生者是׃话创建的一个对象,用于把消息发送到一个目的地?/p>


    1Q?Q? 消息消费?br />    消息消费者是׃话创建的一个对象,它用于接收发送到目的地的消息。消息的消费可以采用以下两种Ҏ之一Q?/p>

    • 同步消费。通过调用消费者的receiveҎ从目的地中显式提取消息。receiveҎ可以一直阻塞到消息到达?/li>
    • 异步消费。客户可以ؓ消费者注册一个消息监听器Q以定义在消息到达时所采取的动作?/li>

    1Q?Q? 消息
        JMS消息׃下三部分l成Q?/p>

    • 消息头。每个消息头字段都有相应的getter和setterҎ?/li>
    • 消息属性。如果需要除消息头字D以外的|那么可以使用消息属性?/li>
    • 消息体。JMS定义的消息类型有TextMessage、MapMessage、BytesMessage、StreamMessage和ObjectMessage?/li>

    1Q? JMS的可靠性机?br />1Q?Q? 认
        JMS消息只有在被认之后Q才认ؓ已经被成功地消费了。消息的成功消费通常包含三个阶段Q客h收消息、客户处理消息和消息被确认?br />    在事务性会话中Q当一个事务被提交的时候,认自动发生。在非事务性会话中Q消息何时被认取决于创Z话时的应{模式(acknowledgement modeQ。该参数有以下三个可选|

    • Session.AUTO_ACKNOWLEDGE。当客户成功的从receiveҎq回的时候,或者从MessageListener.onMessageҎ成功q回的时候,会话自动认客户收到的消息?/li>
    • Session.CLIENT_ACKNOWLEDGE? 客户通过消息的acknowledgeҎ认消息。需要注意的是,在这U模式中Q确认是在会话层上进行:认一个被消费的消息将自动认所有已被会话消 费的消息。例如,如果一个消息消费者消费了10个消息,然后认W?个消息,那么所?0个消息都被确认?/li>
    • Session.DUPS_ACKNOWLEDGE? 该选择只是会话q钝W确认消息的提交。如果JMS providerp|Q那么可能会D一些重复的消息。如果是重复的消息,那么JMS provider必须把消息头的JMSRedelivered字段讄为true?/li>

    1Q?Q? 持久?br />    JMS 支持以下两种消息提交模式Q?/p>

    • PERSISTENT。指CJMS provider持久保存消息Q以保证消息不会因ؓJMS provider的失败而丢失?/li>
    • NON_PERSISTENT。不要求JMS provider持久保存消息?/li>

    1Q?Q? 优先U?br />    可以使用消息优先U来指示JMS provider首先提交紧急的消息。优先?0个别,?Q最低)?Q最高)。如果不指定优先U,默认U别?。需要注意的是,JMS providerq不一定保证按照优先的顺序提交消息?/p>


    1Q?Q? 消息q期
        可以讄消息在一定时间后q期Q默认是怸q期?/p>


    1Q?Q? 临时目的?br />    可以通过会话上的createTemporaryQueueҎ和createTemporaryTopicҎ来创Z时目的地。它们的存在旉只限于创建它们的q接所保持的时间。只有创临时目的地的q接上的消息消费者才能够从时目的地中提取消息?/p>


    1Q?Q? 持久订阅
        首先消息生者必M用PERSISTENT提交消息。客户可以通过会话上的createDurableSubscriberҎ来创Z个持久订阅,该方法的W一个参数必L一个topic。第二个参数是订阅的名称?br />    JMS provider会存储发布到持久订阅对应的topic上的消息。如果最初创建持久订阅的客户或者Q何其它客户用相同的q接工厂和连接的客户ID、相? 的主题和相同的订阅名再次调用会话上的createDurableSubscriberҎQ那么该持久订阅׃被激zRJMS provider会象客户发送客户处于非Ȁzȝ态时所发布的消息?br />    持久订阅在某个时d能有一个激zȝ订阅者。持久订阅在创徏之后会一直保留,直到应用E序调用会话上的unsubscribeҎ?/p>


    1Q?Q? 本地事务
        在一个JMS客户端,可以使用本地事务来组合消息的发送和接收。JMS Session接口提供了commit和rollbackҎ。事务提交意味着生的所有消息被发送,消费的所有消息被认Q事务回滚意味着生的所有消 息被销毁,消费的所有消息被恢复q新提交,除非它们已经q期?br />    事务性的会话L牉|C务处理中Qcommit或rollbackҎ一旦被调用Q一个事务就l束了,而另一个事务被开始。关闭事务性会话将回滚其中的事务?br />需要注意的是,如果使用h/回复机制Q即发送一个消息,同时希望在同一个事务中{待接收该消息的回复Q那么程序将被挂P因ؓ知道事务提交Q发送操作才会真正执行?br />    需要注意的q有一个,消息的生产和消费不能包含在同一个事务中?/p>


    1Q? JMS 规范的变q?br />    JMS的最新版本的?.1。它和同1.0.2版本之间最大的差别是,JMS1.1通过l一的消息传递域化了消息传递。这不仅化了JMS APIQ也有利于开发h员灵z选择消息传递域Q同时也有助于程序的重用和维护?br />以下是不同消息传递域的相应接口:

    JMS 公共 点对点域 发布/订阅?/strong>
    ConnectionFactory QueueConnectionFactory TopicConnectionFactory
    Connection QueueConnection TopicConnection
    Destination Queue Topic
    Session QueueSession TopicSession
    MessageProducer QueueSender TopicPublisher
    MessageConsumer QueueReceiver TopicSubscriber

     

    2 ActiveMQ
    2Q? Broker
    2Q?Q? Running Broker
        ActiveMQ5.0 的二q制发布包中bin目录中包含一个名为activemq的脚本,直接q行q个脚本可以启动一个broker?br />    此外也可以通过Broker Configuration URI或Broker XBean URI对brokerq行配置Q以下是一些命令行参数的例子:

    Example
    Description
    activemq
    Runs a broker using the default 'xbean:activemq.xml' as the broker configuration file.
    activemq xbean:myconfig.xml
    Runs a broker using the file myconfig.xml as the broker configuration file that is located in the classpath.
    activemq xbean:file:./conf/broker1.xml
    Runs a broker using the file broker1.xml as the broker configuration file that is located in the relative file path ./conf/broker1.xml
    activemq xbean:file:C:/ActiveMQ/conf/broker2.xml
    Runs a broker using the file broker2.xml as the broker configuration file that is located in the absolute file path C:/ActiveMQ/conf/broker2.xml
    activemq broker:(tcp://localhost:61616, tcp://localhost:5000)?useJmx=true
    Runs a broker with two transport connectors and JMX enabled.
    activemq broker:(tcp://localhost:61616, network:tcp://localhost:5000)?persistent=false
    Runs a broker with 1 transport connector and 1 network connector with persistence disabled.

     

    2Q?Q? Embedded Broker
        可以通过在应用程序中以编码的方式启动brokerQ例如:

    Java代码
    1. BrokerService broker =  new  BrokerService();  
    2. broker.addConnector("tcp://localhost:61616");  
    3. broker.start();  
        如果需要启动多个brokerQ那么需要ؓbroker讄一个名字。例如:
    Java代码
    1. BrokerService broker = new BrokerService();  
    2. broker.setName("fred");  
    3. broker.addConnector("tcp://localhost:61616");  
    4. broker.start();  
        如果希望在同一个JVM内访问这个brokerQ那么可以用VM TransportQURI是:vm://brokerName。关于更多的broker属性,可以参考Apache的官Ҏ档?br />    此外Q也可以通过BrokerFactory来创建brokerQ例如:
    Java代码
    1. BrokerService broker = BrokerFactory.createBroker(new URI(someURI));  
        someURI的可选值如下:
    URI schemeExampleDescription
    xbean:xbean:activemq.xmlSearches the classpath for an XML document with the given URI (activemq.xml in this case) which will then be used as the Xml Configuration
    file:file:foo/bar/activemq.xmlLoads the given file (in this example foo/bar/activemq.xml) as the Xml Configuration
    broker:broker:tcp://localhost:61616Uses the Broker Configuration URI to configure the broker

       当用XBean的配|方式的时候,需要指定一个xml配置文gQ例如:

    Java代码
    1. BrokerService broker = BrokerFactory.createBroker(new URI("xbean:com/test/activemq.xml"));  
        使用Spring的配|方式如下:
    Xml代码
    1. <bean id="broker" class="org.apache.activemq.xbean.BrokerFactoryBean">  
    2.   <property name="config" value="classpath:org/apache/activemq/xbean/activemq.xml" />  
    3.   <property name="start" value="true" />  
    4. </bean>  

     

    2Q?Q? Monitoring Broker
    2Q?Q?Q? JMX
        在用JMX监控broker之前Q首先要启用broker的JMX监控功能Q例如在配置文g中设|useJmx="true"Q如下:

    Xml代码
    1. <broker useJmx="true" brokerName="broker1>  
    2.   <managementContext>  
    3.      <managementContext createConnector="true"/>  
    4.   </managementContext>  
    5.   ...  
    6. </broker>  
        接下来运行JDK自带的jconsole。在q行了jconsole后,它会弹出对话框来选择需要连接到的agent。如果是在启动broker的主Z q行jconsoleQ那么ActiveMQ broker会出现在jconsole的Local 标签中。如果要q接到远E的brokerQ那么可以在Advanced标签中指定JMX URLQ以下是一个连接到本机的JMX URLQ?br />    service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi

       在jconsole的MBeans标签中,可以查看详细信息Q也可以执行相应的operation。需要注意的是,在jconsoleq接到broker 的时候,q不需要输入用户名和密码,如果q存在潜在的安全问题Q那么就需要ؓJMX Connector配置密码保护Q需要?.5以上版本的JDKQ。 ?

       首先要禁止ActiveMQ创徏自己的connectorQ例如:

    Xml代码
    1. <broker xmlns="http://activemq.org/config/1.0" brokerName="localhost"useJmx="true">  
    2.   <managementContext>  
    3.      <managementContext createConnector="false"/>  
    4.   </managementContext>  
    5. </broker>  
        然后在ActiveMQ的conf目录下创Z个访问控制文件和密码文gQ如下:
    conf/jmx.accessQ?br /># The "monitorRole" role has readonly access.
    # The "controlRole" role has readwrite access.
    monitorRole readonly
    controlRole readwrite

     

    conf/jmx.passwordQ?br /># The "monitorRole" role has password "abc123".
    # The "controlRole" role has password "abcd1234".
    monitorRole abc123
    controlRole abcd1234

     

       然后修改ActiveMQ的bin目录下activemq的启动脚本,查找包含"SUNJMX="的一行如下:

    REM set SUNJMX=-Dcom.sun.management.jmxremote.port=1616 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
        把它替换?br />set SUNJMX=-Dcom.sun.management.jmxremote.port=1616 -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.password.file=%ACTIVEMQ_BASE%/conf/jmx.password -Dcom.sun.management.jmxremote.access.file=%ACTIVEMQ_BASE%/conf/jmx.access
        最后重启ActiveMQ和jconsoleQ这时候需要强制login。如果在启动activemq的过E中出现以下错误Q那么需要ؓq个文g增加讉K 控制。Windowsq_上的具体解决Ҏ请参考如下网址Qhttp://java.sun.com/j2se/1.5.0/docs/guide /management/security-windows.html
    Error: Password file read access must be restricted: D:\apache-activemq-5.0.0\bin\../conf/jmx.password

     

    2Q?Q?Q? Web Console
        Web Console被集成到了ActiveMQ的二q制发布包中Q因此缺省访问http://localhost:8161/admin卛_讉KWeb Console?br />    在配|文件中Q可以通过修改nioConnector的port属性来修改Web console的缺省端口:

    Xml代码
    1. <jetty xmlns="http://mortbay.com/schemas/jetty/1.0">  
    2.   <connectors>  
    3.     <nioConnector port="8161" />  
    4.   </connectors>  
    5.   ...  
    6. </jetty>  

        Z安全性或者可靠性的考虑QWeb Console 可以被部|到不同于ActiveMQ的进E中。例如把activemq-web-console.war部vC个单独的web容器? QTomcatQJetty{)。在ActiveMQ5.0的二q制发布包中不包含activemq-web-console.warQ因此需要下? ActiveMQ的源码,然后q入?{activemq.base}/src/activemq-web-console目录中执行mvn instanll。如果一切正常,那么~省会在${activemq.base}/src/activemq-web-console/target目录 中生成activemq-web-console-5.0.0.war。然后将activemq-web-console-5.0.0.war拯? Tomcat的webapps目录中,q命名成activemq-web-console.war?/p>

       需要注意的是,要将activemq-all-5.0.0.jar拯到WEB-INF\lib目录中(可能q需要拷贝jms.jarQ。还要ؓTomcat讄以下五个pȝ属性(修改catalina.bat文gQ:

    set JAVA_OPTS=%JAVA_OPTS% -Dwebconsole.type="properties"
    set JAVA_OPTS=%JAVA_OPTS% -Dwebconsole.jms.url="tcp://localhost:61616"
    set JAVA_OPTS=%JAVA_OPTS% -Dwebconsole.jmx.url="service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi"
    set JAVA_OPTS=%JAVA_OPTS% -Dwebconsole.jmx.role=""
    set JAVA_OPTS=%JAVA_OPTS% -Dwebconsole.jmx.password=""

       如果JMX没有配置密码保护Q那么webconsole.jmx.role和webconsole.jmx.password讄?"卛_。如? broker被配|成了Master/Slave模式Q那么可以配|成使用failover transportQ例如:

    -Dwebconsole.jms.url=failover:(tcp://serverA:61616,tcp://serverB:61616)

       Z说一下,׃webconsole.type 属性是propertiesQ因此实际上起作用的Web Console的配|文件是WEB-INF/ webconsole-properties.xml。最后启动被监控的ActiveMQQ访问http://localhost:8080 /activemq-web-console/Q查看显C是否正常?

     

    2Q?Q?Q? Advisory Message
        ActiveMQ 支持Advisory MessagesQ它允许你通过标准的JMS 消息来监控系l。目前的Advisory Messages支持Q?

    • consumers, producers and connections starting and stopping
    • temporary destinations being created and destroyed
    • messages expiring on topics and queues
    • brokers sending messages to destinations with no consumers.
    • connections starting and stopping

      Advisory Messages可以被想象成某种的管理通道Q通过它你可以得到关于JMS provider、producers、consumers和destinations的信息。Advisory topics都用ActiveMQ.Advisory.q个前缀Q以下是目前支持的topicsQ? 

       Client based advisories

    Advisory TopicsDescription
    ActiveMQ.Advisory.ConnectionConnection start & stop messages
    ActiveMQ.Advisory.Producer.QueueProducer start & stop messages on a Queue
    ActiveMQ.Advisory.Producer.TopicProducer start & stop messages on a Topic
    ActiveMQ.Advisory.Consumer.QueueConsumer start & stop messages on a Queue
    ActiveMQ.Advisory.Consumer.TopicConsumer start & stop messages on a Topic

     
        在消费者启?/span>/停止?/span>Advisory Messages的消息头中有?/span>consumerCount属性,他用来指明目?/span>desination上活跃的consumer的数量?/span>

         Destination and Message based advisories
    Advisory TopicsDescription
    ActiveMQ.Advisory.QueueQueue create & destroy
    ActiveMQ.Advisory.TopicTopic create & destroy
    ActiveMQ.Advisory.TempQueueTemporary Queue create & destroy
    ActiveMQ.Advisory.TempTopicTemporary Topic create & destroy
    ActiveMQ.Advisory.Expired.QueueExpired messages on a Queue
    ActiveMQ.Advisory.Expired.TopicExpired messages on a Topic
    ActiveMQ.Advisory.NoConsumer.QueueNo consumer is available to process messages being sent on a Queue
    ActiveMQ.Advisory.NoConsumer.TopicNo consumer is available to process messages being sent on a Topic

       以上的这些destnations都可以用来作为前~Q在其后面追加其它的重要信息Q例如topic、queue、clientID? producderID和consumerID{。这令你可以利用Wildcards ?Selectors 来过滤Advisory MessagesQ关于Wildcard和Selector会在E后介绍Q?/p>

       例如Q如果你希望订阅FOO.BARq个queue上Consumer的start/stop的消息,那么可以订阅 ActiveMQ.Advisory.Consumer.Queue.FOO.BARQ如果希望订阅所有queue上的start/stop消息Q那么可 以订阅ActiveMQ.Advisory.Consumer.Queue.>Q如果希望订阅所有queue或者topic上的 start/stop消息Q那么可以订阅ActiveMQ.Advisory.Consumer. >?/p>

        org.apache.activemq.advisory.AdvisorySupportcM有如下的helper methodsQ用来在E序中得到advisory destination objects?/p>

    Java代码
    1. AdvisorySupport.getConsumerAdvisoryTopic()  
    2. AdvisorySupport.getProducerAdvisoryTopic()  
    3. AdvisorySupport.getDestinationAdvisoryTopic()  
    4. AdvisorySupport.getExpiredTopicMessageAdvisoryTopic()  
    5. AdvisorySupport.getExpiredQueueMessageAdvisoryTopic()  
    6. AdvisorySupport.getNoTopicConsumersAdvisoryTopic()  
    7. AdvisorySupport.getNoQueueConsumersAdvisoryTopic()  

       以下是段使用Advisory Messages的程序代码:

    Java代码
    1. Destination advisoryDestination = AdvisorySupport.getProducerAdvisoryTopic(destination)  
    2. MessageConsumer consumer = session.createConsumer(advisoryDestination);  
    3. consumer.setMessageListener(this);  
    4. ...  
    5. public void onMessage(Message msg){  
    6.     if (msg instanceof ActiveMQMessage){  
    7.         try {  
    8.              ActiveMQMessage aMsg =  (ActiveMQMessage)msg;  
    9.              ProducerInfo prod = (ProducerInfo) aMsg.getDataStructure();  
    10.         } catch (JMSException e) {  
    11.             log.error("Failed to process message: " + msg);  
    12.         }  
    13.     }  
    14. }  

     

    2Q?Q?Q? Command Agent
        在介lCommand Agent前首先简要介l一下XMPP(Jabber)协议QXMPP是一U基于XML的即旉信协议Q它由Jabber软g基金会开发。在配置文g中通过增加transportConnector来支持XMPP协议Q?

    Xml代码
    1. <broker xmlns="http://activemq.org/config/1.0">  
    2.   <transportConnectors>  
    3.      ...  
    4.      <transportConnector name="xmpp"     uri="xmpp://localhost:61222"/>  
    5.   </transportConnectors>  
    6. </broker>  
        ActiveMQ提供了ActiveMQ messages和XMPP之间的双向桥接:
    • 如果客户加入了一个聊天室Q那么这个聊天室的名字会被映到一个JMS topic?/li>
    • 试在聊天室内发送消息会D一个JMS消息被发送到q个topic?/li>
    • 呆在一个聊天室中意味着q将保持一个对相应JMS topic的订阅。因此发送到q个topic的JMS消息也会被发送到聊天室?/li>

       推荐XMPP客户端Spark(http://www.igniterealtime.org/)?

       ?.2版本PActiveMQ支持Command Agent。在配置文g中,通过讄commandAgent来启用Command AgentQ?/p>

    Xml代码
    1. <beans>  
    2.   <broker useJmx="true" xmlns="http://activemq.org/config/1.0">  
    3.     ...  
    4.   </broker>  
    5.   <commandAgent xmlns="http://activemq.org/config/1.0"/>  
    6. </beans>  
        启用了Command Agent的broker上会有一个来自Command Agent的连接,它同时订阅topicQ? ActiveMQ.Agent。在你启动XMPP客户端,加入到ActiveMQ.Agent聊天室后Q就可以同brokerq行交谈了。通过在XMPP 客户端中键入helpQ可以得到帮助信息?br />    需要注意的是,ActiveMQ5.0版本有个bugQ如果broker没有采用~省的用户名和密码,那么Command Agent便无法正常启动。Apache官方文档_此bug已经被修正,预定?.2.0版本上体现。修Ҏ式如下:
    Xml代码
    1. <commandAgent xmlns="http://activemq.org/config/1.0" brokerUser="user" brokerPassword="passward"/>  

     

    2Q?Q?Q? Visualization plugin
        ActiveMQ支持以broker插g的Ş式生成DOT文g(可以用agrviewer来查?Q以图表的方式描qconnections、sessions、producers、consumers、destinations{信息。配|方式如下: 

    Xml代码
    1. <broker xmlns="http://activemq.org/config/1.0" brokerName="localhost" useJmx="true">  
    2.       ...  
    3.       <plugins>  
    4.           <connectionDotFilePlugin  file="connection.dot"/>  
    5.           <destinationDotFilePlugin file="destination.dot"/>  
    6.       </plugins>  
    7. </broker>  

       需要注意的是,W者认为ActiveMQ5.0版本的Visualization Plugin不E_Q存在诸多问题。例如:如果使用connectionDotFilePluginQ那么brokerName必须? localhostQ如果用destinationDotFilePlugin可能会导致ArrayStoreException?



    C物 2010-09-01 22:25 发表评论
    ]]>
    վ֩ģ壺 99þƷƵ77| ޹ҹƷƬ߲| AVһԧӰԺ| ޾ƷƵ߹ۿ| ҹwwwʪô| Ƶ| ˺ݺۺϾþ| Ļ߲| ͵޾Ʒ1ҳ| һëƬѿ˾| þAAAƬ69| ĻĴȫ| AV볱߹ۿ| һëƬƬѹۿ| 99Ļ| ݽվƵ| þ4438| ձĻ| ͼƬУ԰С˵| վWWW߹ۿ| ˿appַios| vaþþþ| 8xƵ| ҹһӰԺ| ѿƬִֻ| Ѽվһҳ| ¶ۺɫ| ߹ۿվڵ| ҹƬAVƬ| ĻóӰԺ| һѹۿ| ޳aƬ߹| վ߹ۿ| һˮëƬѿ| ŷ߲| ѹ˸߹ۿ鶹| һ| AVۺɫ͵ | ëƬƵѹۿ| ѲŮһëƬ| þ|