最近比較忙,工作上和生活上都是,小結(jié)下:
1.最近主要工作是接手了一些郵箱系統(tǒng)的開發(fā)工作,JavaMail倒是越來越熟悉了,碰到一個問題需要注意下,使用imap協(xié)議訪問郵件服務(wù)器,我在本機(jī)jboss和測試環(huán)境websphere上測試正常,一放到生產(chǎn)環(huán)境下就出問題,后浪費(fèi)我周末半天的時間檢查才發(fā)現(xiàn),imap默認(rèn)的LOGIN登錄是使用文本方式登錄,不需要認(rèn)證,在本機(jī)和測試環(huán)境都普通的LOGIN方式(有安全隱患的方式),在正式環(huán)境的環(huán)境變量卻設(shè)置為PLAIN認(rèn)證,導(dǎo)致登錄失敗,改正下:
2.過去辦公自動化系統(tǒng)的文檔顯示局限在word類型,今天弄了個新的ActiveX控件,自動更新或者安裝ActiveX控件,只要設(shè)置下CODEBASE即可,比如:
3.讀很多開源項目,動態(tài)加載配置文件是一個常見的技巧,最近也應(yīng)用了下,沒什么技術(shù)含量,僅記錄下。原理就是通過判斷File類的lastModified()得到修改時間與內(nèi)存中保存的最近修改時間進(jìn)行比較,如果大于就讀入配置文件重新設(shè)置配置信息:
比較值的注意的就是Class類的getResource和getResourceAsStream方法,當(dāng)然也可以使用ResourceBundle
4.最近將項目中過去別人寫的簡單工作流引擎分析了一下,顧名思義,是很簡單,采用數(shù)據(jù)庫作為流程定義的存儲介質(zhì),流程定義也是在web上操作,僅支持順序、選擇、并行路由,簡單的或、與條件選擇,因為只是作為沒有復(fù)雜流程的公文流轉(zhuǎn)系統(tǒng),倒是符合客戶要求。模型也是基于狀態(tài)機(jī)。復(fù)雜的條件運(yùn)算是沒辦法做到,沒有采用BeanShell的腳本語言也是個原因。Jruby到1.0了,今天下載了,有空看看。工作流采用Petri網(wǎng)建模是趨勢,可惜那本書我還沒讀完。
5.spring如何得到FactroyBean本身?我們知道實現(xiàn)FactroyBean接口的getObject方法,返回的就是getObject返回的bean,而如何得到FactoryBean本身呢?答案是加上一個符號&
6.SICP讀到2.2節(jié),準(zhǔn)備等習(xí)題全做完了再一起發(fā)上來,忙,讀的慢了。老婆的堂妹來了,租的房子只有一張床,只在這地方呆一年,可不想再買張床,我只好回公司宿舍!-_-
廢話不說,回家了。
1.最近主要工作是接手了一些郵箱系統(tǒng)的開發(fā)工作,JavaMail倒是越來越熟悉了,碰到一個問題需要注意下,使用imap協(xié)議訪問郵件服務(wù)器,我在本機(jī)jboss和測試環(huán)境websphere上測試正常,一放到生產(chǎn)環(huán)境下就出問題,后浪費(fèi)我周末半天的時間檢查才發(fā)現(xiàn),imap默認(rèn)的LOGIN登錄是使用文本方式登錄,不需要認(rèn)證,在本機(jī)和測試環(huán)境都普通的LOGIN方式(有安全隱患的方式),在正式環(huán)境的環(huán)境變量卻設(shè)置為PLAIN認(rèn)證,導(dǎo)致登錄失敗,改正下:
props.setProperty("mail.imap.auth.plain.disable", "true");
禁止掉認(rèn)證即可,還有一些變量設(shè)置可以在j2ee api doc里查到。說到底還是對協(xié)議的不熟悉就投入開發(fā)。2.過去辦公自動化系統(tǒng)的文檔顯示局限在word類型,今天弄了個新的ActiveX控件,自動更新或者安裝ActiveX控件,只要設(shè)置下CODEBASE即可,比如:
<OBJECT id="AutoVueX" classid="clsid:B6FCC215-D303-11D1-BC6C-0000C078797F" CODEBASE="http://localhost/xxxx"
./>

3.讀很多開源項目,動態(tài)加載配置文件是一個常見的技巧,最近也應(yīng)用了下,沒什么技術(shù)含量,僅記錄下。原理就是通過判斷File類的lastModified()得到修改時間與內(nèi)存中保存的最近修改時間進(jìn)行比較,如果大于就讀入配置文件重新設(shè)置配置信息:
private static void checkConfigModify() {
File file = new File(MailConnectionManager.class.getResource(
MailConstants.CONFIG_FILE).getFile());
//如果有修改,重新加載配置文件信息
if (file.lastModified() > MailConstants.last_modified) {
MailConstants.last_modified = file.lastModified();
setConfig();
}
}
private static void setConfig() {
InputStream is = null;
try {
Properties properties = new Properties();
is = MailConnectionManager.class
.getResourceAsStream(MailConstants.CONFIG_FILE);
properties.load(is);
MailConstants.USERNAME = properties.getProperty("username");
MailConstants.HOST = properties.getProperty("host");
MailConstants.PASSWORD = properties.getProperty("password");
System.out
.println("配置文件被修改,重新加載配置文件成功!");
StringBuffer sb = new StringBuffer("username:");
sb.append(MailConstants.USERNAME).append(" host:")
.append("host:").append(MailConstants.HOST);
if (MailConstants.PASSWORD != null)
sb.append(" ").append("password:not null");
else
sb.append(" password:null");
System.out.println(sb.toString());
} catch (Exception e) {
e.printStackTrace();
} finally {
if (is != null)
try {
is.close();
} catch (IOException e2) {
e2.printStackTrace();
}
}
}
File file = new File(MailConnectionManager.class.getResource(
MailConstants.CONFIG_FILE).getFile());
//如果有修改,重新加載配置文件信息
if (file.lastModified() > MailConstants.last_modified) {
MailConstants.last_modified = file.lastModified();
setConfig();
}
}
private static void setConfig() {
InputStream is = null;
try {
Properties properties = new Properties();
is = MailConnectionManager.class
.getResourceAsStream(MailConstants.CONFIG_FILE);
properties.load(is);
MailConstants.USERNAME = properties.getProperty("username");
MailConstants.HOST = properties.getProperty("host");
MailConstants.PASSWORD = properties.getProperty("password");
System.out
.println("配置文件被修改,重新加載配置文件成功!");
StringBuffer sb = new StringBuffer("username:");
sb.append(MailConstants.USERNAME).append(" host:")
.append("host:").append(MailConstants.HOST);
if (MailConstants.PASSWORD != null)
sb.append(" ").append("password:not null");
else
sb.append(" password:null");
System.out.println(sb.toString());
} catch (Exception e) {
e.printStackTrace();
} finally {
if (is != null)
try {
is.close();
} catch (IOException e2) {
e2.printStackTrace();
}
}
}
比較值的注意的就是Class類的getResource和getResourceAsStream方法,當(dāng)然也可以使用ResourceBundle
4.最近將項目中過去別人寫的簡單工作流引擎分析了一下,顧名思義,是很簡單,采用數(shù)據(jù)庫作為流程定義的存儲介質(zhì),流程定義也是在web上操作,僅支持順序、選擇、并行路由,簡單的或、與條件選擇,因為只是作為沒有復(fù)雜流程的公文流轉(zhuǎn)系統(tǒng),倒是符合客戶要求。模型也是基于狀態(tài)機(jī)。復(fù)雜的條件運(yùn)算是沒辦法做到,沒有采用BeanShell的腳本語言也是個原因。Jruby到1.0了,今天下載了,有空看看。工作流采用Petri網(wǎng)建模是趨勢,可惜那本書我還沒讀完。
5.spring如何得到FactroyBean本身?我們知道實現(xiàn)FactroyBean接口的getObject方法,返回的就是getObject返回的bean,而如何得到FactoryBean本身呢?答案是加上一個符號&
factory.getBean("&TestFactoryBean");
6.SICP讀到2.2節(jié),準(zhǔn)備等習(xí)題全做完了再一起發(fā)上來,忙,讀的慢了。老婆的堂妹來了,租的房子只有一張床,只在這地方呆一年,可不想再買張床,我只好回公司宿舍!-_-
廢話不說,回家了。