本次activeMQ搭建是订阅者模式。
生产者使用单元测试生产消息,消费者通过监听器接收消息。
消费者启动之前,生产者生产的数据不会拿出来。
只有在消费者启动之后,生产者生产的消息才能获取到。
要进入的jar包,创造者和消费者都要引
<dependencies>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.14.5</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.1.3.RELEASE</version>
</dependency>
<!--
<context:component-scan base-package="com.llk" />
-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.3.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<!-- spring整合测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.1.3.RELEASE</version>
<scope>test</scope>
</dependency>
<!--
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.5.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
生产者的配置mq配置文件
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!--配置连接工厂-->
<bean id="activeMQConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="userName" value="admin"/>
<property name="password" value="admin"/>
<property name="brokerURL" value="tcp://192.168.200.128:61616"/>
</bean>
<!--配置连接池-->
<bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory">
<property name="connectionFactory" ref="activeMQConnectionFactory"/>
<property name="maxConnections" value="7"/>
</bean>
<!--把连接池换成apache的-->
<bean id="singleConnectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">
<property name="targetConnectionFactory" ref="pooledConnectionFactory"/>
</bean>
<!--发送消息的配置-->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="singleConnectionFactory"/>
<property name="pubSubDomain" value="true"/>
<!--<property name="defaultDestinationName" value="heihei"/>--><!--设置默认的主题-->
</bean>
<context:component-scan base-package="com.llk" />
</beans>
生产者生产消息的方法
这里是使用单元测试的方式发送消息的
package com.llk.message;
import org.apache.activemq.command.ActiveMQTempTopic;
import org.apache.activemq.command.ActiveMQTopic;
import org.apache.activemq.filter.DefaultDestinationMapEntry;
import org.apache.camel.component.jms.EndpointMessageListener;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Controller;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.jms.*;
@RunWith(value = SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:mq.xml")
public class SendMesaage {
@Autowired
private JmsTemplate jmstemplate;
@Test
public void send(){
//要插入的主题
String topic="topic1";
//要插入的内容
final String val="value1Test";
/*
翻译:MessageCreator消息创造者
发送消息是要传入这个对象,这个是存储信息的类
因为他是一个接口,所以要创建一个内部类
*/
MessageCreator message = new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
TextMessage textMessage = session.createTextMessage(val);
return textMessage;
}
};
//设置要发送的主题,也可以在配置文件注入
jmstemplate.setDefaultDestinationName(topic);
//设置要发送的消息
jmstemplate.send(message);
System.out.println("结束");
}
}
消费者的配置文件
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!--配置连接工厂-->
<bean id="activeMQConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="userName" value="admin"/>
<property name="password" value="admin"/>
<property name="brokerURL" value="tcp://192.168.200.128:61616"/>
</bean>
<!--配置连接池-->
<bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory">
<property name="connectionFactory" ref="activeMQConnectionFactory"/>
<property name="maxConnections" value="7"/>
</bean>
<!--把连接池换成apache的-->
<bean id="singleConnectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">
<property name="targetConnectionFactory" ref="pooledConnectionFactory"/>
</bean>
<!--定义消息处理类-->
<bean id="messageProcession" class="com.llk.MessageProcession"></bean>
<!--配置消息监听器-->
<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="singleConnectionFactory"/>
<property name="destinationName" value="topic1"/>
<property name="messageListener" ref="messageProcession"/>
<property name="pubSubDomain" value="true"/>
</bean>
<context:component-scan base-package="com.llk" />
</beans>
消费者的接受消息方法
package com.llk;
import org.apache.activemq.command.ActiveMQTextMessage;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
public class MessageProcession implements MessageListener {
static {
System.out.println("执行了吗?");
}
@Override
public void onMessage(Message message) {
ActiveMQTextMessage atm = (ActiveMQTextMessage)message;
try {
String text = atm.getText();
System.out.println(text);
} catch (JMSException e) {
System.out.println("出错了");
}
}
}
最后别忘了在web.xml加载配置文件
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name >contextConfigLocation </param-name >
<param-value >classpath:mq.xml </param-value >
</context-param>