在項目上經常遇到發送手機驗證碼的需求,一般通過產生驗證碼發送到消息中間件中,異步的去處理髮送需求,由於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服務器了,也可以在控制檯查看