如何在java中创建消息查询处理方法?
我正在处理一个消息查询处理程序,因此,我需要为每个情况/状态声明一些方法:途中(如果尚未发送,则执行重试)、传递(从队列/列表中删除,以便停止发送)、过期和无法传递,具体取决于200ok响应。我已经有了过期和不可交付的方法(将积分返回给用户),但是我找不到合适的“途中”和“交付”方法,因为对于“途中”,我需要有参数,以便每Y秒重试一次(在单独的类上)(可能在application.properties中)我还想知道我是否可以在smsreader类上管理它,但我不确定(我会在最后留下示例代码)。你知道怎么做吗?这是我正在实际处理的代码如何在java中创建消息查询处理方法?,java,spring,methods,sms,Java,Spring,Methods,Sms,我正在处理一个消息查询处理程序,因此,我需要为每个情况/状态声明一些方法:途中(如果尚未发送,则执行重试)、传递(从队列/列表中删除,以便停止发送)、过期和无法传递,具体取决于200ok响应。我已经有了过期和不可交付的方法(将积分返回给用户),但是我找不到合适的“途中”和“交付”方法,因为对于“途中”,我需要有参数,以便每Y秒重试一次(在单独的类上)(可能在application.properties中)我还想知道我是否可以在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;
}
}
查询处理程序类
@组成部分
公共类MsgQueryApiHandler{
私有静态最终记录器Logger=LoggerFactory.getLogger(msgqueryapidhandler.class);
RestTemplate RestTemplate=新RestTemplate();
@值(${smscMsgQuery.host}”)
私有字符串smscMsgQueryHost;
@值(${smscMsgQuery.user})
私有字符串smscMsgQueryUser;
@值(${smscMsgQuery.pass}”)
私有字符串smscMsgQueryPass;
@自动连线
公共ConfirmHttp ConfirmHttp;
公共无效msgQueryHandle(SmsRequest SmsRequest){
字符串响应=getMessageStatus(Integer.parseInt(smsRequest.getMessageId());
开关(响应){
//重试
“途中”案例:
打破
//删除队列
“已交付”案例:
打破
“过期”案例:
案例“无法交付”:
退款信息(smsRequest);
打破
}
}
私人无效退款消息(SmsRequest SmsRequest){
ChargeHttpRequest reqBody=新的ChargeHttpRequest();
requbody.setOrigSystemId(smsRequest.getOrigSystemId());
请求主体设置状态(“失败”);
整数状态码=confirmHttp.sendCDR(reqBody);
info(“来自api{}的状态代码”,statusCode);
}
公共字符串getMessageStatus(int messageId){
字符串状态=”;
试一试{
UriComponentsBuilder=UriComponentsBuilder.fromHttpUrl(smscMsgQueryHost)
.queryParam(“用户ID”,smscMsgQueryUser)
.queryParam(“密码”,smscMsgQueryPass)
.queryParam(“msgid”,messageId)
;
ResponseEntity response=restemplate.getForEntity(builder.toUriString(),String.class);
if(response.getStatusCodeValue()==200){
字符串[]responseBody=response.getBody().split(“\n”);
如果(响应体长度>1){
状态=响应体[1];
记录器信息(状态);
}
}
}捕获(例外情况除外){
地位=”;
logger.error(“HTTP请求时发生的错误”,例如);
}
返回状态;
}
SMSREADER类
@RestController
@请求映射(“/smsReader”)
公共类SMSReader控制器{
@自动连线
私人短信阅读器;
@PostMapping(consumes=MediaType.APPLICATION\u XML\u值)
公共HashMap processSms(@RequestBody SmsRequest SmsRequest){
HashMap响应=新建HashMap();
试一试{
smsReader.saveSms(smsRequest);
响应。put(“响应”、“成功”);
}捕获(例外情况除外){
响应。put(“响应”、“失败”);
}
返回响应;
}
}