ActiveMQ

AMQ:

JMS实现JMS接口的消息中间件
Provider(MessageProvider):生产者
Consumer(MessageConsumer):消费者
PTP:Point to Point,即点对点的消息模式
Pub/Sub:Publish/Subscribe,即发布/订阅的消息模式
Queue:队列目标
Topic:主题目标
ConnectionFactory:连接工厂,JMS用它创建连接
Connection: JMS客户端到JMS Provider的连接
Destination:消息的目的地
Session:会话,一个发送或接受消息的线程

MessageConsumer接口(消息消费者)

由会话创建的对象,用于接收发送到目标的消息.消费者可以同步地(阻塞模式),或异步(非阻塞)接受队列和主题类型的消息
MessageProducer接口(消息生产者)
由会话创建的对象,用于发送消息的目标.用户可以创建某个目标的发送者,也可以创建一个通用的发送者,在发送时指定目标.
Message接口(消息)
是在消费者和生产者之间传送的对象,也就是说从一个应用程序传送到另一个应用程序.一个消息由三个主要部分:
消息头(必须):包含用于识别和为消息寻找路由的操作设置
一组消息属性(可选):包含额外的属性,支持其他提供者和用户的兼容.可以创建定制的字段和过滤器(消息选择器).
一个消息(可选):允许用户创建五种类型的消息(文本消息,映射消息,字节消息,流消息和对象消息).
消息接口非常灵活,并提供了许多方式来定制消息的内容.

JMS定义了五种不同的消息正文格式,以及调用消息类型,允许你发送并接收一些不同形式的数据,提供现有消息格式的一些级别的兼容性.
StreamMessage Java原始值的数据流
MapMessage 一套名称-值对
TextMessage 一个字符串对象
ObjectMessage 一个序列化的Java对象
BytesMessage 一个未解释字节的数据流

Session接口(会话)

表示一个单线程的上下文,用于发送和接受消息.由于会话是单线程的,所以消息是连续的,就是说消息是按照发送的顺序一个一个接受的.会话的好处是它支持事务.如果用户选择了事务支持,会话上下文将保存一组消息,直到事务被提交才发送这些消息.在提交事务之前,用户可以使用回滚操作取消这些消息.一个会话允许用户创建消息生产者来发送消息,创建消息消费者来接收消息.

简单示例

需要实现接受者和发送者两部分

Sender/Receiver
第一步:建立ConnectionFactory工厂对象,需要填入用户名,密码,以及要了解的地址,均使用默认即可,默认端口为 "tcp://localhost61616"
第二步:通过ConnectionFactory工厂对象我们创建一个Connection连接,并且调用Connection的start方法开启连接,Connection默认是关闭的.
第三步:通过Connection对象创建Session会话(上下文环境对象),用于接收消息,参数配置1为是否启用事务,参数配置2为签收模式,一般我们设置自动签收.
第四步:通过Session创建Destination对象,指的是一个客户端用来指定生产消息和消费消息来源的对象,在PTP模式中,Destination被称作Queue即队列,在Pub/Sub模式,Destination被称作Topic即主题.在程序中可以使用多个Queue和Topic
第五步:我们需要通过Session对 象创建消息的发送和接收对象(生产者和消费者)
MessageProducer/MessageConsumer.
第六步:我们可以使用MessageProducer的setDeliveryMode方法为其设置持久化特性和非持久化特性(DeliveryMode)
第七步:最后我们使用JMS规范的TextMessage形式创建数据(通过Session对象),并 用MessageProducer的send方法发送数据.同理客户端使用receive方法进行接收数据,最后不要忘记关闭Connection连接.

在成功创建正确的ConnectionFactory后,下一步将是创建一个连接,它就 是JMS定义的一个接口.ConnectionFactory负责返回可以与底层消息传递系统进行通信的Connection实现.通常客户端只使用单一连接.根据JMS文档,Connection的目的是利用JMS提供者封装开放的连接,以及表示"客户端与提供者服务例程之间的开发TCP/IP套接字(ip加端口)".该文档还指出Connection应该是进行客户端身份验证的地方等等
当一个Connection被创建时,它的传输默认时关闭的,必须使用start方法开启.一个Connection可以建立一个或多个Session.
当一个程序执行完成后,必须关闭之前创建的Connection,否则ActiveMQ不能释放资源,关闭一个Connection同样也关闭了Session,MessageProducer和MessageConsumer;

receive只用到第五步

ActioveMQ安全机制

activemq的web管理界面:http://localhost:8161/admin/
activemq管控台使用jetty部署,所以需要修改密码则到相应的配置文件
conf/jetty-realm.properties
activemq应该设置有安全机制,只有符合认证的用户才能进行发送和获取消息,所以我们也可以在activemq.xml里去添加安全验证配置!加在第123行后

<plugins>
<simpleAuthenticationPlugin>
<users>
<authenticationUser username="admin" password="admin" groups="users,admins"/>
<authenticationUser username="user" password="password" groups="users"/>
</users>
</simpleAuthenticationPlugin>
</plugins>

如果在创建ConnectionFactory用户名和密码都用默认的(ActiveMQConnectionFactory.DEFAULT_XXX)然后再重启AMQ 就会报一个javax.jms.JMSSecurityException: User name [null] or password is invalid.的异常,

Sssion方法使用

一旦从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_ACKNOLEDGE客户端通过调用消息(Message)的acknowledge方法签收消息.在这种情况下,签收发生在Session层面;签收一个已消费的消息会自动签收这个Session所有已消费消息的收条.在接受端接受消息的时候message.acknowledge()这个手动签收用得比较多;
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);
其中deliveryMode为传送模式,priority为消息优先级,timeToLive为消息过期时间.ActiveMQ支持两种消息传送模式;PERSISTENT和NON_PERSISTENT两种.如果不指定传送模式,那么默尔是持久性消息.如果容忍消息丢失,那么使用非持久消息可以改善性能和减少存储的开销.
<policyEntry queue="queueName" prioritize的Message="true" />
消息优先级从0-9十个级别,0-4是普通消息,5-9是加急消息.如果不指定优先级,则默认为4.JMS不要求严格按照这个十个优先级发送消息,但必须保证加急消息优先于不同消息到达.(这个优先级只是可能,不是绝对会依照这个优先级执行)
默认情况下,消息永久不会过期.如果消息在特定周期内失去意义,那么可以设置过期时间,时间单位为毫秒.

MessageConsumer

MessageConsumer是一个由session创建的对象,用来从Destination接受消息.
MessageConsumer createConsumer(Destination destination);
MessageConsumer createConsumer(Destination destination,String messageSelector);
MessageConsumer createConsumer(Destination destination,String messageSelector,boolean noLocal);
TopicSubscriber createDurableSubscriber(Topic topic ,String name);
TopicSubscriber createDurableSubscriber(Topic topic ,String name,String messageSelector,boolean noLocal);
其中messageSelector为消息选择器:noLocal标志默认false,当设置true时限制消费者只能接收和自己相同的连接(Connection)所发布的消息,此标志只适用于主题,不适用于队列(queue);name标识订阅主题所对应的订阅名称,持久订阅时需要设置此参数.
public final String SELECTOR="JMS_TYPE='MY_TAG1')",该选项检查了传入消息的JMS_TYPE属性,并确定了这个属性的值是否等于MY_TAG1.如果相等,则消息被消费,如果不相等,那么消息会被忽略

消息的同步和异步接收:

消息的同步接收时指客户端主动去接收消息,客户端可以采用MessageConsumer的receive方法去接收下一个消息.
Message receive()
Message receive(long timeout)
Message receiveNoWait()
消息的异步接收是指当消息到达时,ActiveMQ主动通知客户端,可以通过注册一个实现MessageListener接口的对象到MessageConsumer.MessageListener只有一个必须实现的方法--onMessage,它只接收一个参数,即Message.在为每个发送到Destination的消息实现onMessage时,将调用该方法.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容