ActiveMQ

1.JMS(Java Message Service)

    1)JMS简介: JAVA提供的一组Java消息服务的规范,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
    2)API对象:
        ActiceMQConnectionFactory: 连接工厂,客户用来创建连接的对象;
        Connection: 连接对象
        Session:会话对象,是发送和接收消息的上下文,用于创建消息生产者,消息消费者,相比RecketMQ,Session提供事务性。
        Destination:指定生产消息的目的地和消费信息的来源对象。
         生产者、Consumer: 消费者,会话创建的对象
    3)消息通信机制:
        a. 点对点(p2p): 一个消息只有一个消费者(Consumer),一旦消费,消息就不再存在消息队列中。发送者和接收者之间没有时间上的依赖性,不关发送者在发送消息后接受者是否正在运行,都不会印象消息被发送大队列。接收者在成功接收消息后需向队列应答成功。 应用场景: 订单商品扣库存 目的地:Queue 队列
        b. 发布订阅(Pub/Sub): 每个消息可以有多个消费者。发布者和订阅者有时间上的依赖性,先有订阅者订阅,才能消费发布者的消息,且订阅者必须保持在运行状态。为了缓和严格的时间相关性,JMS 允许订阅者创建一个可持久化的订阅。 应用场景: 消息推送 目的地 : Topic 主题

2.消息中间件使用场景

     1、异步处理: 减少程序的处理时间,优化用户体验,
     2、应用解耦: 通过消息队列处理一些系统故障无法处理的信息
     3、流量削峰: 控制活动人数,缓解短时间内高流量对服务器的压力
     4、消息通讯: 在不同应用中相互通讯
使用场景详解

3.ActiveMQ的使用

# a.安装JDK
1.导入JDK压缩包
2.解压  tar -zxvf ....
3.vi /etc/profile    (系统)
4.添加
	export JAVA_HOME=JDK安装的路径
	export PATH=$PATH:$JAVA_HOME/bin
5.source /etc/profile
6.java -version

# b.安装 ActiveMQ
1.导入ActiveMQ的压缩包
2.解压
3.启动
	./activeMq start
4.开启日志
	data 目录下 activeMq.log
	tail -f activeMq.log  开启实时的日志
5.通过客户端工具连接
	ip:8161/admin
	用户名:admin
	密码:admin
	用户名,密码在哪看
	vi /conf/users.properties
	admin=admin

实际代码:

//生产者

@Test//生产者
    public void shouldAnswerWithTrue() throws JMSException {
        //1.创建ActiveMq 的连接工厂
        String borkerUrl = "tcp://192.168.40.30:61616";
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(borkerUrl);
        //2.创建连接
        Connection connection = connectionFactory.createConnection();
        //3.创建会话
        //参数1:true:开启事务控制  Session.AUTO_ACKNOWLEDGE: 开启自动回执
        Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
        //4.创建生产者并制定目的地
        Destination des = new ActiveMQQueue("180-firstQueue");
        MessageProducer producer = session.createProducer(des);

        //5.生产者发布消息
        ActiveMQTextMessage msg = new ActiveMQTextMessage();
        msg.setText("First-Msg");
        producer.send(msg);

        //6.会话 提交
        session.commit();
        //7.资源的释放
        connection.close();
        session.close();
        producer.close();
    }

// 消费者

@Test//消费者
    public void test() throws JMSException {
        //1.创建连接的工厂
        String url = "tcp://192.168.40.30:61616";
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
        //2.创建连接
        Connection connection = connectionFactory.createConnection();
        //消费 必须开启连接
        connection.start();
        //3.创建会话
        Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
        //4.创建消费者
        Destination des = new ActiveMQQueue("180-firstQueue");
        MessageConsumer consumer = session.createConsumer(des);
        //5.消费
        TextMessage msg = (TextMessage) consumer.receive();
        System.out.println(msg.getText());

        //6.会话提交
        session.commit();
        //7.释放资源
        connection.close();
        session.close();
        consumer.close();

    }

// 发布
@Test//发布
    public void shouldAnswerWithTrue() throws JMSException {
        String url = "tcp://192.168.40.30:61616";
        //1.创建连接工厂
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(url);
        //2.创建连接
        TopicConnection topicConnection = activeMQConnectionFactory.createTopicConnection();
        //3.创建主题会话
        TopicSession topicSession = topicConnection.createTopicSession(true, Session.AUTO_ACKNOWLEDGE);
        //4.创建发布
        Topic topic = new ActiveMQTopic("180-Topic");
        TopicPublisher publisher = topicSession.createPublisher(topic);
        //5.发布消息
        ActiveMQTextMessage msg = new ActiveMQTextMessage();
        msg.setText("FirstTestTopic");
        publisher.publish(msg);
        //6.会话提交
        topicSession.commit();
        //7.资源释放
        topicConnection.close();
        topicSession.close();
        publisher.close();
    }

// 订阅
@Test//订阅者1号
    public void test() throws JMSException {
        String url = "tcp://192.168.40.30:61616";
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(url);
        TopicConnection topicConnection = activeMQConnectionFactory.createTopicConnection();
        topicConnection.start();
        TopicSession topicSession = topicConnection.createTopicSession(true, Session.AUTO_ACKNOWLEDGE);
        Topic topic = new ActiveMQTopic("180-Topic");
        TopicSubscriber subscriber = topicSession.createSubscriber(topic);
        while (true) {
            Message msg = subscriber.receive();
            TextMessage textMessage = (TextMessage) msg;
            if (textMessage != null) {
                System.out.println("1 号"+textMessage.getText());
            }else{
                break;
            }
        }
    }

ActiveMQ集成Spring

//依赖
<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>
    
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jms</artifactId>
      <version>5.1.1.RELEASE</version>
    </dependency>

// 配置
<context:component-scan base-package="com.baizhi.service"></context:component-scan>

    <!-- 1.activeMqFactory -->
    <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="password" value="admin"/>
        <property name="userName" value="admin"/>
        <property name="brokerURL" value="tcp://192.168.150.142:61616"/>
    </bean>

    <!-- P2p -->
    <bean id="activeMQQueue" class="org.apache.activemq.command.ActiveMQQueue">
        <property name="physicalName" value="Spring-150-Queue"/>
    </bean>

    <!-- Jms -->
    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="connectionFactory"/>
        <property name="defaultDestination" ref="activeMQQueue"/>
        <property name="pubSubDomain" value="false"/>
    </bean>

<!--
        将自定义的 监听器交由spring管理
    -->
    <bean id="consumerMessageListener" class="com.baizhi.conf.ConsumerMessageListener"></bean>

    <!--
        配置监听器容器    在监听器容器中可以配置多个监听器
    -->
    <bean id="defaultMessageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="connectionFactory"/>
        <property name="destination" ref="activeMQQueue"/>
        <property name="pubSubDomain" value="false"/>
        <property name="messageListener" ref="consumerMessageListener"/>
    </bean>

//代码
product
	@Autowired
    private JmsTemplate jmsTemplate;

    public void sendMsg(String msg) {
        jmsTemplate.send(new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
                TextMessage textMessage = session.createTextMessage(msg);
                return textMessage;
            }
        });
    }

consumer
	@Autowired
    private JmsTemplate jmsTemplate;

    public void consume() {
        TextMessage receive = (TextMessage) jmsTemplate.receive();
        System.out.println(receive);
    }

// 自定义监听器
public class ConsumerListenner implements MessageListener {
    public void onMessage(Message message) {
        TextMessage msg = (TextMessage) message;
        try {
            System.out.println("被监听了"+msg.getText());
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

Active MQ 集成 SpringBoot

//依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-activemq</artifactId>    </dependency>

//配置文件
server:
  port: 9090
spring:
  activemq:
    broker-url: tcp://192.168.150.142:61616
    user: admin
    password: admin

//代码
controller
@Component
public class ProductSend {
    @Autowired
    private JmsTemplate jmsTemplate;

    public void sendMsg(String msg){
        Destination destination = new ActiveMQQueue("Springboot-150-Queue");
        jmsTemplate.convertAndSend(destination,msg);
    }
}

@Component
public class ProductSend {
    @Autowired
    private JmsTemplate jmsTemplate;

    public void sendMsg(String msg){
        Destination destination = new ActiveMQQueue("Springboot-150-Queue");
        jmsTemplate.convertAndSend(destination,msg);
    }
}

@Component
public class ConsumerListenner {
    @JmsListener(destination = "Springboot-150-Queue")
    public void consum(Message message){
        TextMessage textMessage = (TextMessage) message;
        try {
            System.out.println("springboot被监听"+textMessage.getText());
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值