activeMQ
queque队列:
队列模式
生成者生成一条消息,当前没有消费者,会把这条消息保存,一旦有了消费者,就可以直接消费消息.
生产者产生了一条消息,当前有多个消费者,只有一个消费者可以获得到消息,有一个原则,先来先得.0
topic话题:
发布订阅模式
生产者生产了一条消息,如果当前没有消费者,这条消息就会丢失.
生产者生产了一条消息,当前所有监听消息的消费者,都可以或得到消息.
案例发送短信:
发送短信之前的步骤:
*将手机号存入客户对象
*生成随机的短信验证码
*将短信验证码保存到session中
*编辑短信内容
*调用sms服务器发送短息
//调用sms服务器发送短息
String result = SmsUtils.sendSmsByHTTP(model.getTelephone(), text);
//String result = "000/xxx";
//判断短信是否发送成功
if (result.startsWith("000")) {
//成功
return NONE;
}else {
//失败
throw new RuntimeException("短信发送失败,信息码:"+result);
}
Spring整合MQ之后将不在调用sms服务器发送短信, 而是调用MQ服务来发送一条消息,将之前的调用sms服务放到了消费者执行:
//调用MQ服务,发送一条消息
jmsTemplate.send("",new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
// TODO Auto-generated method stub
MapMessage mapMessage = session.createMapMessage();
//获得用户电话
mapMessage.setString("telephone", model.getTelephone());
//获得要发送的短信内容
mapMessage.setString("text", text);
return mapMessage;
}
});
return NONE;
消费者要实现MessageListener,它里面有一个onMessage的方法,该方法就是要获取到MQ里面的信息并且调用第三方短信平台的借口发短信
package cn.itcast.bos.mq;
import java.io.UnsupportedEncodingException;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageListener;
import org.springframework.stereotype.Service;
import cn.itcast.bos.utils.SmsUtils;
@Service("smsConsumer")
public class SmsConsumer implements MessageListener {
@Override
public void onMessage(Message message) {
// TODO Auto-generated method stub
MapMessage mapMessage = (MapMessage) message;
//调用sms服务器发送短息
String result;
try {
result = SmsUtils.sendSmsByHTTP(mapMessage.getString("telephone"), mapMessage.getString("text"));
//String result = "000/xxx";
//判断短信是否发送成功
if (result.startsWith("000")) {
//成功
}else {
//失败
throw new RuntimeException("短信发送失败,信息码:"+result);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}