往期学习汇总——ActiveMq

      回顾往期项目,梳理下以前用到的东西,ActiveMq篇。

 ActiveMq是什么?

  个人理解,avtive是目前网上说的很多的"消息中间件",可以用来操作两个系统的数据交互(类似接口)。tomcat,weblogic 等为中间件,中间件为非操作系统,非业务应用软件,不是最终给客户使用的。  两者要区分开。

  1.使用场景。

  之前在税务行业工作时,最开始用的是webservice接口与神码公司进行数据交互,当时正值金三上线时期,双方测试环境经常性重启,造成数据缺失。后面在数据库里面跑了个job,定时检索未发送成功的数据,然后再次发送,因为金三库是个大库,许多纳税人白天去税务大厅办事,所以这个job一直放在晚上执行,但是很快发现了第二个问题,数据延迟性。后面跟对方讨论了下,废弃了该方案,用mq进行替换。

       2.ActiveMq的使用。

     (1)搭建步骤:

       A:  百度官网下载对应服务器版本,如图

 

  tar.gz解压指令是:tar -zxvf filename.tar.gz,这个百度上随便搜

 

      B:  解压后进入主文件的bin目录 执行 ./ativemq start 启动 ActiveMQ

      C:  浏览器输入 启动服务器的  IP:8161进入web页面,点击 Manage ActiveMQ broker可以查看消息推送的状态,默认账户、密码为:admin,admin。

       (2)错误排查:

       ActiveMq也与tomcat、weblogic一样有错误信息,错误日志存在于 /root/apache-mq/data 有个叫 activemq.log的日志文件,里面会列出如端口占用等报错信息。

       (3)使用步骤:

       点对点方式:

           ①.配置文件中引入依赖:

    
            org.apache.activemq
            activemq-all
            5.9.0
        

   ②.生产者类:

/**
 * @Description 生产者
 * @Date 2099/12/24
 * @Created by dcj
 */
public class MyProducer {
     //定义ActivMQ的连接地址
    private static final String ACTIVEMQ_URL = "tcp://127.0.0.1:61616";

    public static void main(String[] args) throws JMSException {
        // 创建连接工厂
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
        // 创建连接
        Connection connection = activeMQConnectionFactory.createConnection();
        // 打开连接
        connection.start();
        // 创建会话
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        // 创建队列目标,并标识队列名称,消费者根据队列名称接收数据
        Destination destination = session.createQueue("myQueue");
        // 创建一个生产者
        MessageProducer producer = session.createProducer(destination);
        // 向队列推送10个文本消息数据
        for (int i = 1 ; i <= 10 ; i++){
            // 创建文本消息
            TextMessage message = session.createTextMessage("第" + i + "个文本消息");
            //发送消息
            producer.send(message);
            //在本地打印消息
            System.out.println("已发送的消息:" + message.getText());
        }
        //关闭连接
        connection.close();
    }

}

      运行结果:

    

已发送的消息:第1个文本消息
已发送的消息:第2个文本消息
已发送的消息:第3个文本消息
已发送的消息:第4个文本消息
已发送的消息:第5个文本消息
已发送的消息:第6个文本消息
已发送的消息:第7个文本消息
已发送的消息:第8个文本消息
已发送的消息:第9个文本消息
已发送的消息:第10个文本消息

 

           ③.此时可以在web端查看是否有10条消息等待消费

      ④.消费者类:

/**
 * @Description 消费者类
 * @Date 2099/12/24 
 * @Created by dcj
 */
public class MyConsumer {
  
   //MQ链接地址
private static final String ACTIVEMQ_URL = "tcp://127.0.0.1:61616"; public static void main(String[] args) throws JMSException { // 创建连接工厂 ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL); // 创建连接 Connection connection = activeMQConnectionFactory.createConnection(); // 打开连接 connection.start(); // 创建会话 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // 创建队列目标,并标识队列名称,消费者根据队列名称接收数据 Destination destination = session.createQueue("myQueue"); // 创建消费者 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(); } } }); } }

 测试结果:

消费的消息:第1个文本消息
消费的消息:第2个文本消息
消费的消息:第3个文本消息
消费的消息:第4个文本消息
消费的消息:第5个文本消息
消费的消息:第6个文本消息
消费的消息:第7个文本消息
消费的消息:第8个文本消息
消费的消息:第9个文本消息
消费的消息:第10个文本消息

 

   订阅模式

    ①.订阅模式的生产者

/**
 * @Description 基于发布/订阅模式传输类型的生产者
 * @Date 2099/12/24 
 * @Created by dcj
 */
public class MyProducerForTopic {
    //mq地址
    private static final String ACTIVEMQ_URL = "tcp://127.0.0.1:61616";

    public static void main(String[] args) throws JMSException {
        // 创建连接工厂
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
        // 创建连接
        Connection connection = activeMQConnectionFactory.createConnection();
        // 打开连接
        connection.start();
        // 创建会话
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        // 创建队列目标,并标识队列名称,消费者根据队列名称接收数据
        Destination destination = session.createTopic("topicTest");
        // 创建一个生产者
        MessageProducer producer = session.createProducer(destination);
        // 向队列推送10个文本消息数据
        for (int i = 1 ; i <= 10 ; i++){
            // 创建文本消息
            TextMessage message = session.createTextMessage("第" + i + "个文本消息");
            //发送消息
            producer.send(message);
            //在本地打印消息
            System.out.println("已发送的消息:" + message.getText());
        }
        //关闭连接
        connection.close();
    }

}

      ②.订阅模式的消费者

 

/**
 * @Description 基于发布/订阅模式传输类型的消费者测试
 * @Date 2099/12/24 
 * @Created by dcj
 */
public class MyConsumerForTopic {

    private static final String ACTIVEMQ_URL = "tcp://127.0.0.1:61616";

    public static void main(String[] args) throws JMSException {
        // 创建连接工厂
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
        // 创建连接
        Connection connection = activeMQConnectionFactory.createConnection();
        // 打开连接
        connection.start();
        // 创建会话
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        // 创建队列目标,并标识队列名称,消费者根据队列名称接收数据
        Destination destination = session.createTopic("topicTest");
        // 创建消费者
        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)