1.服务挂掉
ActiveMQ的储存机制:
在通常的情况下,非持久化消息是存储在内存中的,持久化消息是存储在文件中的,它们的最大限制在配置文件的节点中配置。
如果,在非持久化消息堆积到一定程度,内存告急的时候,ActiveMQ会将内存中的非持久化消息写入临时文件中,以腾出内存。
虽然都保存到了文件里,但它和持久化消息的区别是,重启后持久化消息会从文件中恢复,非持久化的临时文件会直接删除。
持久化存储
当消息量足够大时,持久化消息存储文件超过最大限制(比如设置文件最大2G)。
此时生产者发送消息阻塞,但消费者可正常连接并消费消息,等消息消费掉一部分,文件删除又腾出空间之后,生产者又可继续发送消息,服务自动恢复正常。
非持久化存储
当采用非持久化消息设置后,消息量足够大时,非持久化消息存储文件超过最大限制(假设设置最大2G)。
这时生产者阻塞,而消费者可以连接,却不能消费或者原本慢速消费的消费者,消费突然停止。整个系统可连接,但是无法提供服务,就这样挂了。
解决方案:
此时,可以看出为了保证消息的安全性和服务稳定,最好采用消息持久化,如果不用,在部分情况下应增大临时文件限制。
2.消息丢失
这得从java的java.net.SocketException异常说起。
简单点说就是当网络发送方发送一堆数据,然后调用close关闭连接之后。这些发送的数据都在接收者的缓存里,接收者如果调用read方法仍旧能从缓存中读取