activeMq学习应用

一、下载

ActiveMQ 5.15.0下载地址

二、安装

解压apache-activemq-5.15.0-bin.zip

D:\apache-activemq-5.15.7-bin\apache-activemq-5.15.7\bin\win64

双击activemq.bat执行  开始自动安装启动

访问地址mq客户端页面     http://localhost:8161/admin/topics.jsp  登录账户密码默认admin/admin

三、使用

jar包  activemq-all-5.4.3.jar    activemq-pool-5.4.3.jar

3.1.1ActiviteMQ消息有3种形式

  1. 点对点方式(point-to-point)

点对点的消息发送方式主要建立在 Message Queue,Sender,reciever上,Message Queue 存贮消息,Sneder 发送消息,receive接收消息.具体点就是Sender Client发送Message Queue ,而 receiver Cliernt从Queue中接收消息和"发送消息已接受"到Quere,确认消息接收。消息发送客户端与接收客户端没有时间上的依赖,发送客户端可以在任何时刻发送信息到Queue,而不需要知道接收客户端是不是在运行

  1. 发布/订阅 方式(publish/subscriber Messaging)

发布/订阅方式用于多接收客户端的方式.作为发布订阅的方式,可能存在多个接收客户端,并且接收端客户端与发送客户端存在时间上的依赖。一个接收端只能接收他创建以后发送客户端发送的信息。作为subscriber ,在接收消息时有两种方法,destination的receive方法,和实现message listener 接口的onMessage 方法。


3.1.2ActiviteMQ接收和发送消息基本流程

发送消息的基本步骤:

(1)、创建连接使用的工厂类JMS ConnectionFactory

(2)、使用管理对象JMS ConnectionFactory建立连接Connection,并启动

(3)、使用连接Connection 建立会话Session

(4)、使用会话Session和管理对象Destination创建消息生产者MessageSender

(5)、使用消息生产者MessageSender发送消息

消息接收者从JMS接受消息的步骤

(1)、创建连接使用的工厂类JMS ConnectionFactory

(2)、使用管理对象JMS ConnectionFactory建立连接Connection,并启动

(3)、使用连接Connection 建立会话Session

(4)、使用会话Session和管理对象Destination创建消息接收者MessageReceiver

(5)、使用消息接收者MessageReceiver接受消息,需要用setMessageListener将MessageListener接口绑定到MessageReceiver消息接收者必须实现了MessageListener接口,需要定义onMessage事件方法。

四、java代码

Spring集成

新建activemq_config.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">
<!-- <value>tcp://192.168.0.140:61616</value> -->

<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://192.168.0.127:61616</value>
</property>
</bean>
</property>
<property name="maxConnections" value="100"></property>
</bean>

<!--测试Queue,队列的名字是spring-queue-->
<bean id="destinationQueue" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg name="name" value="spring-queue"/>
</bean>

<!--测试Topic-->
<bean id="destinationTopic" class="org.apache.activemq.command.ActiveMQTopic">
<constructor-arg index="0" value="cms.vss.pic.topic2"/>
</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="jmsContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="cachingConnectionFactory"/>
<property name="destination" ref="destinationTopic"/>
<property name="messageListener" ref="topicListener"/>
</bean>

<!-- 消息监听器 -->
<bean id="topicListener" class="com.zlkj.activemq.listener.TopicListener">
</bean>
</beans>

发送消息

package com.zlkj.wl.service;


import javax.annotation.Resource;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.ObjectMessage;
import javax.jms.Session;

import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Service;

import com.zlkj.wl.bean.ActiveBean;


@Service("senderService")
public class AMQSenderServiceImpl implements AmqSenderService {


@Resource(name = "jmsTemplate")
private JmsTemplate jmsTemplate;

//目的地队列的明证,我们要向这个队列发送消息
@Resource(name = "destinationTopic")
private Destination destination;

//向特定的队列发送消息
@Override
public void sendMsg(final ActiveBean mqParamDto) {
//final String msg = JsonTools.ojbToJson(mqParamDto, false);
// final String msg =mqParamDto;
try {
jmsTemplate.send(destination, new MessageCreator() {
@Override
public ObjectMessage createMessage(Session session) throws JMSException {
return session.createObjectMessage(mqParamDto);
//return session.createTextMessage(msg);
}
});

} catch (Exception ex) {
}

}
}

接收消息则通过xml中配置监听可以接收到消息

创建监听类

package com.zlkj.activemq.listener;

import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

public class TopicListener implements MessageListener {

@Override
public void onMessage(Message msg) {
try {
Destination destination = msg.getJMSDestination();
String topic = destination.toString();
if(topic.equals("topic://INOUT")) {
System.out.println("1");
TextMessage txtMsg = (TextMessage) msg;
String message = txtMsg.getText();
//实际项目中拿到String类型的message(通常是JSON字符串)之后,
//会进行反序列化成对象,做进一步的处理
System.out.println("receive txt msg===" + message);
} else if (topic.equals("topic://ENROLL")) {
System.out.println("2");
TextMessage txtMsg = (TextMessage) msg;
String message = txtMsg.getText();
//实际项目中拿到String类型的message(通常是JSON字符串)之后,
//会进行反序列化成对象,做进一步的处理
System.out.println("receive txt msg===" + message);
} else if (topic.equals("topic://ACTION")) {
System.out.println("3");
TextMessage txtMsg = (TextMessage) msg;
String message = txtMsg.getText();
//实际项目中拿到String类型的message(通常是JSON字符串)之后,
//会进行反序列化成对象,做进一步的处理
System.out.println("receive txt msg===" + message);
}

} catch (JMSException e) {
throw new RuntimeException(e);
}
}
}

接收消息监听不打出时  注意constructor-arg的值(标红)和手动发送消息的session.createTopic("ENROLL")值应相同

不集成spring

发送消息

package com.zlkj.test;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.ObjectMessage;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

import com.zlkj.pub.toolutil.JsonTools;
import com.zlkj.wl.bean.ActiveBean;

public class NoPersistenceActiveSender {

private static final int SENDNUM = 10;

public static void sendmes( ActiveBean record) {
//连接工厂
ConnectionFactory connectionFactory;
//连接
Connection connection = null;
//会话 接受或者发送消息的线程
Session session;
//消息的目的地
Destination destination;
//消息生产者
MessageProducer messageProducer;
//实例化连接工厂(连接到ActiveMQ服务器)
connectionFactory = new ActiveMQConnectionFactory(null, null, "tcp://192.168.0.127:61616");

try {
//通过连接工厂获取连接
connection = connectionFactory.createConnection();
//启动连接
connection.start();
//创建session
session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
//创建一个名称为MyTopic的消息队列(生产者生成的消息放在哪)
destination = session.createTopic("ENROLL");
//创建消息生产者
messageProducer = session.createProducer(destination);
//发送消息
sendMessage(session, messageProducer,record);

session.commit();

} catch (Exception e) {
e.printStackTrace();
} finally {
if (connection != null) {
try {
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
/**
* 发送消息
*
* @param session
* @param messageProducer 消息生产者
* @throws Exception
*/
public static void sendMessage(Session session, MessageProducer messageProducer,ActiveBean record) throws Exception {
ObjectMessage message = session.createObjectMessage(record);
messageProducer.send(message);
// }

}
}

接收消息 

package com.zlkj.test;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

public class NoPersistenceReceiver {


public static void main(String[] args) {
ConnectionFactory connectionFactory;//连接工厂
Connection connection = null;//连接

Session session;//会话 接受或者发送消息的线程
Destination destination;//消息的目的地

MessageConsumer messageConsumer;//消息的消费者

//实例化连接工厂(连接到ActiveMQ服务器)
connectionFactory = new ActiveMQConnectionFactory(null, null, "tcp://192.168.0.127:61616");

try {
//通过连接工厂获取连接
connection = connectionFactory.createConnection();
//启动连接
connection.start();
//创建session
session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
//生产者将消息发送到MyTopic,所以消费者要到MyTopic去取
destination = session.createTopic("ENROLL1a");
//destination = session.createTopic("MyTopic");
//创建消息消费者
messageConsumer = session.createConsumer(destination);

Message message = messageConsumer.receive();

while (message != null) {
TextMessage txtMsg = (TextMessage) message;
System.out.println("收到消息:" + txtMsg.getText());
message = messageConsumer.receive();
}
} catch (JMSException e) {
e.printStackTrace();
}

}
}

接收消息的时候一定执行main方法  用while死循环一直轮训手动接收发送的消息 

学习activeMq源路径网址    https://www.jianshu.com/p/8caa6d66b10d 

 

posted on 2018-11-14 18:25  cwone  阅读(155)  评论(0编辑  收藏  举报