中间件——activityMQ

ActivityMQ

  • JMS

JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。

  • JMS的优势

异步:JMS天生就是异步的,客户端获取消息的时候,不需要主动发送请求,消息会自动发送给可用的客户端。

可靠:JMS保证消息只会递送一次。大家都遇到过重复创建消息问题,而JMS能帮你避免该问题,只是避免而不是杜绝,所以在一些糟糕的环境下还是有可能会出现重复

  • JSM的两种交互方式

点对点消息模型

(1)、每个消息只有一个接受者(自己测试了一下,可以有多个接受者,但是当有多个接收者时,每个接收者只能获取随机的几条信息)

(2)、消息发送者和消息接受者并没有时间依赖性。

(3)、当消息发送者发送消息的时候,无论接收者程序在不在运行,都能获取到消息;

(4)、当接收者收到消息的时候,会发送确认收到通知(acknowledgement)。

(5)点对点消息模型图:

发布/订阅消息模型

(1)、一个消息可以传递给多个订阅者

(2)、发布者和订阅者有时间依赖性,只有当客户端创建订阅后才能接受消息,且订阅者需一直保持活动状态以接收消息。

(3)、为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。

(4)、发布/订阅消息模型图:

  • ActiveMQ的下载

 

 

  • ActiveMQ的点对点使用

Session.AUTO_ACKNOWLEDGE。当客户成功的从receive 方法返回的时候,或者从MessageListener.onMessage方法成功返回的时候,会话自动确认客户收到的消息。

Session.CLIENT_ACKNOWLEDGE。 客户通过消息的 acknowledge 方法确认消息。需要注意的是,在这种模式中,确认是在会话层上进行:确认一个被消费的消息将自动确认所有已被会话消 费的消息。例如,如果一个消息消费者消费了 10 个消息,然后确认第 5 个消息,那么所有 10 个消息都被确认。

Session.DUPS_ACKNOWLEDGE。 该选择只是会话迟钝的确认消息的提交。如果 JMS provider 失败,那么可能会导致一些重复的消息。如果是重复的消息,那么 JMS provider 必须把消息头的 JMSRedelivered 字段设置为 true。

  • maven需要依赖的包

<!-- activemq -->
    <dependency>
      <groupId>org.apache.activemq</groupId>
      <artifactId>activemq-core</artifactId>
      <version>5.7.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.activemq</groupId>
      <artifactId>activemq-pool</artifactId>
      <version>5.12.1</version>
    </dependency>
  • 消息生产者

public class Producer {
    private static final String USERNAME= ActiveMQConnection.DEFAULT_USER; // 默认的连接用户名
    private static final String PASSWORD=ActiveMQConnection.DEFAULT_PASSWORD; // 默认的连接密码
    private static final String BROKEURL=ActiveMQConnection.DEFAULT_BROKER_URL; // 默认的连接地址
    public static void main(String[] args) {
        ConnectionFactory connectionFactory;//连接工厂
        Connection connection = null;//连接
        Session session = null;//会话
        Destination destination  = null;//消息目的地,就是一个消息队列
        MessageProducer messageProducer  = null;//消息生产者

        try {
            //1.连接MQ
            System.out.println("username:"+USERNAME);
            System.out.println("password:"+PASSWORD);
            System.out.println("url:"+BROKEURL);
            connectionFactory = new ActiveMQConnectionFactory(USERNAME,PASSWORD,BROKEURL);
            connection = connectionFactory.createConnection();
            connection.start();
            session = connection.createSession(true,Session.AUTO_ACKNOWLEDGE);

            destination = session.createTopic("ActiveMQTopic");
            messageProducer = session.createProducer(destination);

            Destination destination2 = session.createQueue("spring-activemq");
            MessageProducer messageProducer2 = session.createProducer(destination2);
            //2.发送消息
            for (int i=0;i<10;i++){
                String txt = "电话:1380000111"+i;
                TextMessage txtMsg = session.createTextMessage(txt);
                messageProducer.send(destination,txtMsg);
                System.out.println("发送到MQ:topic" + i);

                TextMessage txtMsg2 = session.createTextMessage(txt);
                messageProducer2.send(destination2,txtMsg2);
                System.out.println("发送到MQ:queue:" + i);
            }
            session.commit();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
  • 消息消费者

public class Consumer {
    private static final String USERNAME= ActiveMQConnection.DEFAULT_USER; // 默认的连接用户名
    private static final String PASSWORD=ActiveMQConnection.DEFAULT_PASSWORD; // 默认的连接密码
    private static final String BROKEURL=ActiveMQConnection.DEFAULT_BROKER_URL; // 默认的连接地址
    public static void main(String[] args) {
        ConnectionFactory connectionFactory;//连接工厂
        Connection connection = null;//连接
        Session session = null;//会话
        Destination destination  = null;//消息目的地,就是一个消息队列
        MessageConsumer messageConsumer  = null;//消息生产者

        try {
            //1.连接MQ
            System.out.println("username:"+USERNAME);
            System.out.println("password:"+PASSWORD);
            System.out.println("url:"+BROKEURL);
            connectionFactory = new ActiveMQConnectionFactory(USERNAME,PASSWORD,BROKEURL);
            connection = connectionFactory.createConnection();
            connection.start();
            session = connection.createSession(true,Session.AUTO_ACKNOWLEDGE);
            destination = session.createQueue("短信发送");
            messageConsumer = session.createConsumer(destination);

            //2.从MQ服务器取消息
            /*for (int i=0;i<5;i++){
                TextMessage textMessage = (TextMessage) messageConsumer.receive();
                System.out.println(textMessage.getText());
            }*/

            //3.写MQ的监听器
            System.out.println("aaaaaaaaaaaaaaa");
            messageConsumer.setMessageListener(new MyMessageListener());
            System.out.println("bbbbbbbbbbb");
            session.commit();
            System.out.println("ccccccccccc");
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            /*System.out.println("关闭");
            //3.断开
            try{
                messageConsumer.close();
                session.close();
                connection.close();
            }catch (Exception e){

            }*/
        }
    }
}
  • 在管理中心

在浏览器中输入:http://127.0.0.1:8161/admin/

 

  • 相关的连接

ssm整合

activitymq使用:https://blog.csdn.net/yinbucheng/article/details/71189324

其他

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值