activemq使用

首先进行相关的配置,首先在properties文件,配置mq地址

#mq address
jms.broker.url=failover:(tcp://ip:61616?connectionTimeout=3000)?timeout=5000&initialReconnectDelay=1000&maxReconnectDelay=1000&nested.wireFormat.maxInactivityDuration=30000
failover:mq的传输配置选项实现客户端与代理(client-to-broker)之间的通信,主要为了断线重连,在集群环境中存在master和slave,
配置多个url,当master失效的时候,尝试连接其他的url,activemq还提供一个选项,randomize,默认是true,
即默认客户端会对url进行重排序,为了保证先连master,设置成false。
(详情http://activemq.apache.org/failover-transport-reference.html)

tcp:是mq默认使用的网络协议,activemq支持多种网络协议,如下图所示

conf/activemq.xml



对于activemq来说无论是消费者还是生产者,都是client端,而activemq则是broker端,主要用来接收消息并对消息做一定处理后分发消息。activemq的核心通讯机制分为三部分,建立连接,关闭连接,心跳。

建立连接

(1)activemq初始化时,通过TcpTransportserver类根据配置打开tcp侦听端口,client端通过该端口发起建立连接的动作。

(2)把接收到的socket放入阻塞队列

(3)把另外一个线程socket handler阻塞着,监听是否有新的socket,如果有则取出来

(4)生成一个TransportConnection的实例。TransportConnection类的主要用途是处理链路的状态信息,并实现CommandVisitor接口来完成各类消息的处理

(5)TransportConnection会使用一个由多个TransportFilter实例组成的消息处理链条,负责对接收到的各类消息进行处理并发送相应的应答。这个链条的典型组成顺序:MutexTransport->WireFormatNegotiator->InactivityMonitor->TcpTransport。在这个链条中的最后一环是TcpTransport类,它是实际和Client获取和发送数据的地方,该类的重要方法有run()和oneway(),一个负责读取一个负责发送。

(6)建链完成,可以进行通讯操作。

关闭链接

activemq发现tcp链接关闭,最关键的代码在TcpBufferedInputStream类中的int n=in.read(buffer,position,buffer.length-position);

心跳

为了更好的维护tcp链路的使用,ActiveMQ采用了心跳机制作为判断双方链路的健康情况。ActiveMQ使用的是双向心跳,也就是ActiveMQ的Broker和Client双方都进行相互心跳,但不管Broker或Client心跳的具体处理情况是完全一样的,都在InactivityMonitor类中实现,心跳会产生两个线程“InactivityMonitor ReadCheck”和“InactivityMonitor WriteCheck”,它们都是Timer类型,都会隔一段固定时间被调用一次。ReadCheck线程主要调用的方法是readCheck(),当在等待时间内,有消息接收到,则该方法会返回true。WriteCheck线程主要调用的方法是writeCheck()。当WriteCheck线程休眠时,有任何数据发送成功,则该线程被唤醒后,不用通过TCP向对方真的发送心跳消息,这样可以从一定程度上减少网络传输的数据量。

(详情:http://activemq.apache.org/tcp-transport-reference.html)

connectionTimeout:tcp连接超时设置

timeout:在不中断重新连接过程的情况下设置发送操作的超时(以毫秒为单位)

initialReconnectDelay:第一次重新连接尝试之前的延迟(以毫秒为单位)

maxReconnectDelay:第二次和后续重新连接尝试之间的最大延迟(以ms为单位)

nested.wireFormat.maxInactivityDuration(以ms为单位):是心跳参数设置为0,表示客户端永远不和服务器断开,但是一旦客户端永久down掉,线程会一直在等待,设置30s,避免在一段时间内没有消息发送时抛出"channel was inactive for too long"


productor spring 配置


optimizeAcknowledge表示是否开启“优化Acknowledge”,只有在为true的情况下,prefetchSize以及optimizeAcknowledgeTimeout参数才会有意义,optimizeAcknowledgeTimeout只有在brokerurl中配置才会有作用。配置在brokerurl中,作用范围时全局的,即当前factory下所有的connection/session/consumer都会默认使用这些值,也可以消费者端配置,为单个消费者配置,两者同时开启,全局配置将会被覆盖。

queuePrefetch :如果消费者端的工作策略是按照某个周期(例如1秒),主动到服务器端一条一条请求新的消息,那么消费者的工作效率一定是极低的;所以ActiveMQ系统中,默认的策略是ActiveMQ服务端一旦有消息,就主动按照设置的规则推送给当前活动的消费者。其中每次推送都有一定的数量限制,这个限制值就是prefetchSize,而queuePrefetch则指定队列模式下预取数量

RedeliveryPolicy:消息重发策略。当消费者在处理消息时有异常发生,会将消息重新放回Queue里,进行下一次处理。当超过重试次数时,消息会被放置到一个特殊的Queue中,即Dead Letter Queue(死信队列)

redeliveryDelay:设置间隔时间为100ms

maximumRedeliveries:最大重发次数是3次

jmsTemplate:为消息生产者端和消费服务端提供了事务的支持。可以通过操作事务的commit和rollback方法,向服务器告知一组消息是否处理完成。采用事务的意义在于,一组消息要么被全部处理并确认成功,要么全部被回滚并重新处理。启动一个事务,并由消息发送者的连接会话设置一个事务号Transaction ID,然后在事务中发送多条消息。这个事务提交前这些消息都不会进入队列(无论是Queue还是Topic),不进入队列,并不代表JMS不会在事务提交前将消息发送给ActiveMQ服务端。 实际上这些消息都会发送给服务端,服务端发现这是一条带有Transaction ID的消息,就会将先把这条消息放置在“transaction store”区域中(并且带有redo日志,这样保证在收到rollback指令后能进行取消操作),等待这个Transaction ID被rollback或者commit

explicitQosEnabled:deliveryMode等配置开关

deliveryMode:设置持久化:1,非持久化;2,持久化























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值