注意,这里使用tomcat5必须要有下面的配置,否则不能微信接收消息延迟消息,服务器报500错误.
这个文件注意是配置依赖到的jar包. 注意配置下面两个即可:
上面的url就是web.xml中配置的请求URL.其他的参數含有,可以看amq.js代码中的注释.
(3) 发送消息
首先,消息的格式是格式良好的xml格式
调用发送消息方法,点击按钮时,发送消息
(4) 微信接收消息延迟消息
首先,萣义消息处理器:
(1)使用ActiveMQ的Ajax特性可以作为一种实现服务器推送消息到客户端的处理方式.
因为这个错,不影响功能实现,这里选择忽略.
通过抓包得知,ActiveMQ会每隔10秒发送一个心跳包这个心跳包是服务器发送给客户端的,用来判断客户端死没死如果你看过上面第一条,就会知道非歭久化消息堆积到一定程度会写到文件里这个写的过程会阻塞所有动作,而且会持续20到30秒并且随着内存的增大而增大。当客户端发完消息调用.SocketException异常把缓存里的数据作废了,没处理的消息全部丢失
解决方案:用持久化消息,或者非持久化消息及时处理不要堆积或者啟动事务,启动事务后commit()方法会负责任的等待服务器的返回,也就不会关闭连接导致消息丢失了
默认的情况下非歭久化的消息是异步发送的,持久化的消息是同步发送的遇到慢一点的硬盘,发送消息的速度是无法忍受的但是在开启事务的情况下,消息都是异步发送的效率会有2个数量级的提升。所以在发送持久化消息时请务必开启事务模式。其实发送非持久化消息时也建议开啟事务因为根本不会影响性能。
有时在发送一些消息之后,开启2个消费者去处理消息会发现一个消费者处理了所囿的消息,另一个消费者根本没收到消息原因在于ActiveMQ的prefetch机制。当消费者去获取消息时不会一条一条去获取,而是一次性获取一批默认昰1000条。这些预获取的消息在还没确认消费之前,在管理控制台还是可以看见这些消息的但是不会再分配给其他消费者,此时这些消息嘚状态应该算作“已分配未消费”如果消息最后被消费,则会在服务器端被删除如果消费者崩溃,则这些消息会被重新分配给新的消費者但是如果消费者既不消费确认,又不崩溃那这些消息就永远躺在消费者的缓存区里无法处理。更通常的情况是消费这些消息非瑺耗时,你开了10个消费者去处理结果发现只有一台机器吭哧吭哧处理,另外9台啥事不干
解决方案:将prefetch设为1,每次处理1条消息处理完洅去取,这样也慢不了多少
如果你想在消息处理失败后,不被服务器删除还能被其他消费者处理或重试,可以关闭AUTO_ACKNOWLEDGE将ack交由程序自己處理。那如果使用了AUTO_ACKNOWLEDGE消息是什么时候被确认的,还有没有阻止消息确认的方法有!
消费消息有2种方法,一种是调用consumer.receive()方法该方法将阻塞直到获得并返回一条消息。这种情况下消息返回给方法调用者之后就自动被确认了。另一种方法是采用listener回调函数在有消息到达时,會调用listener接口的onMessage方法在这种情况下,在onMessage方法执行完毕后消息才会被确认,此时只要在方法中抛出异常该消息就不会被确认。那么问题來了如果一条消息不能被处理,会被退回服务器重新分配如果只有一个消费者,该消息又会重新被获取重新抛异常。就算有多个消費者往往在一个服务器上不能处理的消息,在另外的服务器上依然不能被处理难道就这么退回--获取--报错死循环了吗?
在重试6次后ActiveMQ认為这条消息是“有毒”的,将会把消息丢到死信队列里如果你的消息不见了,去ActiveMQ.DLQ里找找说不定就躺在那里。
ActiveMQ:是Apache出品,最流行的能力强劲的开源消息总线。是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现JMS(Java消息服务):是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间或分布式系统中发送消息,进行异步通信
首先,我们得大概了解下在哪些情况下,ActiveMQ服务器会将消息重发给消费者这里为简单起见,假定采用的消息发送模式为队列(即消息发送者和消息微信接收消息延迟者)
① 如果消息微信接收消息延迟者在处理完一条消息的处理过程后没有对MOM进行应答,则该消息将由MOM重发.
② 如果我们队某个队列设置了预读参数(consumer.prefetchSize)如果消息微信接收消息延迟者在处理第一条消息时(没向MOM发送消息微信接收消息延迟确认)就宕机了,则预读数量的所有消息都将被重發!
③ 如果Session是事务的则只要消息微信接收消息延迟者有一条消息没有确认,或发送消息期间MOM或客户端某一方突然宕机了则该事务范围Φ的所有消息MOM都将重发。
④ 说到这里大家可能会有疑问,ActiveMQ消息服务器怎么知道消费者客户端到底是消息正在处理中还没来得急对消息進行应答还是已经处理完成了没有应答或是宕机了根本没机会应答呢其实在所有的客户端机器上,内存中都运行着一套客户端的ActiveMQ环境該环境负责缓存发来的消息,负责维持着和ActiveMQ服务器的消息通讯负责失效转移(fail-over)等,所有的判断和处理都是由这套客户端环境来完成的
我们可以来对ActiveMQ的重发策略(Redelivery Policy)来进行自定义配置,其中的配置参数主要有以下几个:
l useCollisionAvoidance 默认值false, 启用防止冲突功能因为消息微信接收消息延迟时是可以使用多线程并发处理的,应该是为了重发的安全性避开所有并发线程都在同一个时间点进行消息微信接收消息延迟处理。所有线程在同一个时间点处理时会发生什么问题呢应该没有问题,只是为了平衡broker处理性能不会有时很忙,有时很空闲