在项目上经常遇到发送手机验证码的需求,一般通过产生验证码发送到消息中间件中,异步的去处理发送需求,由于ActiveMQ支持RESTful API,所以可以通过HTTP请求的方法发送消息到目的地。
注意点:
1. 必须是POST请求
2. 需要进行认证,在Header中添加Authorization
3. 必须指定目的地及目的地类型(本案例是queue)
4. 发送的内容使用body指定
代码案例如下:
public class SendMobileMsg {
public static final String jmsserverurl = "http://127.0.0.1:8161/api/message?destination=queue://";
public static final String jmsCheckCodeQueue = "FirstQueue1";
public String sendMobileMsg(String sendTo) {
MsgFormat msgft = new MsgFormat();
String sixString = this.getCheckCode();
String msgTemplate = "验证码为%s,将在10分钟后失效,请勿将此信息泄露给他人以免给您带来损失.";
msgTemplate = String.format(msgTemplate, sixString);
msgft.setSendTo(sendTo);
msgft.setSignature(Encodes.urlEncode("XXXXX"));
msgft.setContent(Encodes.urlEncode(msgTemplate));
String content = JSON.toJSONString(msgft);
try {
JmsOperate.sendMessage(jmsserverurl, content, jmsCheckCodeQueue);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return sixString;
}
/*
* 生成6位数字验证码
*/
private String getCheckCode() {
// 元素
int[] array = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
// 随机对象
Random rand = new Random();
// 循环产生
for (int i = 10; i > 1; i--) {
int index = rand.nextInt(i);
int tmp = array[index];
array[index] = array[i - 1];
array[i - 1] = tmp;
}
// 拼接结果为字符串
int result = 0;
for (int i = 0; i < 6; i++)
result = result * 10 + array[i];
String sixString = Integer.toString(result);
// 有可能出现5位数,前面加0补全
if (sixString.length() == 5) {
sixString = "0" + sixString;
}
return sixString;
}
public static void main(String[] args) {
SendMobileMsg sendMobileMsg = new SendMobileMsg();
sendMobileMsg.sendMobileMsg("157****4595");
}
}
发送到activeMQ服务器代码:
public class JmsOperate {
private static Logger logger = LoggerFactory.getLogger(JmsOperate.class);
public static void sendMessage(String jmsserverurl, String content, String destination)
throws UnsupportedEncodingException, IOException {
HttpClient httpClient = new HttpClient();
UsernamePasswordCredentials creds = new UsernamePasswordCredentials("admin", "admin");
httpClient.getState().setCredentials(AuthScope.ANY, creds);
List<Header> headers = new ArrayList<Header>();
headers.add(new Header("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)"));
httpClient.getHostConfiguration().getParams().setParameter("http.default-headers", headers);
PostMethod method = new PostMethod(jmsserverurl + destination);
method.addParameter("body", content);
method.setDoAuthentication(true);
method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(3, false));
try {
int statusCode = httpClient.executeMethod(method);
if (statusCode != HttpStatus.SC_OK) {
logger.info("Method failed code=" + statusCode + ": " + method.getStatusLine());
} else {
logger.info(new String(method.getResponseBody(), "utf-8"));
}
} finally {
method.releaseConnection();
}
}
}
需要在本地启动activeMQ服务器,写个消费者接收下消息结果如下:
证明消息是成功发送到activeMQ服务器了,也可以在控制台查看