|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
java也能做一些底层语言开发做的事情(难度很高,不是java顶尖高手是做不来的),
关于WeblogicServer重启或logrotation招致server.log的inodenumber变更成绩
前两天同事问我一个成绩,说是客户何处利用Tivoli剖析weblogicserver日记的时分,每当server重启,Tivoli就堕落,说是FileIdischanged。事先就嫌疑大概跟serverlog的iNodeNumber有关。由于没怎样细心看过weblogicserverlogging的代码,也不是很确认。跟同事说,让客户经由过程ls-i确认一下对应的iNodeNumber。客户反应说:iNodeNumber没有产生变更,溃散,文件名没变,iNodeNumber没变,Tivoli说的FileId究竟是甚么?FileSystem里另有其他标识文件的工具?我有点入手下手嫌疑这个客户了,嘿嘿。干脆,本人做个测试吧。
起首看了看weblogic的代码,logrotation的时分,只是挪用了File.renameTo(),以下:
weblogic.loggin.FileStreamHandler.rotateLog()
logFile.renameTo(rotatedFile)
见鬼了,rename完了iNodeNumber另有稳定的事理?看看JDK代码再说,
File.renameTo()
1 public boolean renameTo(File dest) {
2 SecurityManager security = System.getSecurityManager();
3 if (security != null) {
4 security.checkWrite(path);
5 security.checkWrite(dest.path);
6 }
7 return fs.rename(this,dest);
8 }
这家伙,仍是依附于FileSystem的,再一看,FileSystem是个笼统类,rename的详细完成一定跟详细的subclass有关了,只能看看Win32FileSystem吧,
Win32FileSystem.java
1 public boolean rename(File f1,File f2) {
2 // Keep canonicalization caches in sync after file deletion
3 // and renaming operations. Could be more clever than this
4 // (i.e.,only remove/update affected entries) but probably
5 // not worth it since these entries expire after 30 seconds
6 // anyway.
7 cache.clear();
8 prefixCache.clear();
9 return rename0(f1,f2);
10 }
11 private native boolean rename0(File f1,File f2);
好了,如今看到了,rename0()是个native操纵,跟共享库(.dllor.so)又扯上干系了。得, 没有当地库代码,也看不到甚么完成了(不外团体感到,当地完成挪用应当是体系函数rename: intrename(constchar*old,constchar*new)),只能本人做完成了。写了个小测试程序,以下:
1 package com.bea.cs.test.file;
2
3 import java.io.File;
4
5 public class FileTest {
6
7 private File src = new File("test");
8
9 public static void main(String args[])
10 {
11 FileTest test = new FileTest();
12 test.run();
13 }
14
15 public void run()
16 {
17 rename("test1");
18 }
19
20 private boolean rename(String name)
21 {
22 boolean ret = false;
23 File dest = new File(name);
24 ret = src.renameTo(dest);
25 /*
26 * as src is renamed to dest,dest should hold the iNodeNumber of src
27 */
28 src = new File("test");
29 try
30 {
31 /*
32 * As has been renamed to dest,src should not exist again
33 * so we should create a new src file,or it will disappear when
34 * test exits. As a new file,src shuold get a new iNodeNumber
35 * that different from its original value
36 */
37 if(!src.exists())
38 src.createNewFile();
39 }catch(Exception e)
40 {
41 e.printStackTrace();
42 }
43 return ret;
44 }
45 }
测试的了局以下:
Test Reustlslsol6% ls -il
total 8
6033508 drwxr-xr-x 3 fjin staff 4096 Sep 26 23:48 com
6033514 -rw-r--r-- 1 fjin staff 0 Sep 26 23:56 test
slsol6% java com.bea.cs.test.file.FileTest
slsol6% ls -il
total 8
6033508 drwxr-xr-x 3 fjin staff 4096 Sep 26 23:48 com
6033506 -rw-r--r-- 1 fjin staff 0 Sep 27 01:03 test
6033514 -rw-r--r-- 1 fjin staff 0 Sep 26 23:56 test1
如今我这能嫌疑客户了,Tivoli报错应当是一般的(Workasdesign),不外对照烦闷的是:Tivoli为何要援用FileId,而不是FileName? 入手下手想改改weblogic的代码,挪用相似于copy的操纵,而不是rename。了局没有看到File供应相似的API,并且假如如许做的话,清空本来file内容也是个成绩,因而作罢。
自己的整个学习思路完全被老师的讲课思路所牵制,这样几节课听下来,恐怕自己的见解都应该是书里的知识点了,根本谈不上自身发现问题,分析问题,和解决问题能力的切实提高。 |
|