1. 集群
集群:主要是用来错误转发和负载均衡。不过如果服务器里面有没有消费掉的消息,这时候如果服务器down了机,那没有消费掉的消息只能是等服务器好了之后才能继续被消费。
这个问题的解决方案是用master/slave的模式。(但这个性能上很大影响。Master要恢复也是要把slave停了才可以恢复的。)
集群分两种:
Failover:这种是用来解决如果一个服务器down了,马上可以切换到另一台服务器。
Network: 这种是用来解决一个服务器生产的东西,可以在另一个服务器去消费。

2. Queue顺序
Queue中的消息是按照顺序被分发到consumers的。然而,当你有多个consumers同时从相同的queue中提取消息时,你将失去这个保证。因为这些消息是被多个线程并发的处理。
所以一个queue固定一个消费者来保证顺序。

3. 监控
用的是JMX
可以通过RemoteJMXBrokerFacade来得到BrokerViewMBean:
如:

public static void main(String[] args) { 

 RemoteJMXBrokerFacade createConnector = new RemoteJMXBrokerFacade(); 


 System.setProperty("webconsole.jmx.url", "service:jmx:rmi:///jndi/rmi://10.200.48.49:1099/jmxrmi"); 

 //System.setProperty("webconsole.jmx.user","controlRole"); 

 // System.setProperty("webconsole.jmx.password","abcd1234"); 

 SystemPropertiesConfiguration configuration = new SystemPropertiesConfiguration(); 

 createConnector.setConfiguration(configuration); 

 try { 

 BrokerViewMBean brokerAdmin = createConnector.getBrokerAdmin(); 

 System.out.println(brokerAdmin.getBrokerName()); 


 } catch (Exception e) { 

 // TODO Auto-generated catch block 

 e.printStackTrace(); 

 } 

 }



4. Activemq.xml简单说明。
4.1 配置连接用户名和密码:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 

 <property name="locations"> 

 <value>file:${activemq.base}/conf/credentials.properties</value> 

 </property> 

 </bean>


这个是配置用户名和密码的配置上,这里只是说明用户名和密码,没有应用,应用要这样写。

<!--在Broker中,配置插件--> 

 <plugins> 

 <simpleAuthenticationPlugin> 

 <users> 

 <authenticationUser username="${activemq.username}" password="${activemq.password}" groups="users,admins"/> 

 </users> 

 </simpleAuthenticationPlugin> 

 </plugins>



应用用户名和密码后
Java代码

ConnectionFactory cf = new ActiveMQConnectionFactory("username", "password", "tcp://195.2.199.169:61616")



4.2 系统持久化空间的配置
4.2.1 desitination配置:
1.memorylimit:内存限制,当消息发生累积到限制的数值时,amq会主动控制流量,停止消息的生产
2.producerFlowControl="false":关闭流量控制
建议生产环境下应该打开流量控制开关,以避免生成端占用大部分io能力,阻塞消息端的情况
<policyEntry queue=">" memoryLimit="100mb" producerFlowControl="false"/>


4.2.2存储配置:
amq可以使用文件系统或者数据库存储累积的消息,文件系统存储使用的是其自有的kaha存储系统,
数据库可以使用内嵌的Derby或者mysql,oracle

persistenceAdapter文件系统配置
1.indexBinSize:索引文件缓存页面数,缺省为1024,当amq扩充或者缩减存储时,会锁定整个
broker,导致一定时间的阻塞,所以这个值应该调整到比较大,但是代码中实现会动态伸缩,调整效果不理想
2.cleanupInterval:定时清楚存储文件,将那些完全为空的文件删除
3.maxFileLength:数据文件大小
4.forceRecoverReferenceStore和recoverReferenceStore:
缺省设置为false,amq重启时每次恢复强制从日志一条一条一次redo恢复,100W数据恢复要半个小时

<persistenceAdapter> 

 <amqPersistenceAdapter syncOnWrite="false" directory="${activemq.base}/data" maxFileLength="32 mb" indexBinSize="8192" 

cleanupInterval="30000" forceRecoverReferenceStore="false" recoverReferenceStore="false"/> 

 </persistenceAdapter>



4.2.3 SystemUsage配置:
SystemUsage配置设置了一些系统内存和硬盘容量,当系统消耗超过这些容量设置时,amq会放慢生产

1.memoryUsage:amq使用内存大小,这个值应该大于所有durable desitination设置的memoryUsage之和,否则会导致硬盘swap,影响性能
2.storeUsage:kaha数据存储大小,如果设置不足,性能会下降到1个1个发的地步
3.tempUsage:非persistent的消息存储在temp区域,我们系统存储都是persistent的消息,该值可以设置小点

<systemUsage> 

 <systemUsage> 

 <memoryUsage> 

 <memoryUsage limit="512 mb"/> 

 </memoryUsage> 

 <storeUsage> 

 <storeUsage limit="8 gb" name="foo"/> 

 </storeUsage> 

 <tempUsage> 

 <tempUsage limit="100 mb"/> 

 </tempUsage> 

 </systemUsage> 

 </systemUsage>



4.3 集群的配置
Failover: 有两种配置方式一种是静态的,把所有的ip地址都写在配置上,这种方式比较郁闷,改一台机子就要加一个ip,所以用动态的。
先加上

<transportConnectors> 

<transportConnector uri="tcp://0.0.0.0:61616" discoveryUri="multicast://default"/> 

</transportConnectors>


两只集群的activemq都要加上这一段。
Java代码这样写

connectionFactory = new ActiveMQConnectionFactory( 

 "", "", 

"discovery:(multicast://default)");


这样连接的时候就会自动可以错误转发了。
如果214机子坏了,或者重启了,连接会自动切换到49上。

Network:也是有两种配置方式:一种是静态的,所以也是介绍动态:

<networkConnectors> 

<networkConnector uri="multicast://default"/> 

</networkConnectors>


如果是集群的方式通常都是这两种方式结合一起用。

4.4 master/slave的配置
Master broker不需要特殊的配置。Slave broker需要进行以下配置

<broker masterConnectorURI="tcp://masterhost:62001" shutdownOnMasterFailure="false"> 

... 

<transportConnectors> 

<transportConnector uri="tcp://slavehost:61616"/> 

</transportConnectors> 

</broker>



4.5 jmx的配置
如果要使用jmx.activemq.xml要配置一下。

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="cmcc" useJmx="true" dataDirectory="${activemq.base}/data" destroyApplicationContextOnStop="true"> 

 <managementContext> 

 <managementContext createConnector="true"/> 

</managementContext>


要把这两个属性都设置为true.
连接的java代码如上所说。


参考文档:
ActiveMQ_in_Action.pdf