配置文件太麻烦。2019-4-14项目实测有效
引入依赖pom.xml
<!-- https://mvnrepository.com/artifact/org.apache.activemq/activemq-all -->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.15.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
队列消息提供者:基础配置文件
<!-- 配置能够产生connection的connectionfactory,由JMS对应的服务厂商提供 -->
<bean id="tagertConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<constructor-arg name="brokerURL" value="tcp://localhost:61616"/>
</bean>
<!-- 配置spring管理真正connectionfactory的connectionfactory,相当于spring对connectionfactory的一层封装 -->
<bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">
<property name="targetConnectionFactory" ref="tagertConnectionFactory"/>
</bean>
<!-- 配置生产者 -->
<!-- Spring使用JMS工具类,可以用来发送和接收消息 -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<!-- 这里是配置的spring用来管理connectionfactory的connectionfactory -->
<property name="connectionFactory" ref="connectionFactory"/>
</bean>
<!-- 消息发送工具类 -->
<bean id="messageProducer" class="com.realfake.model.utils.activemq.MessageProducer"/>
消息提供工具类,destination是必须的,用来让消息被正确接受,其他参数可以自定义
public class MessageProducer {
@Resource
private JmsTemplate jmsTemplate;
public void sendActiveMessage(final String producerName, String destination, final String text) {
jmsTemplate.send(destination, new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
System.out.println(producerName + "发送一条队列消息:" + text);
return session.createTextMessage(text);
}
});
}
}
队列消费者:基础配置文件,由于我的activemq是独立服务,需要指定扫描被标注的包
<!-- 一定要扫描,不然找不到注解的类 -->
<context:component-scan base-package="com.realfake.*" />
<!-- 监听注解支持 -->
<jms:annotation-driven/>
<!-- 配置能够产生connection的connectionfactory,由JMS对应的服务厂商提供 -->
<bean id="tagertConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<constructor-arg name="brokerURL" value="tcp://localhost:61616"/>
</bean>
<bean id="jmsConnectionFactoryExtend" class="org.springframework.jms.connection.CachingConnectionFactory">
<constructor-arg ref="tagertConnectionFactory"/>
<property name="sessionCacheSize" value="100"/>
</bean>
<!-- 通过注解配置此监听容器,省去配置文件的编写 -->
<bean id="jmsListenerContainerFactory" class="org.springframework.jms.config.DefaultJmsListenerContainerFactory">
<property name="connectionFactory" ref="jmsConnectionFactoryExtend"/>
</bean>
队列消费类:关键参数:destination队列标识,其他变量和参数为业务需要
@Component
@EnableJms
public class LogBiz {
@Autowired
private LogMapper logMapper;
//当收到消息后,自动调用该方法,spring配置默认监听器,负责接收消息
//containerFactory:配置文件中的监听容器、destination:消息队列名称
@JmsListener(containerFactory="jmsListenerContainerFactory",destination = DestinationName.ADD_LOG)
@Transactional
public void addLog(Message message) {
try {
System.out.println("添加日志信息 收到一条消息:"+((TextMessage)message).getText());
// 获取封装的信息
Log log = JSON.parseObject(((TextMessage)message).getText(),Log.class);
// 随机生成log_id
log.setLogId(log.getDate()+ RandomStringUtils.randomAlphabetic(4));
// 更新数据库
logMapper.insertSelective(log);
} catch (JMSException e) {
e.printStackTrace();
}
}
}
只看添加日志消息:通过注解方式是成功的