回调定义:先不告之,回头调用并告之。说明,回调机制有异步通知特点。
目前系统架构潮流是微服务+MQ异步,如果业务不需要这种架构或者仅单机部署,要怎么做到子线程业务不影响主线程服务呢。
这时候,回调就出现了Callback,
比如有个业务,需要发送邮件,但发送邮件不能影响主业务
一般方法:main-Thread调用emailService,emailService另开线程发送邮件
但如果我们要对发送邮件结果进行处理
不建议:main-Thread调用emailService,emailService另开线程发送邮件并处理结果
为什么不建议emailService来针对邮件发送结果进行其他业务处理,因为低耦合、低耦合,emailService的定义仅仅是发送邮件服务,不应该参杂其他业务
所以我这里在emailSerivce的函数里,设置了个回调参数,等emailService邮件发送有了结果,callback给业务层进行处理
这是业务函数:
public class BusinessService {
public static void main(String[] args) {
EmailService emailService = new EmailService();
System.out.println(Thread.currentThread().getName() + "....start");
emailService.sendEmail("123@qq.com", "needCallback", new EmailCallback() {
@Override
public void sendMessage(boolean sendResult) {
System.out.println(Thread.currentThread().getName() + ",发送结果: " + sendResult);
/*
* 对于发送结果,进行业务处理
*/
}
});
System.out.println(Thread.currentThread().getName() + "....end");
}
}
这是邮件服务函数:
public class EmailService {
public void sendEmail(String address, String content, EmailCallback emailCallback) {
try {
/*
*
* 实际应用:
* 1.通过发送MQ,让邮件服务来处理
* 2.线程池来处理业务,而不是每次
* new Thread() ExecutorService pool = Executors.newFixedThreadPool(10);
*/
new Thread(new Runnable() {
@Override
public void run() {
boolean sendResult = false;
try {
System.out.println(Thread.currentThread().getName() + "....email Service");
Thread.sleep(3000);
/*
* 子线程运行结果,不影响主线程,下行代码模拟业务异常
*/
int errorNum = 1 / 0;
sendResult = true;
} catch (Exception e) {
/*
* 异常
*/
} finally {
// 回调接口方法
emailCallback.sendMessage(sendResult);
}
}
}).start();
} catch (Exception e) {
/*
* 异常
*/
System.out.println(Thread.currentThread().getName() + ",error");
emailCallback.sendMessage(false);
}
}
这是回调接口
public interface EmailCallback {
void sendMessage(boolean sendResult);
}
测试运行结果:
main....start
main....end
Thread-0....email Service
Thread-0,发送结果: false