package org.rabbit.consumer.jpush.sms;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.rabbit.common.delay.sms.Payload;
import org.rabbit.common.delay.sms.Sms;
import org.rabbit.consumer.spring.SpringContextUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import cn.jiguang.common.resp.APIConnectionException;
import cn.jiguang.common.resp.APIRequestException;
import cn.jsms.api.JSMSClient;
import cn.jsms.api.common.model.BatchSMSPayload;
import cn.jsms.api.common.model.BatchSMSResult;
import cn.jsms.api.common.model.RecipientPayload;
import cn.jsms.api.common.model.RecipientPayload.Builder;
public class SMSClient {
private static final Logger logger = LoggerFactory.getLogger(SMSClient.class);
static ExecutorService pool = Executors.newFixedThreadPool(20);
private static String appKey;
private static String masterSecret;
private static JSMSClient client;
static {
JSMSProperties jsmsProperties = SpringContextUtils.getBean(JSMSProperties.class);
appKey = jsmsProperties.getAppKey();
masterSecret = jsmsProperties.getMasterSecret();
client = new JSMSClient(masterSecret, appKey);
}
public static void send(final Sms sms) {
pool.execute(new Runnable() {
@Override
public void run() {
List<RecipientPayload> list = new ArrayList<RecipientPayload>();
for (Payload payload : sms.getPayloads()) {
Builder builder = new RecipientPayload.Builder().setMobile(payload.getNumber());
for (Map.Entry<String, String> entry : payload.getParam().entrySet()) {
builder.addTempPara(entry.getKey(), entry.getValue());
}
list.add(builder.build());
}
RecipientPayload[] recipientPayloads = new RecipientPayload[list.size()];
BatchSMSPayload smsPayload = BatchSMSPayload.newBuilder().setTempId(sms.getTempId())
.setRecipients(list.toArray(recipientPayloads)).build();
try {
BatchSMSResult result = client.sendBatchTemplateSMS(smsPayload);
if (logger.isInfoEnabled()) {
logger.info("Jpush sms push result :{}" + result);
}
} catch (APIConnectionException e) {
if (logger.isErrorEnabled()) {
logger.error("Connection error. Should retry later. ", e);
}
} catch (APIRequestException e) {
if (logger.isErrorEnabled()) {
logger.error("Error response from JPush server. Should review and fix it. ", e);
}
}
}
});
}
}
package org.rabbit.common.delay.sms;
import java.io.Serializable;
import javax.validation.Valid;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import org.service.core.entity.BaseEntity;
public class Sms extends BaseEntity implements Serializable {
private static final long serialVersionUID = 1860751506802678210L;
@NotNull(message = "{sms.payloads.not.null.valid}", groups = { Insert.class })
@Valid
private Payload[] payloads;
@NotNull(message = "{sms.tempId.not.null.valid}", groups = { Insert.class })
private Integer tempId;
@NotNull(message = "{sms.time.not.null.valid}", groups = { Insert.class })
@Min(value = 0, message = "{sms.time.min.valid}", groups = { Insert.class })
private Long time;
public Payload[] getPayloads() {
return payloads;
}
public void setPayloads(Payload[] payloads) {
this.payloads = payloads;
}
public Integer getTempId() {
return tempId;
}
public void setTempId(Integer tempId) {
this.tempId = tempId;
}
public Long getTime() {
return time;
}
public void setTime(Long time) {
this.time = time;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
}
package org.rabbit.consumer.jpush.sms;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class JSMSProperties {
@Value("${jpush.sms.appKey}")
private String appKey;
@Value("${jpush.sms.masterSecret}")
private String masterSecret;
public String getAppKey() {
return appKey;
}
public void setAppKey(String appKey) {
this.appKey = appKey;
}
public String getMasterSecret() {
return masterSecret;
}
public void setMasterSecret(String masterSecret) {
this.masterSecret = masterSecret;
}
}