基于代理和注解机制,实现消息重发(APP,SMS)效果
2014-05-24 00:00
369 查看
摘要: 最近有业务需求,在写消息推方面(APP,SMS)的实现代码,由于一些特殊原因(网络),需要实现一个消息重发的机制(如果发送失败的话,则重新发送,最多发送N次)
最近有业务需求,在写消息推方面(APP,SMS)的实现代码,由于一些特殊原因(网络),需要实现一个消息重发的机制(如果发送失败的话,则重新发送,最多发送N次)
由于以上的一个需求,在实现的过程中,最开始想到的是使用监听(类似观察者模式的感觉),发送失败的话,即有相应的处理逻辑,但是由于一些原因,并没有使用这个方法,使用了以下书写的代理和注解机制,实现了重发效果,具体消息发送的代码使用dosomething代替;
如果您还有其他更好的方法,欢迎指导。
以下贴出来我的一些实现代码:
以上代码很简单,不过多进行解释;
重发次数定义在‘发送接口中’5次,具体的发送代码在‘SMSService’中
最近有业务需求,在写消息推方面(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> 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’中
相关文章推荐
- hessian基于HessianServlet方式实现,加入servlet动态代理机制!
- Android中利用App实现消息推送机制的代码
- 利用OC的消息转发机制实现多重代理
- 采用handle消息机制实现轮播效果
- 利用OC的消息转发机制实现多重代理
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。
- Android中利用App实现消息推送机制的代码
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别
- [Andriod]计时器实现-基于线程消息机制三种方式
- 基于JSR-356实现的Tyrus WebSocket框架的消息传递机制初步了解
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。
- Android中利用App实现消息推送机制的代码
- Android中利用App实现消息推送机制的代码
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别
- 如何实现基于消息/传输安全验证机制下的windows身份验证过程、无任何验证
- 加强2注解。泛型。类加载器及其委托机制。代理的概念与作用原理,AOP概念。实现AOP功能的封装与配置。类似Spring。
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。
- VC下基于消息机制的UDP连接实现
- 基于事件分发机制,以最小代价实现listview顶部悬浮效果
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。