博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于代理和注解机制,实现消息重发(APP,SMS)效果
阅读量:7023 次
发布时间:2019-06-28

本文共 2199 字,大约阅读时间需要 7 分钟。

hot3.png

最近有业务需求,在写消息推方面(APP,SMS)的实现代码,由于一些特殊原因(网络),需要实现一个消息重发的机制(如果发送失败的话,则重新发送,最多发送N次)

由于以上的一个需求,在实现的过程中,最开始想到的是使用监听(类似观察者模式的感觉),发送失败的话,即有相应的处理逻辑,但是由于一些原因,并没有使用这个方法,使用了以下书写的代理和注解机制,实现了重发效果,具体消息发送的代码使用dosomething代替;

如果您还有其他更好的方法,欢迎指导。

以下贴出来我的一些实现代码:

package test;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * 默认的重试次数 * @author alexgaoyh * */@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface SMSRetry {	int times() default 1;}

package test;/** * 发送接口 * @author alexgaoyh * */public interface SMSToSend {	@SMSRetry(times = 5)	void doSomething(String thing);}

package test;/** * 发送服务 * @author alexgaoyh * */public class SMSService implements SMSToSend {	@Override	public void doSomething(String thing) {		System.out.println(thing);		//如果下面的代码行并没有被注释,说明在发送过程中抛出了异常,那么接下来,会持续发送SMSToSend接口中定义的5次消息		//throw new RuntimeException();	}}
package test;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * 代理模式 * @author alexgaoyh * */public class SMSRetryProxy implements InvocationHandler {	private Object object;	@SuppressWarnings("unchecked")	public 
T getInstance(T t) { object = t; return (T) Proxy.newProxyInstance(t.getClass().getClassLoader(), t .getClass().getInterfaces(), this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { int times = method.getAnnotation(SMSRetry.class).times(); Object result = null; while (times-- > 0) { try { result = method.invoke(object, args); break; } catch (Exception e) { System.out.println(e.getStackTrace()); System.out.println("error happend, retry"); } } return result; }}
package test;/** * 短信业务为SMS "short message service"  * 客户端测试方法 * @author alexgaoyh * */public class SMSClient {	public static void main(String[] args) {		SMSToSend toDo = new SMSRetryProxy().getInstance(new SMSService());		toDo.doSomething("== (short message service)send short messages ==");	}}

以上代码很简单,不过多进行解释;

重发次数定义在‘发送接口中’5次,具体的发送代码在‘SMSService’中

转载于:https://my.oschina.net/alexgaoyh/blog/268504

你可能感兴趣的文章
ZOJ1093 动态规划
查看>>
.Echo 命令中经常提到回显,是什么意思?
查看>>
MySQL在大数据Limit使用
查看>>
iOS中如何创建一个滑出式导航面板(1)
查看>>
Solr5.3.1整合IKAnalyzer
查看>>
Swift - 06 - 数值类型转换和类型别名
查看>>
华为3G模块EM770W在LINUX下的驱动安装
查看>>
omnet++4.0安装使用
查看>>
Jquery JSOPN在WebApi中的问题
查看>>
[React Testing] Conditional className with Shallow Rendering
查看>>
广州Uber优步司机奖励政策(1月11日~1月17日)
查看>>
slam相关知识
查看>>
python数字图像处理(8):对比度与亮度调整
查看>>
java_easyui体系之目录 [转]
查看>>
javascript实现div的显示和隐藏
查看>>
VMware安装64位操作系统提示Intel VT-x处于禁用状态的解决办法
查看>>
经纬度求距离求与正北方向的夹角(方向角)
查看>>
a or an
查看>>
Coursera课程《大家的python》(Python for everyone)课件
查看>>
PHP程序猿必须学习的第二课——站点安全问题预防
查看>>