java消息中间件学习-JMS两种消息模式及代码示例

demo示例代码下载:

https://download.csdn.net/download/qq_43560721/12799687

 

JMS消息模式:

1.队列模式P2P

特点:客户端包括生产者和消费者;队列中的消息只能被一个消费者消费;消费者可以随时消费队列中的消息

解释:P2P (点对点)消息域使用 queue 作为 Destination,消息可以被同步或异步的发送和接收,每个消息只会给一个 Consumer 传送一次。

Consumer 可以使用 MessageConsumer.receive() 同步地接收消息,也可以通过使用MessageConsumer.setMessageListener() 注册一个 MessageListener 实现异步接收。

多个 Consumer 可以注册到同一个 queue 上,但一个消息只能被一个 Consumer 所接收,然后由该 Consumer 来确认消息。并且在这种情况下,Provider 对所有注册的 Consumer 以轮询的方式发送消息。

队列模式的消息演示:

创建生产者:

package cn.xxs.jms.queue;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

/**
 * @Author xxs
 * @Date 2020/9/2 14:43
 */
public class AppProducer {
    private static final String url = "tcp://192.168.4.123:61616";
    private static final String queueName = "queue-test";
    public static void main(String[] args) throws JMSException {

        //创建ConnectionFactory
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
        //创建Connection
        Connection connection = connectionFactory.createConnection();
        //启动连接
        connection.start();
        //创建会话
        Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
        //创建一个目标
        Destination destination = session.createQueue(queueName);
        //创建一个生产者
        MessageProducer producer = session.createProducer(destination);
        for (int i=0;i<10;i++){
            //创建消息
            TextMessage textMessage = session.createTextMessage("test message"+i);
            //发布消息
            producer.send(textMessage);
            System.out.println("发送消息"+textMessage.getText());
        }
        //关闭连接
        connection.close();

    }
}

运行代码后,控制台打印如下:

我们去ActiveMQ看一下可以看到刚刚发送的10条消息:

创建消费者:

package cn.xxs.jms.queue;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

/**
 * @Author xxs
 * @Date 2020/9/2 15:55
 */
public class AppConsumer {
    private static final String url = "tcp://192.168.4.123:61616";
    private static final String queueName = "queue-test";
    public static void main(String[] args) throws JMSException {

        //创建ConnectionFactory
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
        //创建Connection
        Connection connection = connectionFactory.createConnection();
        //启动连接
        connection.start();
        //创建会话
        Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
        //创建一个目标
        Destination destination = session.createQueue(queueName);
        //创建一个消费者
        MessageConsumer consumer = session.createConsumer(destination);
        //创建一个监听器
        consumer.setMessageListener(new MessageListener() {
            public void onMessage(Message message) {
                TextMessage textMessage = (TextMessage) message;
                try {
                    System.out.println("接收消息:"+textMessage.getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

运行代码后,控制台打印如下:

我们去ActiveMQ看一下可以看到刚刚发送的10条消息已经被消费:

我们可以再创建一个消费者2和消费者一起消费生产者生产的消息。

运行两个消费者,然后运行生产者。

生产者生产10条消息:

消费者1

消费者2

由上可以看出消费者平均消费生产者产生的消息,由此总结

 

2.主题模式Pub/Sub

特点:客户端包括发布者和订阅者;主题中的消息被所有订阅者消费;消费者不能消费订阅之前就发送到主题中的消息

解释:Pub/Sub(发布/订阅,Publish/Subscribe)消息域使用 topic 作为 Destination,发布者向 topic 发送消息,订阅者注册接收来自 topic 的消息。发送到 topic 的任何消息都将自动传递给所有订阅者。接收方式(同步和异步)与 P2P 域相同。
除非显式指定,否则 topic 不会为订阅者保留消息。当然,这可以通过持久化(Durable)订阅来实现消息的保存。这种情况下,当订阅者与 Provider 断开时,Provider 会为它存储消息。当持久化订阅者重新连接时,将会受到所有的断连期间未消费的消息。

队列模式的消息演示:

创建发布者:

package cn.xxs.jms.topic;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

/**
 * @Author xxs
 * @Date 2020/9/2 14:43
 */
public class AppProducer {
    private static final String url = "tcp://192.168.4.123:61616";
    private static final String topicName = "topic-test";
    public static void main(String[] args) throws JMSException {

        //创建ConnectionFactory
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
        //创建Connection
        Connection connection = connectionFactory.createConnection();
        //启动连接
        connection.start();
        //创建会话
        Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
        //创建一个目标(主题)
        Destination destination = session.createTopic(topicName);
        //创建一个生产者
        MessageProducer producer = session.createProducer(destination);
        for (int i=0;i<10;i++){
            //创建消息
            TextMessage textMessage = session.createTextMessage("test message"+i);
            //发布消息
            producer.send(textMessage);
            System.out.println("发送消息"+textMessage.getText());
        }
        //关闭连接
        connection.close();

    }
}

运行代码:

创建消费者:

两个消费者代码一样

package cn.xxs.jms.topic;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

/**
 * @Author xxs
 * @Date 2020/9/2 15:55
 */
public class AppConsumer {
    private static final String url = "tcp://192.168.4.123:61616";
    private static final String topicName = "topic-test";
    public static void main(String[] args) throws JMSException {

        //创建ConnectionFactory
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
        //创建Connection
        Connection connection = connectionFactory.createConnection();
        //启动连接
        connection.start();
        //创建会话
        Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
        //创建一个目标
        Destination destination = session.createTopic(topicName);
        //创建一个消费者
        MessageConsumer consumer = session.createConsumer(destination);
        //创建一个监听器
        consumer.setMessageListener(new MessageListener() {
            public void onMessage(Message message) {
                TextMessage textMessage = (TextMessage) message;
                try {
                    System.out.println("接收消息:"+textMessage.getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

运行两个消费者代码发现什么都没有接收到,这里就是注意点:

消费者不能消费订阅之前就发送到主题中的消息

所以我们再次运行生产者发布10条消息:

然后发现两个消费者都消费了刚刚重新运行生产者我生产的10条消息,如下图:

  

由上可以看出消费者全部消费生产者产生的消息,由此总结

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值