消息队列——ActiceMQ

Posted 晨M风

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了消息队列——ActiceMQ相关的知识,希望对你有一定的参考价值。

1.下载apache-activemq-5.xx.x,\bin\win64目录下运行activemq.bat。之后可进入管理员界面http://localhost:8161/admin,账号密码均为admin

2.原生MQ

  a.导入依赖

    <dependency>
      <groupId>org.apache.activemq</groupId>
      <artifactId>activemq-all</artifactId>
      <version>5.9.0</version>
    </dependency>

  b.建生产者类

public class TestConsumer {

    public static void main(String[] args) {
        try {
            // 第一步:创建一个ConnectionFactory对象。  
             ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");  
             // 第二步:从ConnectionFactory对象中获得一个Connection对象。  
             Connection connection = connectionFactory.createConnection();  
             // 第三步:开启连接。调用Connection对象的start方法。  
             connection.start();  
             // 第四步:使用Connection对象创建一个Session对象。  
             Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);  
             // 第五步:使用Session对象创建一个Destination对象。和发送端保持一致queue,并且队列的名称一致。  
             Queue queue = session.createQueue("test-queue");  
             // 第六步:使用Session对象创建一个Consumer对象。  
             MessageConsumer consumer = session.createConsumer(queue);  
             // 第七步:接收消息。  
             consumer.setMessageListener(new MessageListener() {
                   
                  @Override  
                  public void onMessage(Message message) {  
                       try {  
                           TextMessage textMessage = (TextMessage) message;  
                           String text = null;  
                           //取消息的内容  
                           text = textMessage.getText();  
                           // 第八步:打印消息。  
                           System.out.println(text);  
                       } catch (Exception e) {  
                           e.printStackTrace();  
                       }  
                  }  
             });  
             //等待键盘输入  
             System.in.read();  
             // 第九步:关闭资源  
             consumer.close();  
             session.close();  
             connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

  c.建消费者类

public class TestProducer {

    public static void main(String[] args) {
        try {
            // 第一步:创建ConnectionFactory对象,需要指定服务端ip及端口号。  
            //brokerURL服务器的ip及端口号  
            ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");  
            // 第二步:使用ConnectionFactory对象创建一个Connection对象。  
            Connection connection = connectionFactory.createConnection();  
            // 第三步:开启连接,调用Connection对象的start方法。  
            connection.start();  
            // 第四步:使用Connection对象创建一个Session对象。  
            //第一个参数:是否开启事务。true:开启事务,第二个参数忽略。  
            //第二个参数:当第一个参数为false时,才有意义。消息的应答模式。1、自动应答2、手动应答。一般是自动应答。  
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);  
            // 第五步:使用Session对象创建一个Destination对象(topic、queue),此处创建一个Queue对象。  
            //参数:队列的名称。  
            Queue queue = session.createQueue("test-queue");  
            // 第六步:使用Session对象创建一个Producer对象。  
            MessageProducer producer = session.createProducer(queue);  
            // 第七步:创建一个Message对象,创建一个TextMessage对象。  
            /*TextMessage message = new ActiveMQTextMessage(); 
            message.setText("hello activeMq,this is my first test.");*/  
            TextMessage textMessage = session.createTextMessage("hello activeMq,this is my first test.");  
            // 第八步:使用Producer对象发送消息。  
            producer.send(textMessage);  
            // 第九步:关闭资源。  
            producer.close();  
            session.close();  
            connection.close();  
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

 

3.结合Spring

  a.引入依赖(activemq 依赖包版本不能太高,不然包内会有Spring的包,造成冲突)

    <!-- ActiveMQ -->
    <dependency>
      <groupId>org.apache.activemq</groupId>
      <artifactId>activemq-all</artifactId>
      <version>5.9.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-pool</artifactId>
        <version>5.9.0</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jms</artifactId>
        <version>4.0.0.RELEASE</version>
    </dependency>

 

  b.新建spring-amq.xml 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

    <context:component-scan base-package="com.winner.spring"/>

    <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory"
          destroy-method="stop">
        <property name="connectionFactory">
            <bean class="org.apache.activemq.ActiveMQConnectionFactory">
                <property name="brokerURL">
                    <value>tcp://localhost:61616</value>
                </property>
            </bean>
        </property>
        <property name="maxConnections" value="100"></property>
    </bean>

    <!--使用缓存可以提升效率-->
    <bean id="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
        <property name="targetConnectionFactory" ref="jmsFactory"/>
        <property name="sessionCacheSize" value="1"/>
    </bean>

    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="cachingConnectionFactory"/>
        <property name="messageConverter">
            <bean class="org.springframework.jms.support.converter.SimpleMessageConverter"/>
        </property>
    </bean>

    <bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue">  
        <constructor-arg>  
            <value>NTF_MOCK_INPUT</value>  
        </constructor-arg>  
    </bean>  
    <!--这个是回复队列,点对点的 -->  
    <bean id="responseQueue" class="org.apache.activemq.command.ActiveMQQueue">  
        <constructor-arg>  
            <value>NTF_MOCK_OUTPUT</value>  
        </constructor-arg>  
    </bean> 

</beans>

  c.新建 生产者 和 消费者

@Component
public class MqProducer {
    
    @Resource  
    private JmsTemplate jmsTemplate;
    
    public void sendMessage(Destination receivedestination, final String message) {  
        
        System.out.println("================生产者创建了一条消息==============");  
        jmsTemplate.send(receivedestination, new MessageCreator() {
            @Override  
            public Message createMessage(Session session) throws JMSException {  
                return session.createTextMessage("hello acticeMQ:"+message);  
            }  
        });  
    } 
}
@Component
public class MqConsumer {
    @Resource  
    private JmsTemplate jmsTemplate;
    
    public String receiveMessage(Destination destination, Destination replyDestination) {  
        /** 
         * 接收消息队列中的消息 
         */  
        Message message = jmsTemplate.receive(destination);  
        try {  
            /** 
             * 此处为了更好的容错性,可以使用instanceof来判断下消息类型 
             */  
            if(message instanceof TextMessage){  
                String receiveMessage =  ((TextMessage) message).getText();  
                System.out.println("收到生产者的消息:"+receiveMessage);  
                /** 
                 * 收到消息之后,将回复报文放到回复队列里面去 
                 */  
                jmsTemplate.send(replyDestination, new MessageCreator() {
                    @Override  
                    public Message createMessage(Session session) throws JMSException {  
                        return session.createTextMessage("消费者已经收到生产者的消息了,这是一条确认报文!");  
                    }  
                });  
              return receiveMessage;  
            }  
        } catch (JMSException e) {  
            e.printStackTrace();  
        }  
        return "";  
    }  
}

  d.测试

@RunWith(SpringJUnit4ClassRunner.class)  
@ContextConfiguration(locations = {"classpath:spring-amq.xml", "classpath:spring-mybatis.xml"})
public class TestProducer {
    
    @Resource 
    private MqProducer mqProducer;  
      
    @Resource 
    private Destination queueDestination;  
      
    @Test
    public void producerTest(){  
        mqProducer.sendMessage(queueDestination, "my name is zwj!");  
    }  
}
@RunWith(SpringJUnit4ClassRunner.class)  
@ContextConfiguration(locations = {"classpath:spring-amq.xml", "classpath:spring-mybatis.xml"})
public class TestConsumer {
    
    @Resource 
    private MqConsumer mqConsumer;  
      
    @Resource 
    private Destination queueDestination;  
      
    @Resource 
    private Destination responseQueue;  
      
    @Test  
    public void producerTest(){  
        String result = mqConsumer.receiveMessage(queueDestination, responseQueue);  
        System.out.println(result);  
    }  
}

 

注意:务必打开activemq.bat

以上是关于消息队列——ActiceMQ的主要内容,如果未能解决你的问题,请参考以下文章

rabbitmq - 不会获取队列中的所有消息

zookeeper&acticemq&redis安装

监控ActiceMQ_Url和监控游戏用户金币获得

Android UI 线程消息队列调度顺序

# Java 常用代码片段

# Java 常用代码片段