我正在处理一个消息查询处理程序,因此,我需要为每个案例/状态声明一些方法:enroute(如果尚未发送则执行重试)、delivered(从队列/列表中删除以使其停止发送)、expired和undelivered,具体取决于200ok响应。我已经有了过期和不可交付的方法(这会将信用返回给用户),但是我找不到合适的方法来处理“enroute”和“delivered”,因为对于“enroute”,我需要有参数来每y秒重试x次(在一个单独的类上(可能在application.properties中),对于delivered,则将其从队列中删除。我还想知道是否可以在smsreader类上管理它,但我不确定(我将在最后留下示例代码)。你知道怎么做吗?这是我正在编写的代码。
QUERY HANDLER CLASS
@Component
public class MsgQueryApiHandler {
private static final Logger logger = LoggerFactory.getLogger(MsgQueryApiHandler.class);
RestTemplate restTemplate = new RestTemplate();
@Value("${smscMsgQuery.host}")
private String smscMsgQueryHost;
@Value("${smscMsgQuery.user}")
private String smscMsgQueryUser;
@Value("${smscMsgQuery.pass}")
private String smscMsgQueryPass;
@Autowired
public ConfirmHttp confirmHttp;
public void msgQueryHandle(SmsRequest smsRequest){
String response = getMessageStatus(Integer.parseInt(smsRequest.getMessageId()));
switch (response){
//Perform Retries
case"ENROUTE":
break;
//remove of the queue
case"DELIVERED":
break;
case"EXPIRED":
case"UNDELIVERABLE":
refundMsg(smsRequest);
break;
}
}
private void refundMsg (SmsRequest smsRequest){
ChargeHttpRequest reqBody = new ChargeHttpRequest();
reqBody.setOrigSystemId(smsRequest.getOrigSystemId());
reqBody.setStatus("failed");
Integer statusCode = confirmHttp.sendCDR(reqBody);
logger.info("Status code from api {}", statusCode);
}
public String getMessageStatus(int messageId) {
String status = "";
try {
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(smscMsgQueryHost)
.queryParam("userid", smscMsgQueryUser)
.queryParam("password", smscMsgQueryPass)
.queryParam("msgid", messageId)
;
ResponseEntity<String> response = restTemplate.getForEntity(builder.toUriString(),String.class);
if(response.getStatusCodeValue()== 200){
String[] responseBody = response.getBody().split("\n");
if(responseBody.length>1){
status = responseBody[1];
logger.info(status);
}
}
} catch (Exception ex) {
status = "";
logger.error("An error ocurred on HTTP request", ex);
}
return status;
}
SMSREADER CLASS
@RestController
@RequestMapping("/smsReader")
public class SmsReaderController {
@Autowired
private SmsReader smsReader;
@PostMapping(consumes = MediaType.APPLICATION_XML_VALUE)
public HashMap<String, Object> processSms(@RequestBody SmsRequest smsRequest) {
HashMap<String, Object> response = new HashMap<>();
try {
smsReader.saveSms(smsRequest);
response.put("response", "success");
} catch (Exception ex) {
response.put("response", "failed");
}
return response;
}
}
暂无答案!
目前还没有任何答案,快来回答吧!