博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
好设计,迁移不费劲
阅读量:5280 次
发布时间:2019-06-14

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

前言

尽管java的口号:Write Once, Run Anywhere ,但现实非常残酷。不同的操作系统、不同的容器总是让我们:Write Once,Debug Anywhere。所以关键还是要看设计。好的设计能降低迁移成本。

近期须要将roller迁移到百度云中,发现roller设计的真不错。很easy就看迁移到云中了。

迁移的主要是数据,roller使用mysql,而百度云也提高mysql。这个基本不须要考虑迁移。主要是roller的图片上传功能:

1、怎样将已经上传的图片迁移到百度的bcs中?

2、怎样以最小的代价让将上传图片的功能迁移到百度bcs中?

添加一个切换开关:roller.properties

baiduyun.accessKey=dtjTg3L9xmbaiduyun.secretKey=9V1L9mul9IVbbaiduyun.bucket=helloenabled.use.baiduyun=true

扩展存储文件的实现类

package org.apache.roller.weblogger.business;import java.io.InputStream;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.apache.roller.weblogger.config.WebloggerConfig;import org.apache.roller.weblogger.pojos.FileContent;import org.apache.roller.weblogger.pojos.MediaFile;import org.apache.roller.weblogger.pojos.Weblog;import org.apache.roller.weblogger.util.RollerMessages;import com.baidu.inf.iis.bcs.BaiduBCS;import com.baidu.inf.iis.bcs.auth.BCSCredentials;import com.baidu.inf.iis.bcs.model.Empty;import com.baidu.inf.iis.bcs.model.ObjectMetadata;import com.baidu.inf.iis.bcs.model.X_BS_ACL;import com.baidu.inf.iis.bcs.request.PutObjectRequest;/** * Manages contents of the file uploaded to Roller weblogs.   *  * This base implementation writes file content to a file system. */public class BaiduYunFileContentManagerImpl extends FileContentManagerImpl {	    private static Log log = LogFactory.getLog(BaiduYunFileContentManagerImpl.class);        private String host = "bcs.duapp.com";    private String accessKey = "";    private String secretKey = "";    private String bucket = "";    private BaiduBCS baiduBCS = null;    /**     * Create file content manager.     */    public BaiduYunFileContentManagerImpl() {            	accessKey = WebloggerConfig.getProperty("baiduyun.accessKey");    	secretKey = WebloggerConfig.getProperty("baiduyun.secretKey");    	bucket = WebloggerConfig.getProperty("baiduyun.bucket");    	    	BCSCredentials credentials = new BCSCredentials(accessKey, secretKey);    	baiduBCS = new BaiduBCS(credentials, host);    	baiduBCS.setDefaultEncoding("UTF-8"); // Default UTF-8    	    	    }        /**     * @see org.apache.roller.weblogger.model.FileContentManager#getFileContent(weblog, java.lang.String)     */    public FileContent getFileContent(Weblog weblog, String fileId)             throws FileNotFoundException, FilePathException {            	log.info("=====================get file content:" + fileId);    	final InputStream is = baiduBCS.getObject(bucket, getObjectStoragePath(weblog, fileId)).getResult().getContent();        return new FileContent(weblog, fileId, null) {        	private InputStream ins = is;			@Override			public InputStream getInputStream() {				return ins;			}        };    }        private String getObjectStoragePath(Weblog weblog ,String fileId) {    	return '/' + weblog.getHandle() + '/' + fileId;    }            public void saveFileContent(Weblog weblog, MediaFile mediaFile)            throws FileNotFoundException, FilePathException, FileIOException {    	    	log.info("==========saveFileContent start ->" + mediaFile.getId());    			ObjectMetadata objectMetadata = new ObjectMetadata();		objectMetadata.setContentType(mediaFile.getContentType());		objectMetadata.setContentLength(mediaFile.getLength());				PutObjectRequest request = new PutObjectRequest(bucket, 				getObjectStoragePath(weblog, mediaFile.getId()), 				mediaFile.getInputStream(), 				objectMetadata);				ObjectMetadata result = baiduBCS.putObject(request).getResult();		log.info(result);		baiduBCS.putObjectPolicy(bucket, getObjectStoragePath(weblog, mediaFile.getId()),X_BS_ACL.PublicRead);				log.info("==========saveFileContent end");		    }            /**     * @see org.apache.roller.weblogger.model.FileContentManager#deleteFile(weblog, java.lang.String)     */    public void deleteFile(Weblog weblog, String fileId)             throws FileNotFoundException, FilePathException, FileIOException {            	log.info("==========deleteFile start:" + fileId);                Empty result = baiduBCS.deleteObject(bucket, getObjectStoragePath(weblog, fileId)).getResult();        baiduBCS.deleteObject(bucket, getObjectStoragePath(weblog, fileId) + "_sm").getResult();        		log.info(result);				log.info("==========deleteFile start");		    }            /**     * @see org.apache.roller.weblogger.model.FileContentManager#overQuota(weblog)     */    public boolean overQuota(Weblog weblog) {                return false;    }                @Override	public boolean canSave(Weblog weblog, String fileName, String contentType,			long size, RollerMessages messages) {    	    	return true;	}}
改动ioc注入:

JPAWebloggerModule.java

if(WebloggerConfig.getBooleanProperty("enabled.use.baiduyun")) {        	binder.bind(FileContentManager.class).to(  BaiduYunFileContentManagerImpl.class);        }        else {        	binder.bind(FileContentManager.class).to(  FileContentManagerImpl.class);        }

最后想说的是这种方法參数设计不太好,应该把MediaFile作为參数。而非用其个别字段(fileId和inputstream)

public void saveFileContent(Weblog weblog,            String fileId,            InputStream is)            throws FileNotFoundException, FilePathException, FileIOException;

这样,roller就能够把百度bcs作为存储图片的server了。

转载于:https://www.cnblogs.com/lytwajue/p/6992514.html

你可能感兴趣的文章
Teamcenter10 step-by-step installation in Linux env-Oracle Server Patch
查看>>
Struts2学习(三)
查看>>
Callable和Runnable和FutureTask
查看>>
GitHub 多人协作开发 三种方式:
查看>>
文本域添加编辑器
查看>>
Yum安装MySQL以及相关目录路径和修改目录
查看>>
java获取hostIp和hostName
查看>>
关于web服务器和数据库的各种说法(搜集到的)
查看>>
C# Stream 和 byte[] 之间的转换
查看>>
OMG: daily scrum nine
查看>>
redis与spring结合错误情况
查看>>
第六章 字节码执行方式--解释执行和JIT
查看>>
字符串方法title()、istitle()
查看>>
yield语句
查看>>
查看linux系统中占用cpu最高的语句
查看>>
[洛谷P1738]洛谷的文件夹
查看>>
ubuntu server设置时区和更新时间
查看>>
【京东咚咚架构演进】-- 好文收藏
查看>>
【HTML】网页中如何让DIV在网页滚动到特定位置时出现
查看>>
文件序列化
查看>>