消息队列——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