ActiveMQ初步介绍
- 请移步ActiveMQ初步介绍
关于JMS
JAVA消息服务(JMS)定义了java中访问消息中间件的接口, JMS只是接口,并没有给予实现,实现JMS接口的消息中间件称JMS Provider,已有的MOM系统包括Apache的ActiveMQ、以及阿里巴巴的RocketMQ、IBM的MQseries、微软的MSMQ和BEA的MessageQ、RabbitMQ等等,他们都基本遵守JMS规范
JMS实现JMS接口的消息中间件
--Provider (MessageProvider) 生产者
--Consumer(MessageConsumer) 消费者
--PTP Point to Point 点对点的消息类型
--Pub/Sub Publish/Subscribe 即发布/订阅的消息模型
--Queue 队列目标
--Topic 主题目标
--ConnectionFactory 连接工厂 JMS用它创建连接
--Connection JMS 客户端到JMS Provider 的连接
--Destination 消息的目的地
--Session 会话, 一个发送或者接收消息的线程
JMS定义了五种不同的消息正文格式,以及调用的额消息类型,允许你发送并接收一些不同形式的数据, 提供现有消息格式的一些级别的兼容性.
StreamMessage Java 原始值的数据流
MapMessage 一套名称-值对
TextMEssage 一个字符串对象
ObjectMessage 一个序列化的JAVA对象
BytesMessage 一个未解释字节的数据流
Session接口(会话)
表示一个单线程的上下文,用于发送和接收消息,由于会话是单线程的,所以消息是连续的,就是说消息是按照发送的顺序一个一个接收的, 会话的好处是它支持事务,如果用户选择了事务支持,会话上下文将保存一组消息,直到事务被提交才发送这些消息, 在提交事务之前,用户可以使用回滚操作来取消这些消息,一个会话允许用户创建消息生生产者来发送消息,创建消息消费者来接收消息
ActiveMQ—conf目录
activemq.xml
----------------------核心配置文件jetty.xml
-----------------------------核心配置文件jetty-rala.proporties
---------------配置用户名密码
ActiveMQ实现接收和发送
Connection方法使用
在成功创建正确的ConnectionFactory后,下一步将是创建一个连接, 它是JMS定义的一个接口,ConnectionFactory负责返回可以与底层消息传递系统进行通信的Connection实现,通常客户端只使用单一连接,根据JMS文档,Connection的目的是 “利用JMS提供者封装开放的连接” 以及表示, “客户端与提供者服务例程之间的开发TCP/IP套接字” 该文档还指出Connection应该是进行客户端身份验证的地方.
当一个Connection被创建时,它的传输默认是关闭的, 必须使用start方法开启, 一个Connection可以建立一个或多个Session
当一个程序执行完成后,必须关闭之前创建的Connection,否则ActiveMQ不能释放资源,关闭一个Connection同样也关闭Session, MessageProducer和MessageConsumer
Connection createConnection();
Connection createConnection(String userName, String password)
一旦从ConnectionFactory中获得一个Connection,必须从Connection中创建一个或者多个Session, Session 是一个发送或者接收消息的线程, 可以使用Session创建MessageProducer, MessageConsumer和Message
Session 可以被事务化, 也可以不被事务化, 通常, 可以通过向Connection上的适当创建方法传递一个布尔参数对此进行设置;
Session createSession(boolean transacted, int acknowledgeMode)
其中transacted为使用事务表示, acknowledgeMode为签收模式 结束事务有两种方法: 提交或者回滚, 当一个事务提交, 消息被处理,;如果事务中有一个步骤失败, 事务就回滚, 这个事务中的已经执行的动作将被取消, 在发送消息最后也必须要使用session.commit()方法表示提交事务
签收模式有三种形式:
- Session.AUTO_ACKNOWLEDGE 当客户端从receive或onMessage成功返回时, Session自动签收客户端的这条消息的收条
- Session.CLIENT_ACKNOWLEDGE 客户端通过调用消息(message) 的acknowledge方法签收消息, 这种情况下, 签收发生在Session层面:签收一个已消费的消息会自动签收这个Session所有已经消费的手收条
- Session.DUPS_OK_ACKNOWLEDGE 此选项指示Session不必确保对传送消息的签收, 它可能引起消息的重复,但是降低了Session的开销, 所以之后客户端能容忍重复的消息,才可用
MessageProducer
MessageProducer: MessageProducer是一个有Session创建的对象,用来想Destination发送消息
void send(Destination destination, Message message);
void send(Destination destination, Message message, int deliveryMode,int priority, long timeToLive);
void send(Message message);
void send(Message message, int diliveryMode, int priority, long timeToLive);
send()
方法可以有5个参数
- –第一个参数: 目的地
- –第二个参数: 消息
- –第三个参数: 是否持久化
- –第四个参数: 优先级(0–9 0–4表示普通 5–9 表示加急 默认4)
- –第五个参数: 消息在mq上存放的有效期
其中diliveryMode为传送模式,priority为消息优先级, timeToLive为消息过期时间,ActiveMQ支持两种消息传送模式,PERSISTENT和NON_PERSISTENT两种,如果不指定传送模式,那么默认是持久性消息,如果容忍消息丢失,那么使用非持久性消息可以改变性能和减少存储的开销.
消息优先级从0--9是个级别, 0--4 是普通消息, 5--9是加急消息, 如果不指定 优先级,则默认为4,JMS不要求严格按照这十个优先级发送消息,但必须保证加急消息要优先于普通消息
默认情况下,消息不会过期,如果消息在特定周期内失去意义,那么可以设置过期时间,时间单位为毫秒