有了统一的接口,可以有灵活的实现方式,如通过HTTP、FTP、SOCKET等方式发送到异地机房。
  在上面的BackupServiceExecuter类中我们已经看到,当备份成功之后会调用BackupFileSenderExecuter的send方法发送备份文件,如下:
boolean result = backupService.backup();
//如果备份成功,则将备份文件发往他处
if(result){
backupFileSenderExecuter.send(getNewestBackupFile());
}
  BackupFileSenderExecuter的设计和BackupServiceExecuter类似,不过策略不一样,如果配置有多个Sender,那么会调用所有的Sender,达到拥有多个副本的目的。BackupFileSenderExecuter利用配置项log.backup.file.sender的值来指定启用哪些Sender,并依次调用各个Sender的send方法来完成文件的发送,如下所示:
  log.backup.file.sender=localBackupFileSender;
  这里 localBackupFileSender是LocalBackupFileSender的Spring Bean名称。
/**
*执行备份文件的发送服务,根据配置文件来判断使用哪些发送器,并按配置的前后顺序依次调用
* @author 杨尚川
*/
@Service
public class BackupFileSenderExecuter  implements  BackupFileSender, ApplicationListener{
protected final APDPlatLogger LOG = new APDPlatLogger(getClass());
private static final List<BackupFileSender> backupFileSenders = new LinkedList<>();
@Override
public void send(File file) {
for(BackupFileSender sender : backupFileSenders){
sender.send(file);
}
}
@Override
public void onApplicationEvent(ApplicationEvent event){
if(event instanceof ContextRefreshedEvent){
LOG.info("spring容器初始化完成,开始解析BackupFileSender");
String senderstr = PropertyHolder.getProperty("log.backup.file.sender");
if(StringUtils.isBlank(senderstr)){
LOG.info("未配置log.backup.file.sender");
return;
}
LOG.info("log.backup.file.sender:"+senderstr);
String[] senders = senderstr.trim().split(";");
for(String sender : senders){
BackupFileSender backupFileSender = SpringContextUtils.getBean(sender.trim());
if(backupFileSender != null){
backupFileSenders.add(backupFileSender);
LOG.info("找到BackupFileSender:"+sender);
}else{
LOG.info("未找到BackupFileSender:"+sender);
}
}
}
}
}
  看一个备份文件发送者示例LocalBackupFileSender:
/**
* 将备份文件从本地一个目录复制到另一个目录
* @author 杨尚川
*/
@Service
public class LocalBackupFileSender implements BackupFileSender{
protected final APDPlatLogger LOG = new APDPlatLogger(getClass());
@Override
public void send(File file) {
try {
String dist = PropertyHolder.getProperty("log.backup.file.local.dir");
LOG.info("备份文件:"+file.getAbsolutePath());
LOG.info("目标目录:"+dist);
FileUtils.copyFile(file, new File(dist,file.getName()));
} catch (IOException ex) {
LOG.info("LocalBackupFileSender失败", ex);
}
}
}