ActiveMQ消息队列服务的安装与使用:
1.本次的ActiveMQ服务端安装在Linux系统中:
1.1:服务的安装:下载Linux版本的压缩包,进入bin目录 执行命令activemq start 启动
查看服务是否安装好:
进入管理后台:
http://192.168.2.128:8161/admin
用户名:admin
密码:admin
进入即表明安装成功!
1.2:服务的客户端的使用:
1.2.1:添加客户端的jar包,本次测试采用queue和topic方式测试消息的发送者和消息的接收者
public class TestActiveMQ {
@Test
public void testQueueProducer() throws JMSException {
/*
* 发送者步骤:
* 1.创建ConnectionFactory对象,需要指定服务端ip即端口号
* 2.使用ConnectionFactory对象创建一个Connection对象
* 3.开启连接,使用connection对象调用start()方法
* 4.使用connection对象创建一个session对象
* 5.使用session对象创建一个destination对象(即queue或者topic对象),此处创建一个queue对象
* 6.使用session对象创建一个producer对象.
* 7.创建一个message对象,创建一个textmessage对象(可以使用session.createTextMessage来获取,也可以new一个消息对象)
* 8.使用producer对象发送消息
* 9关闭资源
*/
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.2.128:61616");
Connection connection = connectionFactory.createConnection();
connection.start();
// 参数说明:第一个参数表示是否要开启事务,第二个参数表示消息的应答模式:自动应答,手动应答
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 参数说明:消息队列的名称,消费者通过该名称获取消息
Queue queue = session.createQueue("test-queue");
// 参数说明:为创建的Queue对象
MessageProducer producer = session.createProducer(queue);
TextMessage textMessage = session.createTextMessage("完美,测试成功 ");
producer.send(textMessage);
producer.close();
session.close();
connection.close();
}
@Test
public void testQueueConsumer() throws Exception{
/*接收者实现步骤:
* 1.创建一个connectionfactory对象,
* 2.根据connectionfactory对象获取一个connection对象
* 3.开启连接,使用connection对象开启连接
* 4.使用connection对象创建一个session对象
* 5.使用session对象创建一个destination对象,由于该方法为接收者,参数说明:需要从哪个消息队列中取值,(即消息的名称)
* 6.使用session对象创建一个consumer对象
* 7.接收消息
* 8.打印消息
* 9.关闭资源
* */
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.2.128:61616");
Connection connection = connectionFactory.createConnection();
connection.start();
// 参数说明:第一个参数表示是否要开启事务,第二个参数表示消息的应答模式:自动应答,手动应答
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//参数说明:表示需要从哪个消息队列中去消息[消息队列的名称]
Queue queue = session.createQueue("test-queue");
MessageConsumer consumer = session.createConsumer(queue);
//接收消息:即设置消息监听器,有消息进入此匿名内部类
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
TextMessage textMessage = (TextMessage) message;
try {
String text = textMessage.getText();
System.out.println("接收到的消息为>>>>>>>"+text);
} catch (JMSException e) {
e.printStackTrace();
}
}
});
System.in.read();
consumer.close();
session.close();
connection.close();
}
@Test
public void testTopicProducer() throws Exception{
/*发送者步骤:
* 1.创建一个connectionfactory对象
* 2.根据connectionfactory对象获取connection对象
* 3.开启连接,使用connection对象中的start()方法
* 4.使用connection对象创建一个session对象
* 5.使用session对象创建一个destination对象
* 6.使用session对象创建一个producer对象
* 7.创建一个textmessage对象,可以使用session创建,也可以new一个对象出来
* 8.使用producer对象发送消息
* 9.关闭资源
* */
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.2.128:61616");
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Topic topic = session.createTopic("test-topic");
MessageProducer producer = session.createProducer(topic);
TextMessage textMessage = session.createTextMessage("测试~~~~~~~~~");
producer.send(textMessage);
producer.close();
session.close();
connection.close();
}
@Test
public void testTopicConsumer() throws Exception{
/*接收者实现步骤:
* 1.创建一个connectionfactory对象,
* 2.根据connectionfactory对象获取一个connection对象
* 3.开启连接,使用connection对象开启连接
* 4.使用connection对象创建一个session对象
* 5.使用session对象创建一个destination对象,由于该方法为接收者,参数说明:需要从哪个消息队列中取值,(即消息的名称)
* 6.使用session对象创建一个consumer对象
* 7.接收消息
* 8.打印消息
* 9.关闭资源
* */
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.2.128:61616");
Connection connection = connectionFactory.createConnection();
connection.start();
// 参数说明:第一个参数表示是否要开启事务,第二个参数表示消息的应答模式:自动应答,手动应答
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//参数说明:表示需要从哪个消息队列中去消息[消息队列的名称]
Topic topic = session.createTopic("test-topic");
MessageConsumer consumer = session.createConsumer(topic);
//接收消息:即设置消息监听器,有消息进入此匿名内部类
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
TextMessage textMessage = (TextMessage) message;
try {
String text = textMessage.getText();
System.out.println("接收到的消息为>>>>>>>"+text);
} catch (JMSException e) {
e.printStackTrace();
}
}
});
System.in.read();
consumer.close();
session.close();
connection.close();
}
}
1.2.2:使用spring整合activeMQ:需要导入整合jar,applicationContext-activemq.xml配置文件的配置
整合的依赖jar:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
配置文件:
<bean id="targetConnection" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://192.168.25.130:61616"></property>
</bean>
<!-- 通用的connectionfacotry 指定真正使用的连接工厂 -->
<bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">
<property name="targetConnectionFactory" ref="targetConnection"></property>
</bean>
<!-- 接收和发送消息时使用的类 -->
<bean class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory"></property>
</bean>
<bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg name="name" value="item-change-queue"></constructor-arg>
</bean>
<!-- <bean id="topicDestination" class="org.apache.activemq.command.ActiveMQTopic">
<constructor-arg name="name" value="item-change-topic"></constructor-arg>
</bean> -->
<bean id="myMessageListener" class="com.itheima.activemq.spring.MyMessageListener"></bean>
<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory"></property>
<property name="destination" ref="topicDestination"></property>
<property name="messageListener" ref="myMessageListener"></property>
</bean>
*消息的发送者
public void testJMSProducer() throws Exception{
/*实现步骤:首先需要导入相应的整合jar,然后添加相应的配置文件,最后代码实现
* 1.在配置文件中配置ActiveMQConnectionFactory对象,targetConnectionFactory
* 2.配置spring的SingleConnectionFactory对象,并且将ActiveMQConnectionFactory对象注入connectionFactory
* 3.配置用于发送消息的对象JmsTemplate,并将spring的连接工厂注入
* 4.配置Destination对象,有ActiveMQQueue和ActiveTopic之分.需要配置构造器的name属性,为自定义的一个消息队列的名称
* 5.配置自定义的消息监听器,和系统的消息监听器
* 6.系统监听器需要注入的属性有:connectionFactory,destination,和messageListener
*
* 代码实现:
* 1.获取JmsTemplate对象
* 2.获取destination对象
* 3.使用JmsTemplate对象发送消息,参数说明:代码部分体现
* 4.线程sleep:为了保证该事件必须完成之后才发送消息,以免造成空指针异常
* */
JmsTemplate jmsTemplate = applicationContext.getBean(JmsTemplate.class);
Destination destination = applicationContext.getBean(Destination.class);
//参数说明:第一个参数为目标对象即queue或者topic,第二个参数为消息创建对象,创建匿名内部类即可
jmsTemplate.send(destination, new MessageCreator() {
//参数说明:该session对象用于创建消息对象
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage("lalala~~~~~~~~");
}
});
Thread.sleep(1000);
}
*消息的接收者:自定义一个消息监听器,配置在系统消息监听器即可
public void onMessage(Message message) {
try {
TextMessage textMessage = (TextMessage) message;
System.out.println("收到的消息为>>>>>>>>"+textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}