3.JMS规范

0.1 概述

0.2JMS的组成和特点

        JMS provider:实现JMS接口和规范的消息中间件,也就是MQ服务器

        JMS producter:消息生产者,创建和发送JMS消息的客户端应用

        JMS consumer:消息消费者,接收和处理JMS消息的客户端应用

        JMS message:

                消息头:

                        JMSDestination:消息发送的目的地,主要是指Queue和Topic

                        JMSDeliveryMode:持久模式和非持久模式

                                一条持久性的消息:如果JMS提供者出现故障,该消息并不会丢失,它会在服务器恢复之后再次传递。

                                一条非持久性的消息:最多会发送一次,这意味着服务器出现故障,该消息将会永远丢失。

                        JMSExpiration:可以设置在一定时间后过期,默认是永不过期。

                                timeToLive值等于零,表示该消息永不过期

                                如果发送后,在消息过期时间之后消息还没有被发送到目的地,则该消息被清除。

                        JMSPriority:消息优先级,从0-9十个级别,0到4是普通消息,5到9是加急消息,默认4级。

                        JMS MessageID:唯一识别每个消息的标识由MQ产生。

                消息体:封装具体的消息数据,有5种消息体格式,发送和接收的消息体类型必须一致对应。

                        TextMessage:普通字符串消息,包含一个string

                        MapMessage:一个Map类型的消息,key为string类型,而值为java的基本类型

                        BytesMessage:二进制数组消息,包含一个byte[]

                        StreamMessage:Java数据流消息,用标准流操作来顺序的填充和读取

                        ObjectMessage:对象消息,包含一个可序列化的Java对象

                消息属性:如果需要消息头字段以外的值,那么可以使用消息属性,有识别/去重/重点标注等操作的方法。

                        是以属性名和属性值对的形式制定的。指定一些消息头没有包括的附加信息。

0.3JMS的可靠性

        PERSLSTENT:持久性

producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);//非持久:生产者发送消息到mq上,mq宕机则消息丢失
producer.setDeliveryMode(DeliveryMode.PERSISTENT);//持久:生产者发送消息到mq上,mq宕机消息不会丢失。(队列默认)
//如果主题设置持久化那么生产者的connection.start要放在持久化设置的下面

                 主题设置持久化那么消费者就要订阅主题:

public static void main(String[] args) throws JMSException, IOException {
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory("tcp://192.168.12.128:61616");//1.创建连接工厂,按照给定的url地址,采用默认的用户名和密码
        Connection connection = activeMQConnectionFactory.createConnection();//2.通过连接工厂获得连接
        connection.setClientID("zhangsan");//3.表示一个叫zhangsan的订阅了主题
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);//4.创建会话Session。参数1事务;参数2签收
        Topic topic01 = session.createTopic("topic01");//5.创建目的地主题.参数为主题名称
        TopicSubscriber topicSubscriber = session.createDurableSubscriber(topic01, "wo shi zhangsan");//6.订阅topic01主题;备注
        connection.start();//7.启动
        TextMessage textMessage = (TextMessage)topicSubscriber.receive();
        System.out.println(textMessage.getText());
        //8.关闭资源
        topicSubscriber.close();
        session.close();
        connection.close();
        //必须先运行消费者,向mq注册并订阅了主题,然后在运行生产者
        //消费者如果离线了,下次连接的时候,会把没有收到的消息都接收下来
}

        transaction:事务

                生产者事务:

                        false:执行send()后就提交到队列中。

                        true:执行send()后,在session关闭之前执行commit(),消息才提交到队列中。也可以回滚。

                消费者事务:

                        false:消息只接收一次,不会重复。

                        true:不提交的话,会认为你没有消费,接收的消息会重复。

        Acknowledge:签收

                非事务:

                        自动签收(默认):session.AUTO_ACKNOWLEDGE

                        手动签收:session.CLIENT_ACKNOWLEDGE

                                调用acknowledge方法手动签收,否则在MQ上会认为你没有消费,接收的消息会重复。

System.out.println("=====消费者接收到消息"+textMessage.getText());
textMessage.acknowledge();

                         允许重复消息:session.DUPS_OK_ACKNOWLEDGE

                事务:开启事务后,只有commit才会把消息变为已消费,不管你是什么签收方式。

        注意:事务偏生产者,签收偏消费者

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值