- mq与spring的集成
1.1 导入pom坐标
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>${activemq.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>${spring.version}</version>
</dependency>
需要导入Active-mq和spring-jms两个
2.2.配置applicatonContext-mq.xml文件,并在applicationContext.xml中引入该文件
<import resource="applicationContext-mq.xml"/>
在applicatonContext-mq.xml,需配置mq的连接和连接工厂,如果是生产者,需定义生产者的模板,具体设置如下:
<bean id="amqConnectionFaction" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://localhost:61616"></property>
<property name="userName" value="admin"></property>
<property name="password" value="admin"></property>
</bean>
<!-- Spring Caching连接工厂 -->
<!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->
<bean id="mqconnectionFactory"
class="org.springframework.jms.connection.CachingConnectionFactory">
<!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->
<property name="targetConnectionFactory" ref="amqConnectionFaction"></property>
<!-- 同上,同理 -->
<!-- <constructor-arg ref="amqConnectionFactory" /> -->
<!-- Session缓存数量 -->
<property name="sessionCacheSize" value="100" />
</bean>
<bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate">
<!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->
<constructor-arg ref="mqconnectionFactory" />
<!-- 非pub/sub模型(发布/订阅),即队列模式 -->
<property name="pubSubDomain" value="false" />
</bean>
对于消费者中applicationContext.xml文件中除了要定义连接和连接工厂,还要设置监听,具体配置如下:
<!-- 扫描 @Server @Controller @Repository -->
<context:component-scan base-package="包名"/>
<bean id="amqConnectionFaction" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://localhost:61616"></property>
<property name="userName" value="admin"></property>
<property name="password" value="admin"></property>
</bean>
<!-- Spring Caching连接工厂 -->
<!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->
<bean id="mqconnectionFactory"
class="org.springframework.jms.connection.CachingConnectionFactory">
<!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->
<property name="targetConnectionFactory" ref="amqConnectionFaction"></property>
<!-- 同上,同理 -->
<!-- <constructor-arg ref="amqConnectionFactory" /> -->
<!-- Session缓存数量 -->
<property name="sessionCacheSize" value="100" />
</bean>
<jms:listener-container destination-type="queue" container-type="default" connection-factory="connectionFactory" acknowledge="auto">
<!--bos_sms为生产者中发送的消息名 sms为mq消费者SmsConsumer中的@Service("smsConsumer")-->
<jms:listener destination="bos_sms" ref="smsConsumer"/>
</jms:listener-container>
2框架的使用
- 在生产者中,Service中注入jmsTemplate
@Autowired
@Qualifier("jmsQueueTemplate")
private JmsTemplate jmsTemplate;
然后程序可以调用jmsTemplate的send方法
jmsTemplate.send("bos_sms", new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
MapMessage mapMessage = session.createMapMessage();
mapMessage.setString("telephone", model.getTelephone());
mapMessage.setString("code", code);
return mapMessage;
}
});
对于消费者一是配置好applicationContext.xml文件,新建一个Consumer类实现MessageListener,类名需加注解@Service(“smsConsumer”)
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageListener;
import org.springframework.stereotype.Service;
@Service("smsConsumer")
public class SmsConsumer implements MessageListener {
@Override
public void onMessage(Message message) {
MapMessage mapMessage=(MapMessage) message;
try {
String telephone = mapMessage.getString("telephone");
String code=mapMessage.getString("code");
// SendSmsResponse smsResponse = SmsUtil.sendSmsmsg(telephone, code);
// if("OK".equals(smsResponse.getCode())){
System.out.println("短信发送成功!");
// }else{
// System.out.println("短信发送失败");
// }
} catch (Exception e) {
e.printStackTrace();
}
}
}