随笔-109  评论-187  文章-25  trackbacks-0
  2006年4月6日
利用免费的英语角把英语练好

北京  也乐英语为了满足广大英语爱好者的需要特推出周末免费英语角服务,

北京英语角的组织形式如下:

    1:由也乐英语派出一名外教和一名助理负责组织英语角的活动。

    2: 英语角每周组织一次活动,也乐英语培训学校提供一间教室为大家的活动场所。

    3:英语爱好者可以免费参加英语角的活动,不收取任何费用,此活动是公益活动,也乐英

语不收取任何费用,也不限制参加次数。

    4:也乐英语免费提供给英语爱好者茶水、咖啡、以及活动所采用的书籍报纸。

    5:每周一到2个话题,由外教提前一周告诉大家,大家可以简单准备,以便在课堂上
        跟外教以及同学交流。
   
    6:外教会纠正大家的发音、语法、词汇上的错误,会形成一些总结,也希望大家能够畅所

欲言,大胆的说英语。

     7:所有参加英语角的爱好者,请您在交流期间把手机调为静音。

     也乐英语地址:北京丰台区马家堡西路15号 时代风帆大厦2区1901
     交通状况:地铁四号线角门西站A口上楼即可。 51、501、54、529、698、646、707 嘉园

二里东门下车
     联系电话:010-58423871  15330275871

      此活动由于报名数量众多,所以需要大家提前预约。
      也乐英语网站:www.yellenglish.com
      也乐英语 争做北京最好的英语角.
posted @ 2011-06-19 09:35 小小程序程序员混口饭吃 阅读(2071) | 评论 (0)编辑 收藏
我认为最大的冲击莫过于 惠普,oracle跟惠普的直接竞争会加大,从合作变为竞争,我认为惠普如果不收购redhat来对抗,未来肯定落下风!
posted @ 2009-04-22 09:56 小小程序程序员混口饭吃 阅读(624) | 评论 (0)编辑 收藏
     摘要: 上篇文章讲述了jacorb 的配置,本章讲叙其应用,随后的几篇文章会重点讲述corba的开发   JACORB开发以及corba的请求方式:    JacORB的应用开发一般分为以下五步: 1.写IDL接口定义 2.编译IDL接口定义生成Java类 3.实现步骤2中生成的接口 4.写服务器启动类,并注册到ORB 5.写客户端去获取服务对象引用 &nb...  阅读全文
posted @ 2007-11-22 10:41 小小程序程序员混口饭吃 阅读(8249) | 评论 (2)编辑 收藏

                   how to setup jacorb dev env
1:download JacORB_2_2

       http://www.jacorb.org/download.html
  download ant
       http://ant.apache.org/bindownload.cgi

2:extact JacORB_2_2.jar to d:\JacORB_2_2

3:setup sys environment

       set ANT_HOME=
       set JAVA_HOME=
       set JACORB_HOME=d:\JacORB_2_2
       set PATH=%PATH%;%ANT_HOME%\bin;%JAVA_HOME%\bin;%JACORB_HOME%\bin;
       set CLASSPAHT=.;%CLASSPAHT%;%ANT_HOME%\lib\ant.jar;%JACORB_HOME%\lib\jarorb.jar;%JACORB_HOME%\lib\idl.jar\;%JACORB_HOME%\lib\logkit-1.2.jar

4:rename %JACORB_HOME%\etc\jacorb_properties.template to %JACORB_HOME%\etc\jacorb.properties
  and modify the 50th line to 53th line to
 
       #ORBInitRef.NameService=file:/y:/nsiona.ref
      
ORBInitRef.NameService=file://d://test//NS_Ref
      
#ORBInitRef.NameService=http://www.x.y.z/~user/NS_Ref
      
#ORBInitRef.TradingService=http://www.x.y.z/~user/TraderRef
 
  modify 618th line to
       jacorb.naming.ior_filename=d://test//NS_Ref

5:rename  %JACORB_HOME%\jacotemplate.bat to %JACORB_HOME%\jaco.bat
 
  and modify related env variable
 
  rename   %JACORB_HOME%\idltemplate.bat to %JACORB_HOME%\idl.bat
  
  and modify related env variable

 

6:  use ant compile and build idl and java


     cd  %JACORB_HOME%\demo\grid  

     run ant
   
     the generate class file in %JACORB_HOME%\classes  and generated java file in %JACORB_HOME%\demo\grid


7: open a new cmd window:
          cd %JACORB_HOME%   ns
 
   you can see the following result:   
       [ configuration jacorb loaded from file %JAORB_HOME%\etc\jacorb.properties]

   open a new cmd window:
          cd %JACORB_HOME%   jaco demo.grid.Server
  you can see the following result:   
  [ configuration jacorb loaded from file %JAORB_HOME%\etc\jacorb.properties]
  
  open a new cmd window:
          cd %JACORB_HOME%   jaco demo.grid.client
    you can see the following result:   
 
  [ configuration jacorb loaded from file D:\work\nj\JACORB\etc\jacorb.properties]
   Height = 31
   Width = 14
   Old value at (30,13): 0.21
   Setting (30,13) to 470.11
   New value at (30,13): 470.11
   MyException, reason: This is only a test exception, no harm done :-)
   done.

posted @ 2007-11-21 10:36 小小程序程序员混口饭吃 阅读(4217) | 评论 (4)编辑 收藏
 
oracle的分析函数over 及开窗函数
一:分析函数over
Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是
对于每个组返回多行,而聚合函数对于每个组只返回一行。
下面通过几个例子来说明其应用。                                       
1:统计某商店的营业额。        
     date       sale
     1           20
     2           15
     3           14
     4           18
     5           30
    规则:按天统计:每天都统计前面几天的总额
    得到的结果:
    DATE   SALE       SUM
    ----- -------- ------
    1      20        20           --1天           
    2      15        35           --1天+2天           
    3      14        49           --1天+2天+3天           
    4      18        67            .          
    5      30        97            .
     
2:统计各班成绩第一名的同学信息
    NAME   CLASS S                         
    ----- ----- ----------------------
    fda    1      80                     
    ffd    1      78                     
    dss    1      95                     
    cfe    2      74                     
    gds    2      92                     
    gf     3      99                     
    ddd    3      99                     
    adf    3      45                     
    asdf   3      55                     
    3dd    3      78              
   
    通过:   
    --
    select * from                                                                       
    (                                                                            
    select name,class,s,rank()over(partition by class order by s desc) mm from t2
    )                                                                            
    where mm=1
    --
    得到结果:
    NAME   CLASS S                       MM                                                                                        
    ----- ----- ---------------------- ----------------------
    dss    1      95                      1                      
    gds    2      92                      1                      
    gf     3      99                      1                      
    ddd    3      99                      1          
   
    注意:
    1.在求第一名成绩的时候,不能用row_number(),因为如果同班有两个并列第一,row_number()只返回一个结果          
    2.rank()和dense_rank()的区别是:
      --rank()是跳跃排序,有两个第二名时接下来就是第四名
      --dense_rank()l是连续排序,有两个第二名时仍然跟着第三名
     
     
3.分类统计 (并显示信息)
    A   B   C                      
    -- -- ----------------------
    m   a   2                      
    n   a   3                      
    m   a   2                      
    n   b   2                      
    n   b   1                      
    x   b   3                      
    x   b   2                      
    x   b   4                      
    h   b   3
   select a,c,sum(c)over(partition by a) from t2                
   得到结果:
   A   B   C        SUM(C)OVER(PARTITIONBYA)      
   -- -- ------- ------------------------
   h   b   3        3                        
   m   a   2        4                        
   m   a   2        4                        
   n   a   3        6                        
   n   b   2        6                        
   n   b   1        6                        
   x   b   3        9                        
   x   b   2        9                        
   x   b   4        9                        
  
   如果用sum,group by 则只能得到
   A   SUM(C)                            
   -- ----------------------
   h   3                      
   m   4                      
   n   6                      
   x   9                      
   无法得到B列值       
  
=====

select * from test

数据:
A B C
1 1 1
1 2 2
1 3 3
2 2 5
3 4 6


---将B栏位值相同的对应的C 栏位值加总
select a,b,c, SUM(C) OVER (PARTITION BY B) C_Sum
from test

A B C C_SUM
1 1 1 1
1 2 2 7
2 2 5 7
1 3 3 3
3 4 6 6



---如果不需要已某个栏位的值分割,那就要用 null

eg: 就是将C的栏位值summary 放在每行后面

select a,b,c, SUM(C) OVER (PARTITION BY null) C_Sum
from test

A B C C_SUM
1 1 1 17
1 2 2 17
1 3 3 17
2 2 5 17
3 4 6 17

 

求个人工资占部门工资的百分比

SQL> select * from salary;

NAME DEPT SAL
---------- ---- -----
a 10 2000
b 10 3000
c 10 5000
d 20 4000

SQL> select name,dept,sal,sal*100/sum(sal) over(partition by dept) percent from salary;

NAME DEPT SAL PERCENT
---------- ---- ----- ----------
a 10 2000 20
b 10 3000 30
c 10 5000 50
d 20 4000 100

二:开窗函数           
      开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化,举例如下:
1:     
   over(order by salary) 按照salary排序进行累计,order by是个默认的开窗函数
   over(partition by deptno)按照部门分区
2:
  over(order by salary range between 5 preceding and 5 following)
   每行对应的数据窗口是之前行幅度值不超过5,之后行幅度值不超过5
   例如:对于以下列
     aa
     1
     2
     2
     2
     3
     4
     5
     6
     7
     9
   
   sum(aa)over(order by aa range between 2 preceding and 2 following)
   得出的结果是
            AA                       SUM
            ---------------------- -------------------------------------------------------
            1                       10                                                      
            2                       14                                                      
            2                       14                                                      
            2                       14                                                      
            3                       18                                                      
            4                       18                                                      
            5                       22                                                      
            6                       18                                                                
            7                       22                                                                
            9                       9                                                                 
             
   就是说,对于aa=5的一行 ,sum为   5-1<=aa<=5+2 的和
   对于aa=2来说 ,sum=1+2+2+2+3+4=14     ;
   又如 对于aa=9 ,9-1<=aa<=9+2 只有9一个数,所以sum=9    ;
              
3:其它:
     over(order by salary rows between 2 preceding and 4 following)
          每行对应的数据窗口是之前2行,之后4行
4:下面三条语句等效:           
     over(order by salary rows between unbounded preceding and unbounded following)
          每行对应的数据窗口是从第一行到最后一行,等效:
     over(order by salary range between unbounded preceding and unbounded following)
           等效
     over(partition by null)
posted @ 2007-11-13 13:33 小小程序程序员混口饭吃 阅读(50004) | 评论 (13)编辑 收藏

由于一些原因,最近要复习一些东西,所以就把JMS的东西再复习一遍,以下便是例子

jms 中最重要的几个概念destination,ACKNOWLEDGE,subscribe,durable subscribe

destination:topic queque
  queue简单点说就是1:1 一个消息只能由一个consumer去消费,别的consumer来消费的时候已经没了,先到先得
topic简单点说就是1:N 一个消息可以由多个consumer来消费,谁来消费都有
 subscribe,拿topic来说如果当前订阅不是持久订阅,只有再订阅后生产者生产得消息才能被consumer得到,持久订阅只要没有被consumer消费,早晚会消费这个消息
 
 
 
 一下是几个例子
 
 queuesend:queque消息产生
 queuereceive:queque消息得消费
 topicsend :topic消息得产生
 topicreceive1:topic消息的非订阅
 topicrecieve2:topic消息的持久订阅
 
 这个例子实在WEBLOGIC814上测试过的,当然要定义JMSSERVER,FACTORY,DESTINATION。
 
 
 
 QueueSend
 
 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Hashtable;

import javax.jms.JMSException;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class QueueSend {
 // Defines the JNDI context factory.
 public final static String JNDI_FACTORY = "weblogic.jndi.WLInitialContextFactory";

 // Defines the JNDI provider url.
 public final static String PROVIDER_URL = " t3://localhost:7001";

 // Defines the JMS connection factory for the queue.
 public final static String JMS_FACTORY = "SendJMSFactory";

 // Defines the queue.
 public final static String QUEUE = "SendJMSQueue";

 private QueueConnectionFactory qconFactory;

 private QueueConnection qcon;

 private QueueSession qsession;

 private QueueSender qsender;

 private Queue queue;

 private TextMessage msg;

 /**
  * Creates all the necessary objects for sending messages to a JMS queue.
  *
  * @param ctx
  *            JNDI initial context
  * @param queueName
  *            name of queue
  * @exception NamingException
  *                if operation cannot be performed
  * @exception JMSException
  *                if JMS fails to initialize due to internal error
  */
 public void init(Context ctx, String queueName) throws NamingException,
   JMSException {
  qconFactory = (QueueConnectionFactory) ctx.lookup(JMS_FACTORY);
  qcon = qconFactory.createQueueConnection();
  qsession = qcon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
  queue = (Queue) ctx.lookup(queueName);
  qsender = qsession.createSender(queue);
  msg = qsession.createTextMessage();
  qcon.start();
 }

 /**
  * Sends a message to a JMS queue.
  *
  * @param message
  *            message to be sent
  * @exception JMSException
  *                if JMS fails to send message due to internal error
  */
 public void send(String message) throws JMSException {
  msg.setText(message);
  qsender.send(msg);
 }

 /**
  * Closes JMS objects.
  *
  * @exception JMSException
  *                if JMS fails to close objects due to internal error
  */
 public void close() throws JMSException {
  qsender.close();
  qsession.close();
  qcon.close();
 }

 /**
  * main() method.
  *
  * @param args
  *            WebLogic Server URL
  * @exception Exception
  *                if operation fails
  */
 public static void main(String[] args) throws Exception {
  try {
   InitialContext ic = getInitialContext();
   QueueSend qs = new QueueSend();
   qs.init(ic, QUEUE);
   readAndSend(qs);
   qs.close();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 private static void readAndSend(QueueSend qs) throws IOException,
   JMSException {
  BufferedReader msgStream = new BufferedReader(new InputStreamReader(
    System.in));
  String line = null;
  boolean quitNow = false;
  do {
   System.out.print("Enter message (\"quit\" to quit): ");
   line = msgStream.readLine();
   if (line != null && line.trim().length() != 0) {
    qs.send(line);
    System.out.println("JMS Message Sent: " + line + "\n");
    quitNow = line.equalsIgnoreCase("quit");
   }
  } while (!quitNow);

 }

 private static InitialContext getInitialContext() throws NamingException {
  Hashtable env = new Hashtable();
  env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
  env.put(Context.PROVIDER_URL, PROVIDER_URL);
  return new InitialContext(env);
 }

}


QueueReceive

import java.util.Hashtable;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueReceiver;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class QueueReceive implements MessageListener {
 // Defines the JNDI context factory.
 public final static String JNDI_FACTORY = "weblogic.jndi.WLInitialContextFactory";

 // Defines the JNDI provider url.
 public final static String PROVIDER_URL = " t3://localhost:7001";

 // Defines the JMS connection factory for the queue.
 public final static String JMS_FACTORY = "SendJMSFactory";

 // Defines the queue.
 public final static String QUEUE = "SendJMSQueue";

 private QueueConnectionFactory qconFactory;

 private QueueConnection qcon;

 private QueueSession qsession;

 private QueueReceiver qreceiver;

 private Queue queue;

 private boolean quit = false;

 /**
  * Message listener interface.
  *
  * @param msg
  *            message
  */
 public void onMessage(Message msg) {
  try {
   String msgText;
   if (msg instanceof TextMessage) {
    msgText = ((TextMessage) msg).getText();
   } else {
    msgText = msg.toString();
   }

   System.out.println("Message Received: " + msgText);

//   if (msgText.equalsIgnoreCase("123")) {
//    synchronized (this) {
//     quit = true;
//     this.notifyAll(); // Notify main thread to quit
//    }
//   }
  } catch (JMSException jmse) {
   jmse.printStackTrace();
  }
 }

 /**
  * Creates all the necessary objects for receiving messages from a JMS
  * queue.
  *
  * @param ctx
  *            JNDI initial context
  * @param queueName
  *            name of queue
  * @exception NamingException
  *                if operation cannot be performed
  * @exception JMSException
  *                if JMS fails to initialize due to internal error
  */
 public void init(Context ctx, String queueName) throws NamingException,
   JMSException {
  qconFactory = (QueueConnectionFactory) ctx.lookup(JMS_FACTORY);
  qcon = qconFactory.createQueueConnection();
  qsession = qcon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
  queue = (Queue) ctx.lookup(queueName);
  qreceiver = qsession.createReceiver(queue);
  qreceiver.setMessageListener(this);
  qcon.start();
 }

 /**
  * Closes JMS objects.
  *
  * @exception JMSException
  *                if JMS fails to close objects due to internal error
  */
 public void close() throws JMSException {
  qreceiver.close();
  qsession.close();
  qcon.close();
 }

 /**
  * main() method.
  *
  * @param args
  *            WebLogic Server URL
  * @exception Exception
  *                if execution fails
  */

 public static void main(String[] args) throws Exception {

  InitialContext ic = getInitialContext();
  QueueReceive qr = new QueueReceive();
  qr.init(ic, QUEUE);

  System.out
    .println("JMS Ready To Receive Messages (To quit, send a \"quit\" message).");

  // Wait until a "quit" message has been received.
  synchronized (qr) {
   System.out.println("111111111111");
   while (!qr.quit) {
    try {
     System.out.println("2222222222");
     qr.wait();
     System.out.println("333333333");
    } catch (InterruptedException ie) {
    }
   }
  }
  qr.close();
 }

 private static InitialContext getInitialContext() throws NamingException {
  Hashtable env = new Hashtable();
  env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
  env.put(Context.PROVIDER_URL, PROVIDER_URL);
  return new InitialContext(env);
 }

}

 

TopicSend

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Hashtable;

import javax.jms.JMSException;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicSession;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.jms.TopicPublisher;
public class TopicSend {
 // Defines the JNDI context factory.
 public final static String JNDI_FACTORY = "weblogic.jndi.WLInitialContextFactory";

 // Defines the JNDI provider url.
 public final static String PROVIDER_URL = " t3://localhost:7001";

 // Defines the JMS connection factory for the queue.
 public final static String JMS_FACTORY = "SendJMSFactory";

 // Defines the queue.
 public final static String TOPIC = "SendJMSTopic";

 private TopicConnectionFactory tconFactory;

 private TopicConnection tcon;

 private TopicSession tsession;

 private TopicPublisher tsender;

 private Topic topic;

 private TextMessage msg;
 public static InitialContext ic ;

 /**
  * Creates all the necessary objects for sending messages to a JMS queue.
  *
  * @param ctx
  *            JNDI initial context
  * @param queueName
  *            name of queue
  * @exception NamingException
  *                if operation cannot be performed
  * @exception JMSException
  *                if JMS fails to initialize due to internal error
  */
 public void init(Context ctx, String queueName) throws NamingException,
   JMSException {
  tconFactory = (TopicConnectionFactory) ctx.lookup(JMS_FACTORY);
  tcon = tconFactory.createTopicConnection();
  tsession = tcon.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
  System.out.println(topic);
  topic = (Topic) ctx.lookup(queueName);
  System.out.println(topic);
  tsender = tsession.createPublisher(topic);
  msg = tsession.createTextMessage();
  tcon.start();
 }

 /**
  * Sends a message to a JMS queue.
  *
  * @param message
  *            message to be sent
  * @exception JMSException
  *                if JMS fails to send message due to internal error
  */
 public void send(String message) throws JMSException ,NamingException{
  System.out.println(topic+"-----------");
  msg.setText(message);
  tsender.publish(msg);
 }

 /**
  * Closes JMS objects.
  *
  * @exception JMSException
  *                if JMS fails to close objects due to internal error
  */
 public void close() throws JMSException {
  tsender.close();
  tsession.close();
  tcon.close();
 }

 /**
  * main() method.
  *
  * @param args
  *            WebLogic Server URL
  * @exception Exception
  *                if operation fails
  */
 public static void main(String[] args) throws Exception {
  try {
   ic= getInitialContext();
   TopicSend ts = new TopicSend();
   ts.init(ic, TOPIC);
   readAndSend(ts);
   ts.close();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 private static void readAndSend(TopicSend ts) throws IOException,
   JMSException,NamingException {
  BufferedReader msgStream = new BufferedReader(new InputStreamReader(
    System.in));
  String line = null;
  boolean quitNow = false;
  do {
   System.out.print("Enter message (\"quit\" to quit): ");
   line = msgStream.readLine();
   if (line != null && line.trim().length() != 0) {
    ts.send(line);
   
    System.out.println("JMS Message Sent: " + line + "\n");
    quitNow = line.equalsIgnoreCase("quit");
   }
  } while (!quitNow);

 }

 private static InitialContext getInitialContext() throws NamingException {
  Hashtable env = new Hashtable();
  env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
  env.put(Context.PROVIDER_URL, PROVIDER_URL);
  return new InitialContext(env);
 }

}

 

TopicReceive1

import java.util.Hashtable;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicSession;
import javax.jms.TopicSubscriber;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;


public class TopicReceive1 implements MessageListener {
 // Defines the JNDI context factory.
 public final static String JNDI_FACTORY = "weblogic.jndi.WLInitialContextFactory";

 // Defines the JNDI provider url.
 public final static String PROVIDER_URL = " t3://localhost:7001";

 // Defines the JMS connection factory for the queue.
 public final static String JMS_FACTORY = "SendJMSFactory";

 // Defines the queue.
 public final static String TOPIC = "SendJMSTopic";

 private TopicConnectionFactory tconFactory;

 private TopicConnection tcon;

 private TopicSession tsession;

 private TopicSubscriber tsubscriber;

 private Topic topic;

 private boolean quit = false;

 /**
  * Message listener interface.
  *
  * @param msg
  *            message
  */
 public void onMessage(Message msg) {
  System.out.println("===================");
  try {
   String msgText;
   if (msg instanceof TextMessage) {
    msgText = ((TextMessage) msg).getText();
   } else {
    msgText = msg.toString();
   }

   System.out.println("Message Received: " + msgText);

//   if (msgText.equalsIgnoreCase("123")) {
//    synchronized (this) {
//     quit = true;
//     this.notifyAll(); // Notify main thread to quit
//    }
//   }
  } catch (JMSException jmse) {
   jmse.printStackTrace();
  }
 }

 /**
  * Creates all the necessary objects for receiving messages from a JMS
  * queue.
  *
  * @param ctx
  *            JNDI initial context
  * @param queueName
  *            name of queue
  * @exception NamingException
  *                if operation cannot be performed
  * @exception JMSException
  *                if JMS fails to initialize due to internal error
  */
 public void init(Context ctx, String queueName) throws NamingException,
   JMSException {
  tconFactory = (TopicConnectionFactory) ctx.lookup(JMS_FACTORY);
  tcon = tconFactory.createTopicConnection();
  tsession = tcon.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
  topic = (Topic) ctx.lookup(queueName);
  tsubscriber = tsession.createSubscriber(topic);
  //System.out.println("12");
  //Message msg = treceiver.receive();
  //msg.acknowledge();
  //tsubscriber = tsession.createSubscriber(topic);Message msg = tsubscriber.receive();msg.acknowledge();
  //System.out.println(msg);
  tsubscriber.setMessageListener(this);
  tcon.start();
 }

 /**
  * Closes JMS objects.
  *
  * @exception JMSException
  *                if JMS fails to close objects due to internal error
  */
 public void close() throws JMSException {
  tsubscriber.close();
  tsession.close();
  tcon.close();
 }

 /**
  * main() method.
  *
  * @param args
  *            WebLogic Server URL
  * @exception Exception
  *                if execution fails
  */

 public static void main(String[] args) throws Exception {

  InitialContext ic = getInitialContext();
  TopicReceive1 tr1 = new TopicReceive1();
  tr1.init(ic, TOPIC);

  System.out
    .println("JMS Ready To Receive Messages (To quit, send a \"quit\" message).");
  
  

  // Wait until a "quit" message has been received.
//  synchronized (tr1) {
//   System.out.println("111111111111");
//   while (!tr1.quit) {
//    try {
//     System.out.println("2222222222");
//     tr1.wait();
//     System.out.println("333333333");
//    } catch (InterruptedException ie) {
//    }
//   }
//  }
  tr1.close();
 }

 private static InitialContext getInitialContext() throws NamingException {
  Hashtable env = new Hashtable();
  env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
  env.put(Context.PROVIDER_URL, PROVIDER_URL);
  return new InitialContext(env);
 }

}


TopicReceive2


import java.util.Hashtable;

import javax.jms.JMSException;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicSession;
import javax.jms.TopicSubscriber;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;


public class TopicReceive2 {
 // Defines the JNDI context factory.
 public final static String JNDI_FACTORY = "weblogic.jndi.WLInitialContextFactory";

 // Defines the JNDI provider url.
 public final static String PROVIDER_URL = " t3://localhost:7001";

 // Defines the JMS connection factory for the queue.
 public final static String JMS_FACTORY = "SendJMSFactory";

 // Defines the queue.
 public final static String TOPIC = "SendJMSTopic";

 private TopicConnectionFactory tconFactory;

 private TopicConnection tcon;

 private TopicSession tsession;

 private TopicSubscriber tsubscriber;

 private Topic topic;

 private boolean quit = false;


 /**
  * Creates all the necessary objects for receiving messages from a JMS
  * queue.
  *
  * @param ctx
  *            JNDI initial context
  * @param queueName
  *            name of queue
  * @exception NamingException
  *                if operation cannot be performed
  * @exception JMSException
  *                if JMS fails to initialize due to internal error
  */
 public void init(Context ctx, String queueName) throws NamingException,
   JMSException,InterruptedException {
  tconFactory = (TopicConnectionFactory) ctx.lookup(JMS_FACTORY);
  tcon = tconFactory.createTopicConnection();
  tcon.setClientID("IP10.200.7.104");
  tcon.start();
  
  tsession = tcon.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
  System.out.println("333333333333");
  topic = (Topic) ctx.lookup(queueName);
  //tsubscriber = tsession.createSubscriber(topic);
  tsubscriber= tsession.createDurableSubscriber(topic,"88888");
   for (int i=0; i<3; i++) {
             //
             TextMessage message = (TextMessage) tsubscriber.receive();
             System.out.println("message["+i+"]: " + message.getText());
         }
          Thread.sleep(10000);
  //System.out.println("12");
  //Message msg = treceiver.receive();
  //msg.acknowledge();
  //tsubscriber = tsession.createSubscriber(topic);Message msg = tsubscriber.receive();msg.acknowledge();
  //System.out.println(msg);

 }

 /**
  * Closes JMS objects.
  *
  * @exception JMSException
  *                if JMS fails to close objects due to internal error
  */
 public void close() throws JMSException {
  tsubscriber.close();
  tsession.close();
  tcon.close();
 }

 /**
  * main() method.
  *
  * @param args
  *            WebLogic Server URL
  * @exception Exception
  *                if execution fails
  */

 public static void main(String[] args) throws Exception {

  InitialContext ic = getInitialContext();
  TopicReceive2 tr2 = new TopicReceive2();
  tr2.init(ic, TOPIC);

  System.out
    .println("JMS Ready To Receive Messages (To quit, send a \"quit\" message).");
  
  

  // Wait until a "quit" message has been received.
//  synchronized (tr1) {
//   System.out.println("111111111111");
//   while (!tr1.quit) {
//    try {
//     System.out.println("2222222222");
//     tr1.wait();
//     System.out.println("333333333");
//    } catch (InterruptedException ie) {
//    }
//   }
//  }
  tr2.close();
 }

 private static InitialContext getInitialContext() throws NamingException {
  Hashtable env = new Hashtable();
  env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
  env.put(Context.PROVIDER_URL, PROVIDER_URL);
  return new InitialContext(env);
 }

}

posted @ 2007-08-15 09:20 小小程序程序员混口饭吃 阅读(1155) | 评论 (0)编辑 收藏

一、rpm包安装方式步骤:
引用:

1、找到相应的软件包,比如soft.version.rpm,下载到本机某个目录;

2、打开一个终端,su -成root用户;

3、cd soft.version.rpm所在的目录;

4、输入rpm -ivh soft.version.rpm




二、deb包安装方式步骤:

引用:
1、找到相应的软件包,比如soft.version.deb,下载到本机某个目录;

2、打开一个终端,su -成root用户;

3、cd soft.version.deb所在的目录;

4、输入dpkg -i soft.version.deb




三、tar.gz源代码包安装方式:

引用:
1、找到相应的软件包,比如soft.tar.gz,下载到本机某个目录;

2、打开一个终端,su -成root用户;

3、cd soft.tar.gz所在的目录;

4、tar -xzvf soft.tar.gz //一般会生成一个soft目录

5、cd soft

6、./configure

7、make

8、make install




四、tar.bz2源代码包安装方式:

引用:
1、找到相应的软件包,比如soft.tar.bz2,下载到本机某个目录;

2、打开一个终端,su -成root用户;

3、cd soft.tar.bz2所在的目录;

4、tar -xjvf soft.tar.bz2 //一般会生成一个soft目录

5、cd soft

6、./configure

7、make

8、make install




五、apt方式安装:

引用:
1、打开一个终端,su -成root用户;

2、apt-cache search soft 注:soft是你要找的软件的名称或相关信息

3、如果2中找到了软件soft.version,则用apt-get install soft.version命令安装软件 注:只要你可以上网,只需要用apt-cache search查找软件,用apt-get install软件




六、bin文件安装:

如果你下载到的软件名是soft.bin,一般情况下是个可执行文件,安装方法如下:

引用:
1、打开一个终端,su -成root用户;

2、chmod +x soft.bin

3、./soft.bin //运行这个命令就可以安装软件了




七、不需要安装的软件:

有了些软件,比如lumaqq,是不需要安装的,自带jre解压缩后可直接运行。假设下载的是lumaqq.tar.gz,使用方法如下:

引用:
1、打开一个终端,su -成root用户;

2、tar -xzvf lumaqq.tar.gz //这一步会生成一个叫LumaQQ的目录

3、cd LumaQQ

4、chmod +x lumaqq //设置lumaqq这个程序文件为可运行

5、此时就可以运行lumaqq了,用命令./lumaqq即可,但每次运行要输入全路径或切换到刚才生成的LumaQQ目录里

6、为了保证不设置路径就可以用,你可以在/bin目录下建立一个lumaqq的链接,用命令ln -s lumaqq /bin/ 即可,以后任何时候打开一个终端输入lumaqq就可以启动QQ聊天软件了

7、如果你要想lumaqq有个菜单项,使用菜单编辑工具,比如Alacarte Menu Editor,找到上面生成的LumaQQ目录里的lumaqq设置一个菜单项就可以了,当然你也可以直接到 /usr/share/applications目录,按照里面其它*.desktop文件的格式生成一个自己的desktop文件即可。

posted @ 2007-08-10 09:39 小小程序程序员混口饭吃 阅读(602) | 评论 (0)编辑 收藏

计划任务工具 cron 的配置和说明

作者:北南南北
来自:LinuxSir.Org
摘要:Linux操作系统中,计划任务通常由cron来承担,了解或掌握cron,能为我们管理服务器带来更多的便利,也能省却更多的时间。本文也举了一些简单明了的例子,为了让新手上路方便;

目录


++++++++++++++++++++++++++++++++++++++
正文
++++++++++++++++++++++++++++++++++++++


1、计划任务概说;

计划任务,是任务在约定的时间执行已经计划好的工作,这是表面的意思。在Linux中,我们经常用到 crond 服务器来完成这项工作。cron服务器可以根据配置文件约定的时间来执行特定的作务。比如我们可以在配置文件中约定每天早上4点,对httpd 服务器重新启动,这就是一个计划任务;

下面我们先来说说cron;


2、cron;

在Linux系统中,计划任务一般是由cron承担,我们可以把cron设置为开机时自动启动。cron启动后,它会读取它的所有配置文件(全局性配置文件/etc/crontab,以及每个用户的计划任务配置文件),然后cron会根据命令和执行时间来按时来调用度工作任务。


2.1 cron 的安装和启动;

在一般情况下,cron都是系统默认安装的,我们要学会查看软件包是否已经安装;


2.1.1 在Redhat 或 Fedora等RPM包管理的系统的安装;

判断系统是否已经安装cron相关的包

Fedora 5.0 系统的情况;

其它版本的Fedora及Redhat的系统和这相似;

[root@localhost ~]# rpm -qa |grep cron
vixie-cron-4.1-54.FC5
anacron-2.3-36.1
crontabs-1.10-7.1

 

其中vixie-cron软件包是cron的主程序,您可以通过下面的命令来了解它,其它软件包同理;

[root@localhost beinan]# rpm -ql vixie-cron

 

crontabs 软件包是用来安装、卸装、或列举用来驱动 cron 守护进程的表格的程序。cron 守护进程检查 crontab 文件来查看某个指定命令被调度执行的时间。如果命令已经调度,守护进程就会执行它们。了解crontabs软件包都安装了些什么,应该用下面的命令;

[root@localhost beinan]# rpm -ql crontabs

 

如果没有安装,可以从光盘中找出文件名带有cron字样的软件包来安装。

[root@localhost ~]# rpm -ivh vixie-cron-4.1-54.FC5*
[root@localhost ~]# rpm -ivh crontabs*

 

也可以用yum 来在线安装;

[root@localhost ~]# yum install vixie-cron
[root@localhost ~]# yum install crontabs

 


2.1.2 在Slackware系统中的安装;

在Slackware中cron软件包是 dcron,您可以在光盘中找出来安装它;

查看是否已经安装了dcron软件包,您可以这样查看。在这里能列出软件包详细的安装情况;

[root@localhost ~]# more /var/adm/packages/dcron*

 

如果没有安装,请用下面的命令来安装。在第一张安装盘中找出dcron软件包;

[root@localhost ~]# installpkg dcron*.tgz

 


2.1.3 cron 的开启、停止、重新启动方法;

cron配置文件被修改后,想让新文件生效,必须重新crond服务器,有两种方法可供选择;


第一种 在Fedora或Redhat 等以RPM包管理的系统中;

[root@localhost ~]# /etc/init.d/crond start
[root@localhost ~]# /etc/init.d/crond stop
[root@localhost ~]# /etc/init.d/crond restart

 

如果想在Fedora 和 Redhat 或以这些发行版为基础克隆的发行版,如果想自动开机运行,请用下面的办法;

[root@localhost ~]# chkconfig --levels 35 crond on

 

第二种:通用

[root@localhost ~]# pgrep crond 注:判断crond 是否在运行;
[root@localhost ~]# pkill crond 注:杀掉正在运行中的crond;
[root@localhost ~]# pgrep crond 注:查看是否被杀掉了;
[root@localhost ~]# /usr/sbin/crond 注:运行crond;

 


2.2 cron 配置文件;

cron 是一个服务器程序,我们都知道Linux的服务器的配置,大多是通过配置文件来完成的,cron自然也不例外,在Redhat/Fedora 等系统中它的全局性配置文件是/etc/crontab;在Slackware系统中,全局性文件是/var/spool/cron/crontabs/root 。每个用户也有自己的cron配置文件,我们可以通过crontab -e 来编辑它;


2.2.1 全局性配置文件;

下面是一个全局性的配置文件例子,以Fedora Core 5为例;

[root@localhost ~]# more /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
1 * * * * root run-parts /etc/cron.hourly
#
2 4 * * * root run-parts /etc/cron.daily
#
22 4 * * 7 root run-parts /etc/cron.weekly
#
42 4 1 * * root run-parts /etc/cron.monthly
#
0,5,10,15,20,25,30,35,40,45,50,55 * * * * root /usr/bin/mrtg /etc/mrtg/mrtg.cfg

 

对于全局性配置文件,我们要用root权限来更改,一般是通过crontab -e 来修改。但有时也并不一定是这样的,比如Fedora Core 5 如果通过crontab -e 修改的是root用户的cron 配置文件。所以我们要在Fedora Core 5中修改全局性配置文件可以用vi 编辑器来修改。vi的用法请参考:《文件编辑器 vi》

在全局性配置文件中,定义了可执行命令的路径环境变量,所用SHELL类型的定义等,这些大多不用修改;我们经常添加的是计划任务或修改任务执行的时间等;

在全局性配置文件中,我们发现有类似这些行;

1 * * * * root run-parts /etc/cron.hourly 注:表示每个小时的第一分钟,开始执行/etc/hourly目录下的可执行程序或脚本;
2 4 * * * root run-parts /etc/cron.daily 注:表示每天的4点2分,开始执行/etc/cron.daily目录下的可执行程序或脚本;
22 4 * * 7 root run-parts /etc/cron.weekly 注:每年第7个周4点我22分,开始执行 /etc/cron.weekly目录下的可执行程序或脚本;
42 4 1 * * root run-parts /etc/cron.monthly 注:每月第1天的4点42分,开始执行/etc/cron.monthly目录下的可执行程序或脚本;

 

这些行是用来在同一时间批量执行任务的,我们在以后的例子中独立出来解说,在这里只是让大家心中有数;


2.2.2 cron 配置计划任务的书写格式

分钟 小时 日 月 周 [用户名] 命令

 

说明:

第一段应该定义的是:分钟,表示每个小时的第几分钟来执行。范围是从0-59
        第二段应该定义的是:小时,表示从第几个小时来执行,范围是从0-23
        第三段应该定义的是:日期,表示从每个月的第几天执行,范围从1-31
        第四段应该定义的是:月,表示每年的第几个月来执行,范围从1-12
        第五段应该定义的是:周,表示每周的第几天执行,范围从0-6,其中 0表示星期日。
        每六段应该定义的是:用户名,也就是执行程序要通过哪个用户来执行,这个一般可以省略;
        第七段应该定义的是:执行的命令和参数。
        

注:其中用户名可是省略,用户名定义的是程序用哪个用户来执行,比如mysql服务器,我们可以定义成以mysql用户来启动、停止、重新启动,这时要写上用户名;不过对于cron来说意义不是太大,因为每个用户都有自己的cron配置文件。有些程序的启动必须用到root用户,这时我们就可以修改root用户的cron配置文件就行了。在每个用户的配置文件中,不必指定用户名。

我们可以把计划任务写在全局性配置文件中,如果您想把一个计划放入全局性配置文件中,就得改发行版所对应的cron全局配置文件,比如Fedora 5的全局性配置文件是/etc/crontab文件;

每个用户也能定义自己的cron配置文件,用crontab -e 命令来定义;

举一例:让机器在每天8点30分重新启动;

关于时间格式中有7个字段。我们可以直接更改或者添加,当然这是系统任务调用。举个例子,比如我在每天的早上8点30分重新启动机器,就可以在
/etc/crontab中加入下面的两句,第一句就是注释了。以#号开始,后面写一个自己能知道这是什么任务的备注;

# reboot OS
30 8 * * * root /sbin/reboot

 

第一段应该定义的是:分钟,表示每个小时的第几分钟来执行。范围是从0-59
第二段应该定义的是:小时,表示从第几个小时来执行,范围是从0-23
第三段应该定义的是:日期,表示从每个月的第几天执行,范围从1-31
第四段应该定义的是:月,表示每年的第几个月来执行,范围从1-12
第五段应该定义的是:周,表示每周的第几天执行,范围从0-6,其中 0表示星期日。
每六段应该定义的是:用户名,也就是执行程序要通过哪个用户来执行,这个一般可以省略;
第七段应该定义的是:执行的命令和参数。

对比上面的例子就知道,30是不是分钟??8是不是小时?如果有*代表的地方,表示全部,也就是说,每个月,每天,每星期都要执行。root 表示用root用户执行,命令是/sbin/reboot ,也就是说,系统在每天 8点30分重新启动;

我们可以把每天8点30分重新启动的计划任务写入cron全局性配置文件中,也可以定义在root用户自己的cron配置文件中。如果定义在root自己的配置文件,请用root身份来执行 crontab -e 来修改配置文件;crontab -e 进入修改配置文件的过程,其实和vi的用法一样,请参看vi 的用法:《文件编辑器 vi》

让配置文件生效:如果让配置文件生效,还得重新启动cron,切记,既然每个用户下的cron配置文件修改后。也要重新启动cron服务器。

在Fedora 和Redhat中,我们应该用;

[root@localhost ~]# /etc/init.d/crond restart

 

如果让crond 在开机时运行,应该改变其运行级别;

[root@localhost ~]# chkconfig --levels 35 crond on

 

在Slackware中,如果开机自动运行;

查看/etc/rc.d/rc.M文件是否有如的行,如果没有就加上,大多是有的;

# Start crond (Dillon's crond):
if [ -x /usr/sbin/crond ]; then
  /usr/sbin/crond -l10 >>/var/log/cron 2>&1
</cdoe>
<b>
如果想让立即让cron重启生效,也可以用下面的办法;
</b>
<code>
[root@localhost ~]# pgrep crond 注:查看crond服务器是否运行;
2022
[root@localhost ~]# pkill crond 注:杀死crond;
[root@localhost ~]# pgrep crond 注:查看crond是否退出;
[root@localhost ~]# /usr/sbin/crond 注:启动crond;
[root@localhost ~]# pgrep crond 注:查看crond 是否已经运行得起来了;
3883

 


2.2.3 关于同一时间,同时执行多个任务的定义方法;

我们在前面已经说过,在全局性配置文件中,有类似如下的段落;

1 * * * * root run-parts /etc/cron.hourly 注:表示每个小时的第一分钟,开始执行/etc/hourly目录下的可执行程序或脚本;
2 4 * * * root run-parts /etc/cron.daily 注:表示每天的4点2分,开始执行/etc/cron.daily目录下的可执行程序或脚本;
22 4 * * 7 root run-parts /etc/cron.weekly 注:每年第7个周4点我22分,开始执行 /etc/cron.weekly目录下的可执行程序或脚本;
42 4 1 * * root run-parts /etc/cron.monthly 注:每月第1天的4点42分,开始执行/etc/cron.monthly目录下的可执行程序或脚本;

 

举例来说,我想在每天5点10分来重新启动httpd 服务器,与此同时,我们也可以同时下载一个ISO文件。如果我们按书写计划任务的规则一条一条的来书写,并添加到全局是有点麻烦。不如写一个脚本放在/etc/crond.daily目录中。然后把其权限设置为755 (关于权限的设置,请参考:《Linux 文件和目录的属性》)。

当然我们得改一改上面的 带有/etc/cron.daily那行,改为如下;

10 5 * * * root run-parts /etc/cron.daily
</cdoe>
然后我们到/etc/crond.daily目录中创建两个文件,一个是用来重启httpd服务器的,如下;
<code>
[root@localhost cron.daily]# touch httpd.sh
[root@localhost cron.daily]# chmod 755 httpd.sh
[root@localhost cron.daily]# echo "/etc/init.d/httpd restart" > httpd.sh
[root@localhost cron.daily]# more httpd.sh
/etc/init.d/httpd restart

 

如果我想在每天5点20分下载FC5的镜像,可以再创建一个文件fc5down.sh

[root@localhost cron.daily]# touch fc5down.sh
[root@localhost cron.daily]# chmod 755 fc5down.sh
[root@localhost cron.daily]# echo "/usr/bin/wget http://mirrors.kernel.org/fedora/core/5/i386/iso/FC-5-i386-DVD.iso" > fc5down.sh
[root@localhost cron.daily]# more fc5down.sh
/usr/bin/wget http://mirrors.kernel.org/fedora/core/5/i386/iso/FC-5-i386-DVD.iso

 

然后我们重新启动一下crond就行了;

[root@localhost cron.daily]# pkill crond
[root@localhost cron.daily]# prep crond
[root@localhost cron.daily]# crond&

 

注意:我只是想说明一下,在同一时间 执行多个计划任务的简单用法,并不是有意教给您每天早上都下载FC5的映像。我举这个例子是为了初学者了解这个功能。如果您有好多的任务在某一时刻执行,那就自己写脚本文件。放在/etc目录下的cron.hourly 、cron.daily 、cron.weekly 、cron.monthly 目录中。凡是放进这些目录的可执行脚本,都能在约定的时间内准确执行。每个目录有每个目录的用途;


2.2.4 对于用户自身的cron 配置文件的说明;

每个用户都有自己的cron配置文件,通过crontab -e 就可以编辑,一般的情况下,在Fedora和Redhat的发行版,我们编辑好用户的cron配置文件保存退出后,系统会自动就存放于/var/spool/cron/目录中,文件以用户名命名。在Slackware中是位于/var/spool/cron/crontabs/目录中。其它的发行版都差不多,有点类似。自己找找吧;查看用户的计划任务是crontab -l

crontab -e 注:编辑用户的cron配置文件;
crontab -l 注:查看用户的计划任务;

 

比如我用beinan用户来运行crontab -e ;

[beinan@localhost ~]$ id 注:判断所用用户身份;
uid=500(beinan) gid=500(beinan) groups=500(beinan)
[beinan@localhost ~]$ crontab -e 注:编辑用户beinan的计划任务;

 

我们在里面定义一个任务;

40 20 * * * /usr/bin/wget http://mirrors.kernel.org/fedora/core/5/i386/iso/FC-5-i386-DVD.iso

 

保存退出后,我们用下面的命令来查看beinan用户的计划任务;

[beinan@localhost ~]$ crontab -l
40 20 * * * /usr/bin/wget http://mirrors.kernel.org/fedora/core/5/i386/iso/FC-5-i386-DVD.iso

 

配置好后,我们还要重新启动crond服务器,每个用户cron配置文件的改动都得重新启动crond服务器;前面已经说过了,这里省略;值得注意的是重启crond服务器,需要root权限,您可以用su命令切换到root 用户,然后再来重启crond;


在Fedora或Redhat等以RPM包管理的发行版中;

[beinan@localhost ~]$ su
口令:
[root@localhost beinan]# /etc/init.d/crond restart
停止 crond: [确定]
启动 crond: [确定]

 


也可以先杀死crond,再运行crond命令的办法来启动;

[root@localhost beinan]# pkill crond
[root@localhost beinan]# pgrep crond
[root@localhost beinan]# /usr/sbin/crond
[root@localhost beinan]# pgrep crond
6664

 


3、计划任务的应用范围;

计划任务主要是让系统自动完成一些工作。比如我们可以让系统自动在某一时刻清理或备份httpd服务器的日志,然后重新启动httpd服务器,这对网络管理员来说是很重要的。也可以让系统自动清空位于/tmp目录的垃圾文件。

另外值得一提的是,LinuxSir.Org 有很多子站,每个子站都有RSS,能让这些站点的RSS相互投递,也是用cron来完成,比如是在早上4点左右开始执行这个任务。这是一个极为耗费资源的过程,如果不是放在在线人少的时候,基本无法完成,所以只能放在早上进行。作为SIR的管理员,不可能每天早上4点起来点鼠标来完成这些事吧。所以最好的办法就是通过cron来自动运行,以在服务器最清闲的时候来完成这项工作;

posted @ 2007-07-24 11:14 小小程序程序员混口饭吃 阅读(918) | 评论 (0)编辑 收藏
分辨率设置高了X起来后花屏,无法通过X界面恢复回去,只能用普通用户进来后,su 到root上来找到XORG.CONF   文件

修改/etc/X11/xorg.conf 

screen里面的设置最大的那个去掉就好了,重启就可以了
posted @ 2007-07-24 09:19 小小程序程序员混口饭吃 阅读(2579) | 评论 (2)编辑 收藏

一、注销,关机,重启

  注销系统的logout命令

  1,Logout 注销是登陆的相对操作,登陆系统后,若要离开系统,用户只要直接下达logout命令即可:

  [root@localhost root]#logout

  Red Hat Linuxrelease 9(Shike)

  Kernel 2.4.20.8 on an i686

  Login: ← 回到登陆的画面

  2,关机或重新启动的shutdown命令

  Shutdown命令可以关闭所有程序,依照用户的需要,重新启动或关机。

  参数说明如下:

   立即关机:-h 参数让系统立即关机。范例如下:

  [root@localhost root]#shutdown –h now ← 要求系统立即关机

   指定关机时间:time参数可指定关机的时间;或设置多久时间后运行shutdown命令,范例如下:

  [root@localhost root]#shutdown now ← 立刻关机

  [root@localhost root]#shutdown +5 ← 5分钟后关机

  [root@localhost root]#shutdown 10:30 ← 在10:30时关机

   关机后自动重启:-r 参数设置关机后重新启动。范例如下:

  [root@localhost root]#shutdown -r now ← 立刻关闭系统并重启

  [root@localhost root]#shutdown -r 23:59 ← 指定在23:59时重启动

  3,重新启动计算机的reboot命令

  顾名思义,reboot命令是用来重新启动系统的。常用的参数如下:

   -f 参数:不依正常的程序运行关机,直接关闭系统并重新启动计算机。

   -I 参数:在在重新启动之前关闭所有网络接口。

  虽然reboot命令有个参数可以使用,但是一般只需要单独运行reboot命令就可以了

posted @ 2007-07-17 13:27 小小程序程序员混口饭吃 阅读(16068) | 评论 (0)编辑 收藏
 

最近测试OMADM1.2的时候,039040两个case是关于TLS SSL的,搞的很迷惑,最近看了一下原来TLS几乎就是SSL,基本上一摸一样而已。

Sun.com上面看到

SSL was developed by Netscape in 1994, and with input from the Internet community, has evolved to become a standard. It is now under the control of the international standards organization, the Internet Engineering Task Force (IETF). The IETF has renamed SSL to Transport Layer Security (TLS), and released the first specification, version 1.0, in January 1999. TLS 1.0 is a modest upgrade to the most recent version of SSL, version 3.0. The differences between SSL 3.0 and TLS 1.0 are minor.

 

所以这2case基本上测试一个就足够了。

另外tls本来就是传输层上的一个协议,所以要是用HTTPS的话,如果你用应用服务器,比如TOMCAT WBLOGIC,他们都支持SSL,根本不需要程序实现任何东西,只要你会使用keytool生成证书就可以了。

 

这块只是牵扯到JSSE,具体可以到http://java.sun.com/j2se/1.4.2/docs/guide/security/jsse/JSSERefGuide.html#Introduction

Keytool其实再JRE/LIB/SECUTITY下面的包里面,

C:\j2sdk1.4.2_05\jre\lib\security>keytool

keytool 用法:

 

-certreq     [-v] [-alias <alias>] [-sigalg <sigalg>]

             [-file <csr_file>] [-keypass <keypass>]

             [-keystore <keystore>] [-storepass <storepass>]

             [-storetype <storetype>] [-provider <provider_class_name>] ...

 

-delete      [-v] -alias <alias>

             [-keystore <keystore>] [-storepass <storepass>]

             [-storetype <storetype>] [-provider <provider_class_name>] ...

 

-export      [-v] [-rfc] [-alias <alias>] [-file <cert_file>]

             [-keystore <keystore>] [-storepass <storepass>]

             [-storetype <storetype>] [-provider <provider_class_name>] ...

 

-genkey      [-v] [-alias <alias>] [-keyalg <keyalg>]

             [-keysize <keysize>] [-sigalg <sigalg>]

             [-dname <dname>] [-validity <valDays>]

             [-keypass <keypass>] [-keystore <keystore>]

             [-storepass <storepass>] [-storetype <storetype>]

             [-provider <provider_class_name>] ...

 

-help

 

-identitydb [-v] [-file <idb_file>] [-keystore <keystore>]

             [-storepass <storepass>] [-storetype <storetype>]

             [-provider <provider_class_name>] ...

 

-import      [-v] [-noprompt] [-trustcacerts] [-alias <alias>]

             [-file <cert_file>] [-keypass <keypass>]

             [-keystore <keystore>] [-storepass <storepass>]

             [-storetype <storetype>] [-provider <provider_class_name>] ...

 

-keyclone    [-v] [-alias <alias>] -dest <dest_alias>

             [-keypass <keypass>] [-new <new_keypass>]

             [-keystore <keystore>] [-storepass <storepass>]

             [-storetype <storetype>] [-provider <provider_class_name>] ...

 

-keypasswd   [-v] [-alias <alias>]

             [-keypass <old_keypass>] [-new <new_keypass>]

             [-keystore <keystore>] [-storepass <storepass>]

             [-storetype <storetype>] [-provider <provider_class_name>] ...

 

-list        [-v | -rfc] [-alias <alias>]

             [-keystore <keystore>] [-storepass <storepass>]

             [-storetype <storetype>] [-provider <provider_class_name>] ...

 

-printcert   [-v] [-file <cert_file>]

 

-selfcert    [-v] [-alias <alias>] [-sigalg <sigalg>]

             [-dname <dname>] [-validity <valDays>]

             [-keypass <keypass>] [-keystore <keystore>]

             [-storepass <storepass>] [-storetype <storetype>]

             [-provider <provider_class_name>] ...

 

-storepasswd [-v] [-new <new_storepass>]

             [-keystore <keystore>] [-storepass <storepass>]

             [-storetype <storetype>] [-provider <provider_class_name>] ...

 

 

1:生成一个

C:\j2sdk1.4.2_05\jre\lib\security>keytool -genkey -alias duke -keyalg RSA   -val

idity 10 -storetype jks -keystore trust1.jks

2:查看你刚才生成的证书

C:\j2sdk1.4.2_05\jre\lib\security>keytool -list -v -keystore trust1.jks

当然要输入密码了。

但是我不太明白服务器需要2个证书1个是custom identity keystore 一个是custom trust keystore为什么2 的输入类型不一样,一个是KeyEntry另外一个是trustedCertEntry,这个流程到底是怎样的?申请证书->导入证书 还是不明白,请指教。

posted @ 2007-07-04 17:43 小小程序程序员混口饭吃 阅读(1971) | 评论 (1)编辑 收藏
     摘要: 最近复习了一下AXIS,写了2个小例子1:  bean  1package test.soap.vo; 2 3import java.io.Serializable; 4 5public class User implements Serializable {&nbs...  阅读全文
posted @ 2007-06-15 15:48 小小程序程序员混口饭吃| 编辑 收藏

Java对象序列化学习笔记- -

                                      

beejoy 原创  来源:java研究组织


目前网络上关于对象序列化的文章不少,但是我发现详细叙述用法和原理的文章太少。本人
把自己经过经验总结和实际运用中的体会写成的学习笔记贡献给大家。希望能为整个java社
区的繁荣做一点事情。
 
序列化的过程就是对象写入字节流和从字节流中读取对象。将对象状态转换成字节流之后,
可以用java.io包中的各种字节流类将其保存到文件中,管道到另一线程中或通过网络连接
将对象数据发送到另一主机。对象序列化功能非常简单、强大,在RMI、Socket、JMS、EJB
都有应用。对象序列化问题在网络编程中并不是最激动人心的课题,但却相当重要,具有
许多实用意义。
一:对象序列化可以实现分布式对象。主要应用例如:RMI要利用对象序列化运行远程主机
上的服务,就像在本地机上运行对象时一样。
二:java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。
可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序
列化可以进行对象的"深复制",即复制对象本身及引用的对象本身。序列化一个对象可能
得到整个对象序列。
 
从上面的叙述中,我们知道了对象序列化是java编程中的必备武器,那么让我们从基础开始
,好好学习一下它的机制和用法。


java序列化比较简单,通常不需要编写保存和恢复对象状态的定制代码。实现java.io.Seri
alizable接口的类对象可以转换成字节流或从字节流恢复,不需要在类中增加任何代码。只
有极少数情况下才需要定制代码保存或恢复对象状态。这里要注意:不是每个类都可序列化,
有些类是不能序列化的,例如涉及线程的类与特定JVM有非常复杂的关系。

序列化机制:

序列化分为两大部分:序列化和反序列化。序列化是这个过程的第一部分,将数据分解成字
节流,以便存储在文件中或在网络上传输。反序列化就是打开字节流并重构对象。对象序列
化不仅要将基本数据类型转换成字节表示,有时还要恢复数据。恢复数据要求有恢复数据的
对象实例。ObjectOutputStream中的序列化过程与字节流连接,包括对象类型和版本信息。
反序列化时,JVM用头信息生成对象实例,然后将对象字节流中的数据复制到对象数据成员中。
下面我们分两大部分来阐述:


处理对象流:
(序列化过程和反序列化过程)


java.io包有两个序列化对象的类。ObjectOutputStream负责将对象写入字节流,ObjectInp
utStream从字节流重构对象。
    我们先了解ObjectOutputStream类吧。ObjectOutputStream类扩展DataOutput接口。
writeObject()方法是最重要的方法,用于对象序列化。如果对象包含其他对象的引用,则
writeObject()方法递归序列化这些对象。每个ObjectOutputStream维护序列化的对象引用表,
防止发送同一对象的多个拷贝。(这点很重要)由于writeObject()可以序列化整组交叉引用的
对象,因此同一ObjectOutputStream实例可能不小心被请求序列化同一对象。这时,进行反引用
序列化,而不是再次写入对象字节流。
下面,让我们从例子中来了解ObjectOutputStream这个类吧。

// 序列化 today's date 到一个文件中.
    FileOutputStream f = new FileOutputStream("tmp");
    ObjectOutputStream s = new ObjectOutputStream(f);
    s.writeObject("Today");
    s.writeObject(new Date());
    s.flush();


 
现在,让我们来了解ObjectInputStream这个类。它与ObjectOutputStream相似。它扩展Dat
aInput接口。ObjectInputStream中的方法镜像DataInputStream中读取Java基本数据类型的
公开方法。readObject()方法从字节流中反序列化对象。每次调用readObject()方法都返回
流中下一个Object。对象字节流并不传输类的字节码,而是包括类名及其签名。readObject()
收到对象时,JVM装入头中指定的类。如果找不到这个类,则readObject()抛出
ClassNotFoundException,如果需要传输对象数据和字节码,则可以用RMI框架。
ObjectInputStream的其余方法用于定制反序列化过程。
例子如下:

//从文件中反序列化 string 对象和 date 对象
    FileInputStream in = new FileInputStream("tmp");
    ObjectInputStream s = new ObjectInputStream(in);
    String today = (String)s.readObject();
    Date date = (Date)s.readObject();

 

定制序列化过程:


序列化通常可以自动完成,但有时可能要对这个过程进行控制。java可以将类声明为serial
izable,但仍可手工控制声明为static或transient的数据成员。
例子:一个非常简单的序列化类。

public class simpleSerializableClass implements Serializable{
    String sToday="Today:";
    transient Date dtToday=new Date();
}


序列化时,类的所有数据成员应可序列化除了声明为transient或static的成员。将变量声
明为transient告诉JVM我们会负责将变元序列化。将数据成员声明为transient后,序列化
过程就无法将其加进对象字节流中,没有从transient数据成员发送的数据。后面数据反序
列化时,要重建数据成员(因为它是类定义的一部分),但不包含任何数据,因为这个数据
成员不向流中写入任何数据。记住,对象流不序列化static或transient。我们的类要用
writeObject()与readObject()方法以处理这些数据成员。使用writeObject()与readObject()
方法时,还要注意按写入的顺序读取这些数据成员。
关于如何使用定制序列化的部分代码如下:

//重写writeObject()方法以便处理transient的成员。
public void writeObject(ObjectOutputStream outputStream) throws IOException{
    outputStream.defaultWriteObject();//使定制的writeObject()方法可以
                        利用自动序列化中内置的逻辑。
    outputStream.writeObject(oSocket.getInetAddress());
    outputStream.writeInt(oSocket.getPort());
}
//重写readObject()方法以便接收transient的成员。
private void readObject(ObjectInputStream inputStream) throws
IOException,ClassNotFoundException{
    inputStream.defaultReadObject();//defaultReadObject()补充自动序列化
    InetAddress oAddress=(InetAddress)inputStream.readObject();
    int iPort =inputStream.readInt();
    oSocket = new Socket(oAddress,iPort);
    iID=getID();
    dtToday =new Date();
}

 

完全定制序列化过程:

如果一个类要完全负责自己的序列化,则实现Externalizable接口而不是Serializable接口
。Externalizable接口定义包括两个方法writeExternal()与readExternal()。利用这些方
法可以控制对象数据成员如何写入字节流.类实现Externalizable时,头写入对象流中,
然后类完全负责序列化和恢复数据成员,除了头以外,根本没有自动序列化。这里要注意了。
声明类实现Externalizable接口会有重大的安全风险。writeExternal()与readExternal()
方法声明为public,恶意类可以用这些方法读取和写入对象数据。如果对象包含敏感信息,
则要格外小心。这包括使用安全套接或加密整个字节流。到此为至,我们学习了序列化的
基础部分知识。关于序列化的高级教程,以后再述。

posted @ 2007-06-08 13:39 小小程序程序员混口饭吃 阅读(952) | 评论 (1)编辑 收藏

1:redhat 语言设置 这个语言是安装的时候决定的,并不是每个user决定的

  /etc/sysconfig/i18n

2:redhat 模式

  /etc/inittab

id:5 xwindow  mode id:3 test mode

3:使用光驱

  挂载光驱mount /dev/hdc /mnt/cdrom

  卸载光驱时候出现 umount: /mnt/cdrom device is busy

  是因为当前的目录已经在光盘目录,应该先退出这个目录

4:安装rpm 文件

  rpm -ivh xxx.rpm  安装包

  rpm -qa |grep "tt*"  查询安装过的包

  rpm -e xxx


5:在text mode 上翻页 shift +pageup pagedown

6:ls -al
  查找隐藏的文件

7:set 查看环境变量  .bash_profile

  用户的语言设置与这个相关,如果没有设置会默认使用/etc/sysconfig/i18n

8:查看文件类型以及编码方式

  file *.file

9: 编码转换

命令名称:iconv
命令格式:iconv -f "文件目前编码" -t "文件转换后的编码" -o "转换后生成的新文件名" "源文件名"
ex: iconv -f ISO-8859 -t utf-8 -o mydoc.inc.php mydoc.inc.php.bak

 

 

 


 

posted @ 2007-05-21 17:31 小小程序程序员混口饭吃| 编辑 收藏
CMWAP 和 CMNET 只是中国移动人
为划分的两个GPRS接入方式。前者是为手机WAP上网而设立的,后者则主要是为PC、笔记
本电脑、PDA等利用GPRS上网服务。它们在实现方式上并没有任何差别,但因为定位不同
,所以和CMNET相比,CMWAP便有了部分限制,资费上也存在差别。

WAP只是一种GPRS应用模式,它与GRPS的接入方式是无关的。WAP应用采用的实现方
式是“终端+WAP网关+WAP服务器”的模式,不同于一般Internet的“终端+服务器”
的工作模式。主要的目的是通过WAP网关完成WAP-WEB的协议转换以达到节省网络流量和
兼容现有WEB应用的目的。WAP网关从技术的角度讲,只是一个提供代理服务的主机,它
不一定由网络运营商提供。但据我所知,中国移动GPRS网络目前只有唯一的一个WAP网关
:10.0.0.172,有中国移动提供,用于WAP浏览(HTTP)服务。有一点需要注意,WAP网
关和一般意义上的局域网网关是有差别的,标准的WAP网关仅仅实现了HTTP代理的功能,
并未完成路由、NAT等局域网网关的功能。这就决定了它在应用上所受到的限制。

为了从应用中区别两者的定位,中国移动对CMWAP作了一定的限制,主要表现在CMW
AP接入时只能访问GPRS网络内的IP(10..*),而无法通过路由访问Internet。我们
用CMWAP浏览Internet上的网页就是通过WAP网关协议或它提供的HTTP代理服务实现的。
也就是需要通过中国移动GPRS网络唯一的一个WAP网关:10.0.0.172。CMNET拥有完全的
Internet访问权,这里就不多说了,主要让我们来看看CMWAP。因为有了上面提到的限制
,CMWAP的适用范围就要看WAP网关所提供的支持了。目前,中国移动的WAP网关对外只提
供HTTP代理协议(80和8080端口)和WAP网关协议(9201端口)。

因此,只有满足以下两个条件的应用才能在中国移动的CMWAP接入方式下正常工作:
1. 应用程序的网络请求基于HTTP协议。2. 应用程序支持HTTP代理协议或WAP网关协议。
而cmnet则不受任何的限制。

说白了就是说通过cmwap的方式访问,需要走中国移动的网关通过http协议去连接,
这样的后果就是速度会变慢,相信很多朋友都用过代理服
务器吧,对,就是那个感觉,而通过cmnet来连接的,就是直接连接到无限乾坤在inter
net上的服务器,速度会比cmwap的快一些。说完了速度,就该说价格了,如果玩家没有
采用套餐的话,那cmwap和cmnet都是一样的,1kb三分钱,或者订了一个xx元包xM的套餐
,超出部分1k一分钱,这种时候,同等价格都一样,据我了解,cmwap版本流量会大一些
,所以还是用cmnet比较好,又快又省钱。但是对于很多地方的动感地带用户而言,情况
可能有些不同,相当一些地方的动感地带只能访问cmwap,不能访问cmnet,所以没地选
择了,还有一些地方有动感地带的包月上网卡,有10元、20元、50元的等等,具体的要
看当地的资费政策了,而这些包月卡通常只包cmwap的流量,这个时候如果用cmnet还要
另外付费,所以建议这些用户还是使用cmwap吧。最后总结一下,如果玩家的手机卡只能
访问cmwap或者有cmwap包月的套餐,那么您就使用cmwap连接来游戏,否则使用cmnet连
接是更好的选择


所以,一句话,有wap包月的地区就使用wap包月上网,没有包月业务的就用cmnet,反正都是按流量算钱,为什么不选择快一点的呢(但还是要提醒大家,按流量计费产生的费用是巨大的,要
多多注意)
posted @ 2007-05-17 10:50 小小程序程序员混口饭吃 阅读(1963) | 评论 (0)编辑 收藏
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class TestConn {

    
public TestConn() {
        
super();
    }


    
public static void main(String[] args) throws Exception {
        String url 
= null;
        getHttpText(url);
        System.out.println(
"abc");
    }


    
public static String getHttpText(String str) {
        URL url 
= null;
        
try {
            url 
= new URL(str);
        }
 catch (MalformedURLException e) {
            e.printStackTrace();
        }

        HttpURLConnection huc 
= null;
        
try {

            huc 
= (HttpURLConnection) url.openConnection();
            huc.setRequestMethod(
"GET");
            huc.setRequestProperty(
"Content-Type",
                    
"application/vnd.syncml.dm+xml");
            
// application/x-www-form-urlencoded
            
// application/vnd.syncml.dm+xml
            huc.setDoOutput(true);
            huc.setRequestProperty(
"Cache-Control""private");
            huc.setRequestProperty(
"Accept-Charset""utf-8");
            huc.setRequestProperty(
"Accept""application/vnd.syncml.dm+xml");
            huc.setRequestProperty(
"Content-Length""3");
            DataOutputStream printout;
            printout 
= new DataOutputStream(huc.getOutputStream());
            printout.writeBytes(
"abc");
        }
 catch (IOException e) {
            e.printStackTrace();
        }

        InputStream is 
= null;
        
try {
            is 
= huc.getInputStream();
        }
 catch (IOException e) {
            e.printStackTrace();
        }

        BufferedReader br 
= new BufferedReader(new InputStreamReader(is));
        StringBuffer sb 
= new StringBuffer();
        String line 
= "";
        
try {
            
while ((line = br.readLine()) != null{
                sb.append(line).append(
"\n");
            }

        }
 catch (IOException e) {
            e.printStackTrace();
        }

        
return sb.toString();
    }


}

posted @ 2007-05-14 09:16 小小程序程序员混口饭吃 阅读(4057) | 评论 (0)编辑 收藏
记事本=notepad
计算器=calc
注册表=regedit
系统检测=dxdiag
画图=mspaint
远程桌面=mstsc
posted @ 2007-04-29 17:27 小小程序程序员混口饭吃 阅读(479) | 评论 (1)编辑 收藏
 其实这个问题不是程序的问题,主要是property中文问题,这个问题可以通过build解决掉

 <native2ascii src="." dest="build" includes="*Props.txt" />
把配置文件编码 windows下默认GBK编码,linux 要加encoding
代码一行不用改,放心汉化吧~~
posted @ 2007-04-24 15:21 小小程序程序员混口饭吃 阅读(1882) | 评论 (3)编辑 收藏
如题,有没有朋友知道开源的在线图片处理的程序,在页面上直接处理图片,有点象iephotoshop,功能即使不如imageJ,也要有一些基本的功能.
posted @ 2007-04-19 09:20 小小程序程序员混口饭吃 阅读(2072) | 评论 (2)编辑 收藏
话说“你不理财,财不理你”

那么什么是理财呢???

很多人都很知道“理财”,也都无时无刻不在理财,但把理财说清楚的人却不多...

很多人说到理财想到的就是投资,就是开源节流,就是合理分配财产,等等… …

其实,
---------------------------------------------------------
理财就是对财富的有效管理。

理财的内涵很广,包括开源节流,包括合理分配财产,包括投资增值等,但又不止于这些。从理财的基础理论来讲,主要包括:现金管理、资产管理、债务管理、风险管理、投资管理等等。
---------------------------------------------------------
现金管理是理财的基础。包括各项收入的筹划和管理,包括各项税费的管理,包括各项日常支出的管理,包括现金的积累和短期储蓄等等。具体的管理工具和形式有各式各样的银行卡片,各式各样的储蓄方式,各种各样的支出方式,包括各种各样的节俭手段等等。

资产管理是理财的重心。资产具体包括固定资产、流动资产等。固定资产比如房产、铺面等等,流动资产包括储蓄资产、投资资产、保险资产等。资产管理是家庭理财的重点,合理有效的管理需要。

债务管理是理财的关键。债务并非完全的坏事,合理的管理债务是迅速达到理财目标的捷径,只要把债务控制在一定的合理的范围之内,对优化财务结构有很好的作用。比如在财力许可的情况下可以通过按揭提前实现高品质的家庭生活,通过金融信用延迟支付货款往来等,从而更快实现财务目标。

风险管理是理财的关键。有效的风险管理是现代社会先进的标志,没有对风险的管理交通工具不能上路运营,贸易货运不能出门出海流通,商场大厦无法入住营业,流动性和小家化也决定个人进行风险管理是大势所趋。

投资管理是理财的要点。现在很多对投资理财非常渴望,一提到投资赚钱眼睛就发亮,主要是因为目前我国金融环境不够完善,安全稳健的大众投资品种非常匮乏,很多人的收益局限于2个点以内,相较于去年初高达5个点的通货膨胀显然是一个很大的威胁。而国内居民的投资信息和能力先天不足,稍有异动即可能遭遇陷阱的现状导致国民储蓄逐年逼高。在理财范畴内投资增值是最需要专业知识的,也是实现家庭理财目标最关键的步骤。所以如何实现投资的有效管理就很重要。


总之,理财就是所有与财富有关的活动的总称,是现代社会重要的组成要素,是现代人过上幸福快乐生活必备的基本素质。

而且,五个理财的基本方面也是互相关联,互为制约,相互促进的。

posted @ 2007-02-13 11:07 小小程序程序员混口饭吃 阅读(342) | 评论 (0)编辑 收藏

           

做为新一代 3G 及移动终端浪潮的设备管理平台, OMA DM 技术获得了众多设备厂商和运营商的追捧,也为软件开发商提供新的崛起机会。业内目前也有不少工作在做这方面的软件。好多公司这方面的产品都是基于Sync4J开发的。

Sync4J 开源项目为我们提供了完整的 OMA DM 1.1.2 规范的 Java 实现。本文记录了 Sync4J DM Server 安装以及使用SCTS模拟器来模拟手机做一个DM业务,本文没有用PPG来通过短信方式来用真手机来做,只是用模拟器来做的。SCTSOMA官方提供的一个测试工具,主要用来测试DMserver的,这里我们用来测试Sync4JSync4JSCTS的集合是我们学习OMA的一个很好的方式。

1 :用到以下工具。

  Oracle9i

  jboss-3.2.3

  sync4j-server-dm-1.4.9   sync4j 官方有下载

  SCTS_DeviceManagement_v1.12.zip  OMA 官方网站有下载。

 

 

2 :安装调试

  2.1 解压文件:

   jboss-3.2.3 解压到 C:\jboss-3.2.3

sync4j-server-dm-1.4.9 解压到 D:\sync4j\all\server-dm .

直接安装 SCTS.

  2.2 配置环境变量

  JAVA_HOME=

  J2EE_HOME= C:\jboss-3.2.3

  SYNCSERVER_HOME= D:\sync4j\all\server-dm

2.3 修改SYNCSERVER_HOME下的几个配置文件

   SYNCSERVER_HOME\ default\config\common\properties\ Sync4j.properties

把第一行改为 server.uri=http://your IP:8080/sync4j-dm/dm

  SYNCSERVER_HOME\ install.properties 改为

(1)server-name=http://10.150.4.7:8080/sync4j-dm/dm

 (2) oracle 的数据库,以下是用来连接数据库的,所以一定要配置正确。

jdbc.classpath=C:\\jboss-3.2.3\\server\\all\\lib\\ojdbc14.jar

jdbc.driver=oracle.jdbc.driver.OracleDriver

jdbc.url=jdbc:oracle:thin:@11.11.11.11:1521:abc

jdbc.user=sync4j

jdbc.password=sync4j

2 4以上都做完后用Sync4j自己带的安装脚本安装sync4j dm server

SYNCSERVER_HOME 下运行 bin\install.cmd jboss32

2 5由于这个版本存在了一个bug,所以在2.4做完后要修改

SYNCSERVER_HOME\bin\start.cmd

把倒数第三行 call\run.bat -c sync4j 改为

call %J2EE_HOME%\bin\run.bat -c sync4j

2 6 SYNCSERVER_HOME 运行 bin\start.cmd安装

所有程序到安装到了 jboss_home 下了,可以到 JBOSS_HOME\ server\sync4j 就可以看到了,看一下你的 oralce 库里面也初始化了数据,表也建好了。

 

2 7 添加一个手机(我们其实是个模拟器)上来

http://your ip:8080/dmdemo/jsp/addDevice.jsp 填写一个 IMEI:111111111111111,

 

2 8 配置scts

Add device : IMEI:111111111111111 然后点 apply

点击 DM Account

Name sync4j

Server:sync4j

Con : 不用填写

Address http://your ip /sync4j-dm/dm

Port :8080

Server authentication:

  Digest : 找数据库用 sync4j 的数据库中, sycn4j_device 表中 :IMEI:111111111111111 server password 为: srvpwd, 把这个 password 填写到 password 中。

Client authentication

   DIGEST: USER NAME: sync4j PASSWORD: sync4j

Add 就可以了

然后点 connect 连一下 DM SERVER 看看能否连上。 第一次一般会出现认证错我,接着再联一次就可以了, SCTS 有日志可以查看。

 

如果连通了那下面就来做一个采集模拟器上的一个节点吧。

 

http://your ip:8080/dmdemo/index.html

device id IMEI:111111111111111 login

1.JPG

 

  然后点击 add to operation list

2.JPG

然后用 SCTS 主动回联一下,看看 server 能够拿到这个节点的值

3.JPG

你会看到 6 message !!!

详细看一下这 6 message 你会发现,这个节点的采集已经成功了!

 

 

 

 

posted @ 2007-02-05 10:02 小小程序程序员混口饭吃 阅读(9250) | 评论 (11)编辑 收藏

 

 1 import  java.io.BufferedReader;
 2 import  java.io.InputStreamReader;
 3 import  java.security.MessageDigest;
 4
 5 import  sun.misc.BASE64Decoder;
 6 import  sun.misc.BASE64Encoder;
 7
 8 public   class  ConvertNounce  {
 9
10      //  Digest = H(B64(H(username:password)):nonce)
11      //  b1=B64(H(username:password));
12      //
13      //
14      /**
15      *  @param  args
16       */

17      public   static   void  main(String[] args)  throws  Exception  {
18         
19
20         
21      //     if(args.length!=3) throw new Exception("args is wrong ,there is must by three args :username password nextNounce");
22
23         InputStreamReader reader  =   new  InputStreamReader(System.in);
24         BufferedReader input  =   new  BufferedReader(reader);
25     
26         
27         System.out.println( " input username: " );
28         String username  = input.readLine();
29         System.out.println( " input password: " );
30         String pwd  =  input.readLine();
31         System.out.println( " input nextNounce: " );
32         
33         String serverNounce  =  input.readLine();
34         String clientNounce  =   null ;
35
36         System.out.println( "" );
37         
38         System.out.println( " userName= " + username);
39         System.out.println( " password= " + pwd);
40         System.out.println( " nextNounce= " + serverNounce);
41          byte [] b1  =  calculateDigestAndEcode64(username, pwd);
42         
43      //     System.out.println("b1="+new String(b1));
44         
45          // server 下来的nounce一定要先做B64的解码,否则算出来的结果对不上
46         serverNounce  = new  String( new  BASE64Decoder().decodeBuffer(serverNounce));
47         
48      //     System.out.println(serverNounce);
49
50          byte [] bserverNounce  =  serverNounce.getBytes();
51
52          byte [] buf  =   new   byte [b1.length  +   1   +  bserverNounce.length];
53
54         System.arraycopy(b1,  0 , buf,  0 , b1.length);
55
56         buf[b1.length]  =  ( byte ' : ' ;
57         System.arraycopy(bserverNounce,  0 , buf, b1.length + 1 ,
58                         bserverNounce.length);
59         MessageDigest md  =  MessageDigest.getInstance( " MD5 " );
60         
61      //     System.out.println(new String(buf));
62
63          byte [] digest  =  md.digest(buf);
64         
65      //     System.out.println(new String(digest));
66
67         clientNounce  =   new  BASE64Encoder().encode(digest);
68         System.out.println( "" );
69         System.out.println( " result Nounce= " + clientNounce);
70         
73     }

74
75      public   static   byte [] calculateDigestAndEcode64(String username,
76             String password)  throws  Exception  {
77
78         MessageDigest md  =  MessageDigest.getInstance( " MD5 " );
79         String cred  =   "" ;
80          if  (username  !=   null {
81             cred  =  username.trim();
82         }

83         cred  +=   " : " ;
84          if  (password  !=   null {
85             cred  +=  password.trim();
86         }

87      //     System.out.println(cred);
88          //  System.out.println(new String(md.digest(cred.getBytes())));
89          return   new  BASE64Encoder().encode(md.digest(cred.getBytes()))
90                 .getBytes();
91     }

92     
93     
94
95 }

96
posted @ 2007-01-11 14:57 小小程序程序员混口饭吃 阅读(1342) | 评论 (0)编辑 收藏

范伟先生名言:猪撞树上了,你撞猪上了吧

  我有4种理解:
      1:猪撞树上了,你撞在猪上,猪比较软,你比猪幸运
      2:人家猪都撞树上了,你又往人家身上撞,不想让猪活了?
      3:猪往树上撞,他智商低,你比不过他,去撞猪泄愤啊?
      4:你撞了猪,猪不跟你一般见识,他去撞树

posted @ 2006-12-19 09:31 小小程序程序员混口饭吃 阅读(1624) | 评论 (6)编辑 收藏

最近写一个东西,在网上看到这个计划书的范本,很不错,抄下来

商业计划书目录



报告目录

第一部分 摘要(整个计划的概括) (文字在2-3页以内)



一. 项目简单描述(目的、意义、内容、运作方式)

二. 市场目标概述

三. 项目优势及特点简介

四. 利润来源简析

五. 投资和预算

六. 融资方案(资金筹措及投资方式)

七. 财务分析(预算及投资报酬)



第二部分 综述



第一章 项目背景

一. 项目的提出原因

二. 项目环境背景

三. 项目优势分析(资源、技术、人才、管理等方面)

四. 项目运作的可行性

五. 项目的独特与创新分析

第二章 项目介绍

一. 网站建设宗旨

二. 定位与总体目标

三. 网站规划与建设进度

四. 资源整合与系统设计

五. 网站结构/栏目板块

六. 主要栏目介绍

七. 商业模式

八. 技术功能

九. 信息/资源来源

十. 项目运作方式

十一.网站优势(资源/内容/模式/技术/市场等)

十二.无形资产

十三.策略联盟

十四.网站版权

十五.收益来源概述

十六.项目经济寿命



第三章. 市场分析

一. 互联网市场状况及成长

二. 商务模式的市场地位

三. 目标市场的设定

四. 传统行业市场状况(网站市场资源的基础)

五. 市场定位及特点(消费群体、消费方式、消费习惯及影响市场的主要因素分析

市场规模、市场结构与划分,特定受众等

六. 市场成长(网站PageView与消费者市场)

七. 本项目产品市场优势(对于特定人群的市场特点的省事、省时、省力、省钱等)

八. 市场趋势预测和市场机会

九. 行业政策

第四章 竞争分析

一. 有无行业垄断

二. 从市场细分看竞争者市场份额

三. 主要竞争对手情况

第五章 商业实施方案

一. 商业模式实施方案总体规划介绍

二. 营销策划

三. 市场推广

四. 销售方式与环节

五. 作业流程

六. 采购、销售政策的制定

七. 价格方案

八. 服务、投诉与退货

九. 促销和市场渗透(方式及安排、预算)

1. 主要促销方式

2. 广告/公关策略、媒体评估

3. 会员制等

十. 获利分析

十一. 销售资料统计和销售纪录方式,销售周期的计算。

十二. 市场开发规划,销售目标(近期、中期),销售预估(3-5年)销售额、占有率及

计算依据



第六章 技术可行性分析



一. 平台开发

二. 数据库

三. 系统开发

四. 网页设计

五. 安全技术

六. 内容设计

七. 技术人员

八. 知识产权

第七章 项目实施

1. 项目实施构想(公司的设立、组织结构与股权结构)

2. 网站开发进度设计与阶段目标

3. 营销进度设计与阶段目标

4. 行政管理部门的建立、职工的招募和培训安排

5. 项目执行的成本预估



第八章 投资说明



一. 资金需求说明(用量/期限)

二. 资金使用计划(即用途)及分期

三. 项目投资构成和固定资产投资的分类

四. 主要流动资金构成

五. 投资形式(贷款/利率/利率支付条件/转股-普通股、优先股、任股权/对应

价格等)

六. 资本结构

七. 股权结构

八. 股权成本

九. 投资者介入公司管理之程度说明

十. 报告(定期向投资者提供的报告和资金支出预算)

十一. 杂费支付(是否支付中介人手续费)

第九章 投资报酬与退出

一. 股票上市

二. 股权转让

三. 股权回购

四. 股利



第十章 风险分析与规避

一. 政策风险

二. 资源风险

三. 技术风险

四. 市场风险

五. 内部环节脱节风险

六. 成本控制风险

七. 竞争风险

八. 财务风险(应收帐款/坏帐/亏损)

九. 管理风险(含人事/人员流动/关键雇员依赖)

十. 破产风险

第十一章 管理



一. 公司组织结构

二. 现有人力资源或经营团队

三. 管理制度及协调机制

四. 人事计划(配备/招聘/培训/考核)

五. 薪资、福利方案

六. 股权分配和认股计划



第十二章 经营预测

一. 网站经营

1.访问人数成长预测

2.会员增长预测

3.行业联盟预测

二. 销售数量、销售额、毛利率、成长率、投资报酬率预估及计算依据

第十三章 财务可行性分析

一. 财务分析说明

二. 财务数据预测

1. 收入明细表

2. 成本费用明细表

3. 薪金水平明细表

4. 固定资产明细表

5. 资产负债表

6. 利润及利润分配明细表

7. 现金流量表

三. 财务分析指标

反映财务盈利能力的指标

a.投资回收期(Pt)

b.投资利润率

c.投资利税率

d.不确定性分析



第三部分 附录

一. 附件



1. 主要经营团队名单及简历

2. 专业术语说明

3. 企业形象设计/宣传资料(标识设计、说明书、出版物、包装说明等)



二. 附表



1. 市场受众分析(人群分布/数量等)表

2. 互联网成长状况表

3. 主要设备清单

4. 互联网市场调查表

5. 预估分析表

6. 各种财务报表及财务预估表

posted @ 2006-12-18 13:48 小小程序程序员混口饭吃 阅读(10609) | 评论 (2)编辑 收藏

 

1: 下载 cvsnt-2.5.03.2382(http://www.cvsnt.org)

2: 安装完全采用默认就可以了,安装完可以不重启

3 :开始菜单 ->CVSNT-> Control Panel . 停止 CVS NT

 

4 :进入 repository configuration 点击 add 添加一个如图所示:

   Localtion  填写一个 D:/CVSRoot

   Name     填写 /cvs

 

 

 

 

 

  

cvs_rep.GIF 

5 :进入 server settting

 

 

CVS_server_setting.GIF 

  Run as 选择一个 windows 下已有用户比如 (administrator) ,其余不用修改,应用就可以了。

6 :进入 about :CVSNT 启动 . CVS 已经配置完毕,至于安全什么方面的东西我没有弄过。

 

7: 打开 eclilpse ,file->new->other ,CVS

 

 CVS_ECLIPSE1.GIF

 

 

CVS_ECLIPSE2.GIF 

 

 

输入 Host repository path 、用户名、密码 ,其余默认,然后 next

CVS_ECLIPSE3.GIF 

 

Next

 

CVS_ECLIPSE4.GIF 

Next

 

CVS_ECLIPSE5.GIF 

Next

 

CVS_ECLIPSE6.GIF 

 

一切搞定,你可以建立一个目录然后 就可以commit .

posted @ 2006-12-14 16:14 小小程序程序员混口饭吃 阅读(13047) | 评论 (6)编辑 收藏
1、长的惊险.....

2、你小时候被猪亲过吧?

3、你长的很 爱guo 很 敬业 很 有骨气

4、长得真有创意,活得真有勇气!

5、你长的真t m 后现代

6、你长的好象车祸现场

7、你长的外形不准 比例没打好

8、你干嘛用屁股挡住脸啊!

9、我觉得世界上就只有两种人能吸引人,一种是特漂亮的 一种就是你这样的

10、你的长相很提神的说!!

11、你需要回炉重造

12、他们怎么能管你叫猪呢??这太不像话了!总不能人家长的像什么就叫人家什么吧!怎么能说你长得像猪呢?那是侮辱了猪。

13、*,你T.M.D.长得太好认了。

14、长的很科幻,长的很抽象!

15、见过丑的,没见过这么丑的。乍一看挺丑,仔细一看更丑!

16、长的很无辜,长的对不起人民对不起党。

17、你长的拖慢网速,你长的太耗内存

18、你光着身子追我两公里 我回一次头都算我是流氓!

19、大哥,把你脸上的分辨率调低点好吗?

20、你长的违...

posted @ 2006-12-13 10:49 小小程序程序员混口饭吃 阅读(461) | 评论 (0)编辑 收藏
今天看到一篇非常好的文章,忍不住copy下来。
有一天,柏拉图问老师苏格拉底什么是爱情?
老师就让他先到到麦田里去,摘一棵全麦田里最大最金黄的麦穗来,期间只能摘一次,并且只可向前走,不能回头。
柏拉图于是按照老师说的去做了。结果他两手空空的走出了田地。老师问他为什么摘不到?他说:因为只能摘一次,又不能走回头路,期间即使见到最大最金黄的,因为不知前面是否有更好的,所以没有摘;走到前面时,又发决总不及之前见到的好,原来最大最金黄的麦穗早已错过了;于是我什么也没摘。
老师说:这就是“爱情”。
之后又有一天,柏拉图问他的老师什么是婚姻,他的老师就叫他先到树林里,砍下一棵全树林最大最茂盛、最适合放在家作圣诞树的树。其间同样只能砍一次,以及同样只可以向前走,不能回头。
柏拉图于是照着老师的说话做。今次,他带了一棵普普通通,不是很茂盛,亦不算太差的树回来。老师问他,怎么带这棵普普通通的树回来,他说:“有了上一次经验,当我走到大半路程还两手空空时,看到这棵树也不太差,便砍下来,免得错过了后,最后又什么也带不出来。”
老师说:“这就是婚姻!” 人生就正如穿越麦田和树林,只走一次,不能回头。要找到属于自己最好的麦穗和大树,你必须要有莫大的勇气和付出相当的努力
posted @ 2006-12-12 13:21 小小程序程序员混口饭吃 阅读(460) | 评论 (1)编辑 收藏

 

FUMO (Firmware Update Management Object) 手机终端用来固件升级的协议。协议主要规定了一下方面:

1 FIRMWARE UPDATE MANAGEMENT OBJECT PARAMETERS. (路径和节点)

2 BEHAVIOR ASSOCIATED WITH THE MANAGEMENT OBJECT (执行升级和下载的命令以及 ALERT

3 CLIENT INITIATED FIRMWARE UPDATE ( 手机自行发起的固件升级的一些规定 )

 

1 FIRMWARE UPDATE MANAGEMENT OBJECT PARAMETERS

 FUMO_1_PRA.GIF

 

总共定义如上节点

 

PKNAME: 升级包名字

Pkgversion: 升级包版本

Download :用来执行初始化下载的节点

PKGURL: 初始化下载时存储的下载地址的节点

Update: 用来执行升级的节点

Pkgdata: 用来提供升级包数据的节点

Downloadnadupdate :用来初始化下载和升级的节点

    Pkgurl : 初始化下载时存储的下载地址的节点

State :手机当前升级过程中的状态。

Ext :厂商自己定义的扩展节点

 

根据实现不同, FUMO 可以选择 Downloadnadupdate 也可以选择 downd and upate 2 个节点的组合来实现固件的升级 ( 先下载,把下载的东西放在 X/update/pkgdata 里面,然后执行升级 )

 

State 有一下状态

FUMO_2_STATE.GIF 

升级成功返回 100 ,根据返回的不同状态,来与 SERVER 交互。

 

Fumo 规定的升级过程中的流程

 

FUMO_3_FLOW.GIF 

 

  FUMO 从初始化下载到最后成功然后清除掉下来后的升级包的全过程,

 

 

2 BEHAVIOR ASSOCIATED WITH THE MANAGEMENT OBJECT

 

FUMO 在执行的开始,假定手机采用先 download 然后 update, 先把升级包的 URL SERVER 发过来 , 手机先自行 replace 命令把 URL 放在 Download/PkgURL 下面,然后执行 exec 命令把包下载到 update/PkgData 下面,(有的 FUMO 实现厂商采用差分包方法升级)在 update 的时候直接执行 exec 执行升级。

 

 

 

 

以下分别是执行了 2 exec 分别在执行 download downloadandupdate.

FUMO_4_DOWNLOAD_UPDATE.bmp
FUMO_5_DOWNLOAD_AND_UPDATE.GIF 

 

下图是手机在进行升级过程中返回给 SERVER 的一些结果,都是用数字来表示, server 可以根据这些返回码来判断终端在升级过程中哪一步执行失败。

 

 

 FUMO_6_RESULTCODE.GIF  

 

 

 

下图是一个终端在执行一个 download 过程和一个 update 过程的流程图,此图能够清晰的显示出 DM command fumo 的节点如何交互的。

FUMO_7_FLOW_D_U.GIF 

下图是一个直接的 DownloadAndUpdate 的过程。手机一般会选择这两种的中的一种方式。

FUMO_8_FLOW_DANDU.GIF 

3 CLIENT INITIATED FIRMWARE UPDATE

其实这是 CP 协议的一部分内容,在下一篇文章会详细的描述 cp 协议的一些东西, cp 协议想关联有好几协议。

posted @ 2006-12-08 15:43 小小程序程序员混口饭吃 阅读(2164) | 评论 (4)编辑 收藏

 DM并不是一个前沿的技术。据悉,韩国SK电讯、日本NTT DoCoMoKDDI以及以Vodafone为首的一些欧洲运营商都已经建立起了一定规模的DM体系,它们或根据自行标准,或遵循OMA标准,现在主要提供的是以FOTA(固件更新)为主的基本功能,将来还可支持数据备份、诊断及故障修复、图形用户界面处理,甚至病毒防护等多种功能。

因为设计缺陷,Sony Panasonic 曾经为手机召回蒙受了上亿美元的损失,同时中国建立手机召回制度的呼声越来越高,通信厂商该如何应对?如果因为BUG而召回手机那么岂不损失太大。终端管理在这种情况下应运而生,可以给厂商减少损失。

一句话,只要能上网支持DM的手机未来就可以在线升级操作系统,以及修复BUG等等,手机厂商和运营商会更加方便,节省成本,同时能给客户带来更好的体验。只要手机安装了支持DM协议的软件,同时有一个与之交互的SERVER,一切问题迎刃而解。


FOTA有多种实现方式,DM便是其中的一个协议

Dm
协议 5 package.

 

 

 DM_PHASE.GIF

 

 

 

1: package0 server 发送通知(一般是短信)给 CLIENT ,一般通过 WAP PUSH 下去给手机。

 

2: package1

 

手机收到后 wap push 的东西后,根据 WAP PUSH 相关协议,手机会自动回联回 SERVER server 会得到手机的 imei, 厂商、型号等基本信息。

 

3:package2

 

Server 收到 client 的回复后,得到手机的 IP ,然后通过 HTTP 请求 client ,发送一个用户确认请求(手机必须能通过 GPRS 等方式上网),

 

 

4:package3

 

  手机收到后,如果用户确认 DM 继续进行,如果用户否认 DM 发送给手机一个结束标志。就是说不管 package3 用户是否确认或否认 package4 都会进行下去

 

5:package4

 

 SERVER 收到用户返回的信息不管是确认还是否认都会回复,如果 server 还想继续进行下去,那么会重复 package2 ,只是不再是简单让用户确认的东西,比如其他业务通过 DM 去取用户的版本的信息比如发送一个 GET command ,最后一个 package 永远是没有任何 command 的。就是说 package2,package3 可以重复进行多次

 

DM_CHART.GIF

1101:等待用户确认
1200:终端回联SERVER
1201:终端发起
1222:更多的message
1223 :session abort

posted @ 2006-12-08 11:21 小小程序程序员混口饭吃 阅读(2447) | 评论 (0)编辑 收藏
      事务是用来保证数据的一致性( integrity )而锁是保证数据的并发(控制多个事务的并发)( concurrency )。   锁的级别越高,可能会影响数据库的并发。锁的级别越低一般来说数据库的并发越好。   锁在 JDBC,JTA 以及容器管理的事务中的用法基本一样,也有写不同,主要在 JTA 分布式事务上个别又差异。 事务只是用来保证,数据一致性,一致性包括 : 能否保证与其他事务的隔离,以及能否在同一事务中保证重复读,脏读,脏写等等方面。   Oracle 在不是手工加锁的情况下, ORACLE 会自动调度锁。 ORACLE 自动调度锁得执行顺序,一般不会发生死锁现象。有些数据库会自动调度数据库锁得级别,这就增加了死锁的可能, ORACLE 永远不会自动调度锁的级别,死锁发生时, oracle 也会去自动调度,这要延时一段时间, ORACLE 自己的策略,会 ROLLBACK 一个事务,以保证发生死锁的 2 个事务都执行下去。   锁的种类很多,有 DML,DDL 锁以及其他,平时我们开发过程中主要是 DML,DDL 锁。 DML 锁又分很多方面:
RS: row share RX: row exclusive S: share SRX: share row exclusive X: exclusive  
( 1 ) RS 可以通过一下声明方式来锁定表的行
SELECT ... FROM table ... FOR UPDATE OF ... ; 

LOCK TABLE table IN ROW SHARE MODE;

一旦被 RS 锁定,不允许再对表进行 LOCK TABLE table IN EXCLUSIVE MODE

( 2 ) RX 可以通过一下声明方式来锁定表的行
INSERT INTO table ... ;

UPDATE table ... ;

DELETE FROM table ... ; 

LOCK TABLE table IN ROW EXCLUSIVE MODE;
一旦通过 RX 锁定了表中的行,不允许对表进行下列操作

LOCK TABLE table IN SHARE MODE; 

LOCK TABLE table IN SHARE EXCLUSIVE MODE;

LOCK TABLE table IN EXCLUSIVE MODE;


( 3 ) s ( share table lock )可以通过以下方式锁定表
LOCK TABLE table IN SHARE MODE (可以说有多个 S 锁定一个表) ;
允许进行的操作,所有的查询以及 SELECT ... FOR UPDATE, 和 LOCK TABLE ... IN SHARE MODE ,只允许本事务内更新数据( update ,这种情况也是只允许当前表上就一个 S 锁)
不允许的操作
LOCK TABLE table IN SHARE ROW EXCLUSIVE MODE;

LOCK TABLE table IN EXCLUSIVE MODE;

LOCK TABLE table IN ROW EXCLUSIVE MODE;
( 4 ) SRX 通过以下方式锁定表
LOCK TABLE table IN SHARE ROW EXCLUSIVE MODE;
比 S 少了一点,这里只是允许一个 SRX 锁定一个表
不允许的操作:
LOCK TABLE table IN SHARE MODE;

LOCK TABLE table IN SHARE ROW EXCLUSIVE MODE;

LOCK TABLE table IN ROW EXCLUSIVE MODE;

LOCK TABLE table IN EXCLUSIVE MODE;
( 5 ) X 级别最高的锁定形式: LOCK TABLE table IN EXCLUSIVE MODE;
只允许其他事务 QUERY 不允许其他操作。

Table 13-4 Locks Obtained By DML Statements
DML Statement Row Locks? Mode of Table Lock
SELECT ... FROM table   
INSERT INTO table ... X RX
UPDATE table ... X RX
DELETE FROM table ... X RX
SELECT ... FROM table ...    FOR UPDATE OF ... X RS-
LOCK TABLE table IN ...    
ROW SHARE MODE   RS
ROW EXCLUSIVE MODE   RX
SHARE MODE   S
SHARE EXCLUSIVE MODE   SRX
EXCLUSIVE MODE   X
 

       














这个表上很清楚
posted @ 2006-11-30 10:36 小小程序程序员混口饭吃 阅读(4509) | 评论 (2)编辑 收藏
转自http://www.blogcn.com/user64/5635/index.html
1、很快你就会发现几千元的工资不算什么
2、很快你就会发现金钱的获得是以时间和个人生活的牺牲为代价的
3、很快你就会发现自己有点小钱但不幸福
4、很快你就会讨厌自己,讨厌自己的复杂和世故
5、很快你就会发现你身边的很多人怎么素质这么低,这么俗,而你也快成为这样的 了
6、很快你就会讨厌冬天的,太冷了,太冷清和寂寞了
7、你会不断地觉醒,不断地继续奋斗,然后你老想着辞职休息,或者再读书,或者不再创业
8、你会偶尔去同学录看看,但你已经不想再说话了
9、你会偶尔想起自己以前最好的朋友,然后给他/她打个无聊的电话
10、你会偶尔给自己的初恋情人打个电话,然后你发现自己老了
11、你甚至会发现自己现在成熟得可怕,一件很复杂的事情,你一眼就看穿了,而你的依据是你对黑暗的了解
12、你想幸福就要自己花一生的时间去先痛苦
13、当你工作后发现你喜欢摇滚乐的时候,证明你还在挣扎;当你工作后发现自己喜欢忧郁的轻音乐时,你就快完蛋了; 工作了才知道,有空调的办公室,不如闹哄哄的教室;工作了才知道,大学里爱情是游戏,现在爱情是交易;工作了才知道 有时候一顿饭吃上千块也是一种需要;工作了才知道,学生都是装大款,真正的有钱人都哭穷;工作了才知道,穿什么不取决与品位,取决与场合;工作了才知道,学校三点一线,现在却是画直线;工作了才知道,原来买房子也是个远大的理想;工作了才知道,成为社会精英的几率,和中彩票是一样的;工作了才知道,原来消灭剥削只是一种传说;工作了才知道,自立的代价是失去更多的自由


posted @ 2006-11-28 15:57 小小程序程序员混口饭吃 阅读(505) | 评论 (1)编辑 收藏
     摘要: 做技术支持 2 个月了,也就是说有 2 个月没有碰代码了,手都很生了,最近遇到项目大的并发问题,数据也有些不太正确,就想到了项目中,由于模块过多,异步的情况也有发生,所以想到事务与锁的相关知识,先写一点事务相关的理解,然后写一点锁相关的东西,以便加深自己的理解。   ...  阅读全文
posted @ 2006-11-16 13:48 小小程序程序员混口饭吃 阅读(2758) | 评论 (3)编辑 收藏
最近韩国房价失控上涨,有关职能部门3高官引咎辞职.

房价疯涨在中国似乎是司空见惯,习以为常,老百姓也几乎麻木,买不起房子的年轻人只能坐以待毙,泱泱大国除了几个学者能够抨击一下之外,好像没有人说要出来承担责任,政府跟房地产商一个论调,
社会需求导致房价不可能跌。房产商可以控制一些主流的媒体,就跟一些民办学校控制当地的报纸一样,你们敢揭露我,我就不去你们那里打广告,一年让你们少赚个几百万,这些主流媒体当然不会放弃
这么大的摇钱树,也就厚着脸去低三下四了。房子还是疯了一样的涨,恐怕永远没有父母官出来辞职的
除非被利益集团排挤下来。地价高,商业贿赂,行业不正规,职能部门的监管,以及法制整体不健全导致房价疯长,归根结底:房价高总是由上层的利益集团控制的,老百姓只能叹气的份。

联想到,最近台湾政坛,至少那也是民主,香港一个歌星的老爹收了几百万港元就是特大受贿罪犯,这在中国简直是小巫见大巫,种种情况表明大陆还是有差距的,不过最新全球廉政指数,中国上升了10多位,我们也相信是新一代政府正在加强这方面的建设。我爱我的国家,我有理由相信,新一代政府会越来越好,大家拭目以待。

加油中国!


posted @ 2006-11-16 08:51 小小程序程序员混口饭吃 阅读(683) | 评论 (2)编辑 收藏
     摘要: 文章转自网上好像是玉米田的,忘记了锁( locking ) 业务逻辑的实现过程中,往往需要保证数据访问的排他性。如在金融系统的日终结算 处理中,我们希望针对某个 cut-off 时间点的数据进行处理,而不希望在结算进行过程中 ...  阅读全文
posted @ 2006-11-15 08:35 小小程序程序员混口饭吃 阅读(51618) | 评论 (23)编辑 收藏
一个傻子买了3个大饼,吃了前两个都没吃饱,到第三个才吃饱。于是叹道:早知道,我就只买第三个了,前两个饼没用.我们又何尝不是这种人?我们也经常喟叹自己不能成功。
     其实没有人能够随便成功,一口吃饱也是不可能的,所以平时必须打好基础,成功总是属于有准备的人,平时多积累,说不定哪天就会成功!
posted @ 2006-11-10 13:26 小小程序程序员混口饭吃 阅读(370) | 评论 (0)编辑 收藏
超市自造三千元笔记本10天卖出5台,这是刚刚在DONEWS上看到的消息,据物美集团副总裁吴坚中介绍,这款自有品牌笔记本电脑定名为“优宜”,意为“质优价廉”,由物美和合作厂家威盛电子(中国)有限公司联合推出。据其介绍,这款笔记本电脑最低售价才3200元一台,配置稍好的价格才3649元。

原来生产厂家开始物色新的渠道,传统的大商场 ,家电卖场,已经没有太多的利润点,就是说渠道把厂家的利润给吃个差不多了,厂家必须寻找新的渠道,既给国美等大卖场施加了压力,又给自己寻找了利润空间,消费者也得到了实惠,看样子这款比较本只是厂家小试牛刀,如果这种模式能够成功,毕竟带来卖场新一轮冲击,在中国得渠道者得天下,厂商卖本子在传统卖场赚得试卖白菜得钱,利润都被渠道压缩了。
我们拭目以待。
posted @ 2006-11-08 09:07 小小程序程序员混口饭吃 阅读(618) | 评论 (3)编辑 收藏
find 命令在linux中是很常用到的一个查找命令,它的功能非常地强大。可以结合正则匹配来搜索系统中的指定的内容,以下我就记录一下这个find常用到的一些用法

 

首先我们来看年find的总体用法

find path option [-print -exec -ok]

其中path是指定在哪个路径中查找内容。如/var下查找内容,option是find中的一些属性值,常用的有-name,-type,-mtime,-ctime,-atime,-user,-group,-nouser,-nogroup,-perm等,[-print -exec -ok]是可选属性值,-print是指把查找到的内容输出到指定的地方,-exec与-ok都是执行另处的command命令,但两都也有一点不同,-exec在执行指定的command时不会给用户显示提示或操作信息,但是-ok就会在有提示询问操作时给用户显示信息,直到用户做了选择时才继续执行。

 

常用的option值说明

-name 指定查找的内容是文件。

-type 指定查找的文件的类型,它有d,l,b,p,f,c等文件类型,d是查找目录,l是查找链接档,b是查找块文件,p是查找管道文件,f是普通文件,c是字符设备文件

-mtime,-ctime,atime都是指按时间查找,-mtime是文件的修改时间,-ctime是文件的创建时间,atime是后找开文件时间

-user是查找指定用户帐号的文件

-group是查找指定组帐号的文件

-nouser查找无用户帐号文件

-nogroup是查找无组帐号文件

 

下面举几个例子说明一下find的用法

(1)我想找出/etc目录下是passw开头的所有文件

   find /etc -name "passw*" 

这个例子中"*"号是正则匹配中的“所有”的意思

(2)我想找出/var/log目录下所有的前5天的.log文件

   find /var/log -name "*.log" -mtime +5

这个例子中"+5"是指5天以前的文件,如是查"-5"则是5天以内的文件

(3)我想找出/home目录下是"ygl"这个用户的文件

   find /home -user "ygl"

(4)我想找出/home目录下是"ygl"这个用户的所有的普通档的文件

   find /home -user "ygl" -type f

(5)我想找出/var/log目录下的所有的.log文件并查看它的详细信息

   find /var/log -name "*.log" -type f -exec ls -l {} \;

这个例子中用到了可选属性-exec用来执行ls命令,其中的-exec或者-ok的用法都要在它所执行的command后面接" {} \;"

(6)我想查找出在/etc中以passw开头的所有文件中有没有ygl这些内容的

   find /etc -name "passw*" -exec grep -in "ygl" {} \;

posted @ 2006-11-06 09:34 小小程序程序员混口饭吃 阅读(641) | 评论 (0)编辑 收藏
安装

查看软件xxx安装内容

*

dpkg -L xxx

查找软件

*

apt-cache search 正则表达式

查找文件属于哪个包

*

dpkg -S filename
apt-file search filename

查询软件xxx依赖哪些包

*

apt-cache depends xxx

查询软件xxx被哪些包依赖

*

apt-cache rdepends xxx

增加一个光盘源

*

sudo apt-cdrom add

系统升级

*

sudo apt-get update
sudo apt-get dist-upgrade

清除所以删除包的残余配置文件

*

dpkg -l |grep ^rc|awk '{print $2}' |tr ["\n"] [" "]|sudo xargs dpkg -P -

编译时缺少h文件的自动处理

*

sudo auto-apt run ./configure

查看安装软件时下载包的临时存放目录

*

ls /var/cache/apt/archives

系统

查看内核

*

uname -a

查看Ubuntu版本

*

cat /etc/issue

查看内核加载的模块

*

lsmod

查看PCI设备

*

lspci

查看USB设备

*

lsusb

查看网卡状态

*

sudo ethtool eth0

查看CPU信息

*

cat /proc/cpuinfo

显示当前硬件信息

*

lshw

硬盘

查看硬盘的分区

*

sudo fdisk -l

查看硬盘剩余空间

*

df -h
df -H

查看目录占用空间

*

du -hs 目录名

优盘没法卸载

*

sync
fuser -km /media/usbdisk

内存

查看当前的内存使用情况

*

free -l

进程

查看当前有哪些进程

*

ps -A

中止一个进程

*

kill 进程号(就是ps -A中的第一列的数字)
或者 killall 进程名

强制中止一个进程(在上面进程中止不成功的时候使用)

*

kill -9 进程号
或者 killall -9 进程名

查看当前进程的实时状况

*

top

查看进程打开的文件

*

lsof -p

ADSL

配置 ADSL

*

sudo pppoeconf

ADSL手工拨号

*

sudo pon dsl-provider

激活 ADSL

*

sudo /etc/ppp/pppoe_on_boot

断开 ADSL

*

sudo poff

查看拨号日志

*

sudo plog

网络

根据IP查网卡地址

*

arping IP地址

查看当前IP地址

*

sudo ifconfig eth0 |awk '/inet addr/ {split($2,x,":");print x[2]}'

查看当前外网的IP地址

*

w3m -no-cookie -dump www.ip138.com|grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'
w3m -no-cookie -dump ip.loveroot.com|grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'

查看当前监听80端口的程序

*

lsof -i :80

查看当前网卡的物理地址

*

sudo arp -a | awk '{print $4}'
sudo ifconfig eth0 | head -1 | awk '{print $5}'

立即让网络支持nat

*

sudo echo 1 > /proc/sys/net/ipv4/ip_forward
sudo iptables -t nat -I POSTROUTING -j MASQUERADE

查看路由信息

*

netstat -rn
sudo route -n

手工增加删除一条路由

*

sudo route add -net 192.168.0.0 netmask 255.255.255.0 gw 172.16.0.1
sudo route del -net 192.168.0.0 netmask 255.255.255.0 gw 172.16.0.1

修改网卡MAC地址的方法

*

sudo ifconfig eth0 down #关闭网卡
sudo ifconfig eth0 hw ether 00:AA:BB:CC:DD:EE #然后改地址
sudo ifconfig eth0 up #然后启动网卡

统计当前IP连接的个数

*

netstat -na|grep ESTABLISHED|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -r -n
netstat -na|grep SYN|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -r -n

统计当前20000个IP包中大于100个IP包的IP地址

*

tcpdump -tnn -c 20000 -i eth0 | awk -F "." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr | awk ' $1 > 100 '

屏蔽IPV6

*

echo "blacklist ipv6" | sudo tee /etc/modprobe.d/blacklist-ipv6

服务

添加一个服务

*

sudo update-rc.d 服务名 defaults 99

删除一个服务

*

sudo update-rc.d 服务名 remove

临时重启一个服务

*

/etc/init.d/服务名 restart

临时关闭一个服务

*

/etc/init.d/服务名 stop

临时启动一个服务

*

/etc/init.d/服务名 start

设置

配置默认Java使用哪个

*

sudo update-alternatives --config java

修改用户资料

*

sudo chfn userid

给apt设置代理

*

export http_proxy=http://xx.xx.xx.xx:xxx

修改系统登录信息

*

sudo vim /etc/motd

中文

转换文件名由GBK为UTF8

*

sudo apt-get install convmv
convmv -r -f cp936 -t utf8 --notest --nosmart *

转换文件内容由GBK为UTF8

*

iconv -f gbk -t utf8 $i > newfile

转换 mp3 标签编码

*

sudo apt-get install python-mutagen
find . -iname “*.mp3” -execdir mid3iconv -e GBK {} \;

文件

快速查找某个文件

*

whereis filename

*

find 目录 -name 文件名

查看文件类型

*

file filename

显示xxx文件倒数6行的内容

*

tail -n 6 xxx

查找包含xxx字符串的文件

*

grep -l -r xxx .

查找关于xxx的命令

*

apropos xxx
man -k xxx

通过ssh传输文件

*

scp -rp /path/filename username@remoteIP:/path #将本地文件拷贝到服务器上
scp -rp username@remoteIP:/path/filename /path #将远程文件从服务器下载到本地

查看某个文件被哪些应用程序读写

*

lsof 文件名

把所有文件的后辍由rm改为rmvb

*

rename 's/.rm$/.rmvb/' *

把所有文件名中的大写改为小写

*

rename 'tr/A-Z/a-z/' *

删除特殊文件名的文件,如文件名:--help.txt

*

rm -- --help.txt 或者 rm ./--help.txt

查看当前目录的子目录

*

ls -d */. 或 echo */.

压缩

解压缩 xxx.tar.gz

*

tar -zxvf xxx.tar.gz

解压缩 xxx.tar.bz2

*

tar -jxvf xxx.tar.bz2

压缩aaa bbb目录为xxx.tar.gz

*

tar -zcvf xxx.tar.gz aaa bbb

压缩aaa bbb目录为xxx.tar.bz2

*

tar -jcvf xxx.tar.bz2 aaa bbb

Nautilus

显示隐藏文件

*

Ctrl+h

显示地址栏

*

Ctrl+l

特殊 URI 地址

*

* computer:/// - 全部挂载的设备和网络
* network:/// - 浏览可用的网络
* burn:/// - 一个刻录 CDs/DVDs 的数据虚拟目录
* smb:/// - 可用的 windows/samba 网络资源
* x-nautilus-desktop:/// - 桌面项目和图标
* file:/// - 本地文件
* trash:/// - 本地回收站目录
* ftp:// - FTP 文件夹
* ssh:// - SSH 文件夹

查看已安装字体

*

在nautilus的地址栏里输入”fonts:///“,就可以查看本机所有的fonts

程序

详细显示程序的运行信息

*

strace -f -F -o outfile <cmd>

日期和时间

设置日期

*

#date -s mm/dd/yy

设置时间

*

#date -s HH:MM

将时间写入CMOS

*

hwclock --systohc

读取CMOS时间

*

hwclock --hctosys

控制台

不同控制台间切换

*

Ctrl + ALT + ←
Ctrl + ALT + →

指定控制台切换

*

Ctrl + ALT + Fn(n:1~7)

控制台下滚屏

*

SHIFT + pageUp/pageDown

控制台抓图

*

setterm -dump n(n:1~7)

数据库

mysql的数据库存放在地方

*

/var/lib/mysql

从mysql中导出和导入数据

*

mysqldump 数据库名 > 文件名 #导出数据库
mysqladmin create 数据库名 #建立数据库
mysql 数据库名 < 文件名 #导入数据库

忘了mysql的root口令怎么办

*

sudo /etc/init.d/mysql stop
sudo mysqld_safe --skip-grant-tables &
sudo mysqladmin -u user password 'newpassword''
sudo mysqladmin flush-privileges

修改mysql的root口令

*

sudo mysqladmin -uroot -p password '你的新密码'

其它

下载网站文档

*

wget -r -p -np -k http://www.21cn.com
· -r:在本机建立服务器端目录结构;
· -p: 下载显示HTML文件的所有图片;
· -np:只下载目标站点指定目录及其子目录的内容;
· -k: 转换非相对链接为相对链接。

删除Totem电影播放机的播放历史记录

*

rm ~/.recently-used

在桌面上显示计算机,HOME,回收站等图标

*

gconf-editor
找到apps-->nautilus-->desktop
勾选相应选项

Gaim声音设置

*

首选项->声音->声音方式,方式选“命令”,下面的声音命令填上“aplay %s”

清除apt-get cache

*

sudo apt-get clean
posted @ 2006-11-02 14:09 小小程序程序员混口饭吃 阅读(590) | 评论 (0)编辑 收藏

网上转载的,试过,确实能用,这是手动增加SWAP的一个很好的方式,建议在安装LINUX的时候开始就要建一个SWAP,最好是内存的2倍。
linux中增加swap分区文件的步骤方法:

1、检查当前的分区情况(使用free -m或cat /proc/swaps ):
 [root@db2 root]# free -m
              total       used       free     shared    buffers     cached
 Mem:          1006         84        922          0         11         38
 -/+ buffers/cache:         35        971
 Swap:            0          0          0
 [root@db2 root]#

2、增加交换分区文件及大小:
检查没有swap,下面就需要增加:
判定新交换文件的大小,将大小乘以1024来判定块的大小。例如,大小为64MB的交换文件的块大小为65536,在 shell 提示下以根用户身份键入以下命令,其中的 count 等于想要的块大小。

 [root@db2 root]# dd if=/dev/zero of=/home/swap bs=1024 count=1024000
 1024000+0 records in
 1024000+0 records out
 [root@db2 root]#

使用以下命令来设置交换文件:
 [root@db2 root]# mkswap /home/swap
 Setting up swapspace version 1, size = 1023996 KiB
 [root@db2 root]#

3、启用交换分区文件:
要立即启用交换文件而不是在引导时自动启用,使用以下命令:
 [root@db2 root]# swapon /home/swap

检查增加后的交换情况: 
 [root@db2 root]# free -m
              total       used       free     shared    buffers     cached
 Mem:          1006        994         12          0          4        929
 -/+ buffers/cache:         60        946
 Swap:          999          0        999
 [root@db2 root]#
 
要在引导时启用,编辑 /etc/fstab 文件来包含以下行(/home/swap               swap                    swap    defaults        0 0 ):
 [root@db2 root]# vi /etc/fstab
 LABEL=/                 /                       ext3    defaults        1 1       
 LABEL=/boot             /boot                   ext2    defaults        1 2      /home/swap               swap                    swap    defaults        0 0
        none                    /dev/pts                devpts  gid=5,mode=620  0 0     
        none                    /proc                   proc    defaults        0 0     
        none                    /dev/shm                tmpfs   defaults        0 0     
        LABEL=/usr              /usr                    ext3    defaults        1 2     
        /dev/sda5               swap                    swap    defaults        0 0     
        /dev/cdrom              /mnt/cdrom              iso9660 noauto,owner,kudzu,ro 0 0
        /dev/fd0                /mnt/floppy             auto    noauto,owner,kudzu 0 0  
        /home/swap               swap                    swap    defaults        0 0  
系统下次引导时,它就会启用新建的交换文件         
再次检查添加后的情况:
 [root@db2 oracledb]# free -m                                            
                     total       used       free     shared    buffers     cached
        Mem:          1006        979         27          0          6        917
        -/+ buffers/cache:         54        952                                
        Swap:          999          0        999                                
        [root@db2 oracledb]#     

posted @ 2006-11-02 13:49 小小程序程序员混口饭吃 阅读(4372) | 评论 (0)编辑 收藏
#!/bin/bash
#Copyright (c) 2005 ubuntu.org.cn
#License: GPLv2

#需要安装编码转换器
#sudo apt-get install recode

#mp3的地址
SOURCE="http://list.mp3.baidu.com/list/newhits.html"

#保存mp3的目录
SAVE="${HOME}/mp3100"

#下载重试次数
TRYCOUNT=2

#临时目录
TMP="/tmp/${USER}"

#创建下载目录
if [ ! -d "${SAVE}" ];then
    mkdir -p "${SAVE}"
fi

#创建临时下载目录
if [ ! -d "${TMP}" ];then
    mkdir -p "${TMP}"
fi

echo "开始下载百度最新100首歌曲列表"
wget -O ${TMP}/mp3.html ${SOURCE}
echo "下载百度最新100首歌曲列表完成。"

#转换网页编码
iconv -f gbk -t utf8 ${TMP}/mp3.html |\

grep "<a href=\"http://mp3.baidu.com/m" |\

#将mp3list.txt所有开头的空格去掉
sed -e 's/ *//' |\

#将mp3list.txt所有全角空格去掉
sed -e 's/ //g' |\

#将所有的回车符去掉
sed ':a;N;$!ba;s/\n/,/g' |\

#在td>,后面加上回车符,一行表示一个mp3文件。
sed -e 's/,<td/\n<td/g' |\
sed -e 's/td>,/td>\n/g' |\

#删除<td width="30%"> <td> </td> <td...FFFFFF"> <p> </p>
sed -e 's/<td width="30%">//g' |\
sed -e 's/<td>//g' |\
sed -e 's/<\/td>//g' |\
sed -e 's/<p>//g' |\
sed -e 's/<\/p>//g' |\
sed -e 's/<td.*FFFFFF">//g' |\

#删除</a>..."_blank">
sed -e 's/<\/a>.*_blank">/-/g' |\
sed -e 's/<\/a>.*_blank>/-/g' |\

#删除&amp;
sed -e 's/\&amp\;/\//g' >${TMP}/mp3list.txt

#得到:<a href="http://mp3.baidu.com/m?tn=baidump3&ct=134217728&lm=-1&li=2&word=Baby%20Baby%20tell%20me%20%CD%F5%D0%C4%C1%E8" target="_blank">Baby ,Baby tell me-王心凌</a>

#取得行号,循环
line=$(awk 'END{print NR}' ${TMP}/mp3list.txt)
i=1;
while((i<=line));do
   downed=0;
   mpline=`awk 'NR=='"$i"'' ${TMP}/mp3list.txt`
   url=`echo $mpline | sed -e 's/<a href="//g' | sed 's/\ target.*//g' | sed 's/"//g' | cat`
   name=`echo $mpline | sed -e 's/.*_blank">//g' | sed -e 's/.*_blank>//g' |\
        sed -e 's/<\/a>//g' | sed -e 's/\//-/g' | sed -e 's/:/-/g'  | sed -e 's/"/'\''/g'  | cat`
 
   #检查是否已经下载过这首歌,如果下载过,放弃
   if [ -e "${SAVE}/${name}.mp3" ] || [ -e "${SAVE}/${name}.wma" ]; then
      echo -e "\e[1;6m\e[1;31m发现 ${name} 下载过,忽略,继续下一首。\e[1;6m\e[00m"
      ((i++))
      continue;
   fi

   echo "开始通过 $url 下载 $name";
   wget -O ${TMP}/down.html $url
   echo "获取 $name 下载列表完成。";

   ##### 找出有效的歌曲下载地址并根据下载文件的大小从大至少排序 ###############
   #down.txt为有效的下载地址
   iconv -f gbk -t utf8 -c ${TMP}/down.html | grep "<td height=\"28\" class=\"d\">" |\
   sed -e 's/.*<a href="//g' | sed -e 's/" target=_blank>.*//g' |\
   sed '/mid/d' > ${TMP}/down.txt

   #size.txt为有效的下载文件大小
   iconv -f gbk -t utf8 -c ${TMP}/down.html | grep "M<\/td>" |\
   sed -e 's/<td class="t">//g' | sed -e 's/ M<\/td>//g' > ${TMP}/size.txt

   #down.txt与size.txt合并而在的down_size.txt文件中字段之间以" "作为分隔符
   paste -d ' ' ${TMP}/down.txt ${TMP}/size.txt > ${TMP}/down_size.txt

   #得到以下形式 (下载地址 文件大小)
   #http://wma2.7t7t.com/pycs/pycs/311/370247.Wma 1.2
   #http://snakelmq.hfxyd.com/milk/babybabytellme.mp3 3.2
   #http://bbsatt2.ccmove.com.cn/download/1280590/baby%20baby%20tell%20me%28PXC%D6%C6%D7%F7%29.mp3 0.3
   #http://vod.music165.com/music/song/new02/wxl_05.07.29/3.Wma 1.6
   #http://202.107.247.54/16/0406/94/3.wma 1.6

   #排序
   sort "+1nr" ${TMP}/down_size.txt > ${TMP}/down_size_sort.txt

   #去掉后面的尺寸
   sed 's/ .*$//' ${TMP}/down_size_sort.txt > ${TMP}/temp.txt
   
   ##### 析取出mp3 的下载地址或 wma的下载地址 ##############
   grep -i "mp3$" ${TMP}/temp.txt > ${TMP}/down_mp3.txt
   grep -i "wma$" ${TMP}/temp.txt > ${TMP}/down_wma.txt

   downline_mp3=$(awk 'END{print NR}' ${TMP}/down_mp3.txt);
   downline_wma=$(awk 'END{print NR}' ${TMP}/down_wma.txt);
   echo -e "\e[1;6m\e[1;31m发现 ${downline_mp3} 个名为 ${name}.mp3 下载地址。\e[1;6m\e[00m"
   echo -e "\e[1;6m\e[1;31m发现 ${downline_wma} 个名为 ${name}.wma 下载地址。\e[1;6m\e[00m"
   # 初始化计数器
   j=1;
   # 优先下载mp3格式的歌曲
   while((j<=downline_mp3)); do
      mp3=`awk 'NR=='"$j"'' ${TMP}/down_mp3.txt`
      echo -e "\e[1;6m\e[1;31m正在下载${name}.mp3\e[1;6m\e[00m"
      wget -c --tries=$TRYCOUNT $mp3 -O "${TMP}/${name}.mp3"
      if [ "$?" = 0 ]; then
         if [ `file -ib "${TMP}/${name}.mp3" | sed -e 's/\/.*//g'` = "audio" ]; then
            mv "${TMP}/${name}.mp3" "${SAVE}/${name}.mp3"
            downed=1;
            break;
         else
            echo -e "\e[1;6m\e[1;31m下载 ${name}.mp3 文件无效,正在删除重新下载\e[1;6m\e[00m"
            rm "${TMP}/${name}.mp3";
            ((j++))   
         fi
      else
         echo -e "\e[1;6m\e[1;31m下载 ${name}.mp3 文件无效,正在删除重新下载\e[1;6m\e[00m"
         rm "${TMP}/${name}.mp3";
         ((j++))
      fi
   done

   #如果下载成功继续下其余的歌
   #continue用于跳过循环体中的后续命令
   if [ "$downed" = 1 ] ; then
      ((i++))
      echo -e "\e[1;7m\e[1;41m下载 $name 成功\e[1;7m\e[00m"
      continue;
   fi

   # 如果没有mp3格式的则下载wma格式的歌
   j=1;
   while((j<=downline_wma)); do
      wma=`awk 'NR=='"$j"'' ${TMP}/down_wma.txt`
      echo -e "\e[1;6m\e[1;31m正在下载${name}.wma\e[1;6m\e[00m"
      wget -c --tries=$TRYCOUNT $wma -O "${TMP}/${name}.wma"
      if [ "$?" = 0 ]; then
         if [ `file -ib "${TMP}/${name}.wma" | sed -e 's/\/.*//g'` = "application" ]; then
            mv "${TMP}/${name}.wma" "${SAVE}/${name}.wma"
            downed=1;
            break;
         else
            echo -e "\e[1;6m\e[1;31m下载 ${name}.wma 文件无效,正在删除重新下载\e[1;6m\e[00m"
            rm "${TMP}/${name}.wma";
            ((j++))   
         fi
      else
          echo -e "\e[1;6m\e[1;31m下载 ${name}.wma 文件无效,正在删除重新下载\e[1;6m\e[00m"
          rm "${TMP}/${name}.wma";
          ((j++))
      fi
   done

   ((i++))
   if [ "$downed" = 1 ] ; then
      echo -e "\e[1;7m\e[1;41m下载 $name 成功\e[1;7m\e[00m"
   else
      echo -e "\e[1;7m\e[1;41m下载 $name 失败\e[1;7m\e[00m"
   fi
done
rm -fr ${TMP}
exit 0

原理是用wget下载下页面来,然后用SED来提取页面,提取到连接后下载

posted @ 2006-10-27 15:41 小小程序程序员混口饭吃 阅读(1148) | 评论 (1)编辑 收藏

(1) ubuntu 6.06

(2): 由于 ubuntu debian 的内核,所以要在 oracle 官方上下载 oracle-xe-universal_10.2.0.1-1.0_i386.deb

 

开始安装(先看下面要注意的问题,第四项)

 

1:dpkg –I oracle-xe-universal_10.2.0.1-1.0_i386.deb

 

出现一下问题

 

正在解压缩将用于更替的包文件 oracle-xe-universal ...

dpkg :依赖关系问题使得 oracle-xe-universal 的配置工作不能继续:

 oracle-xe-universal 依赖于 libaio (>= 0.3.96) | libaio1 (>= 0.3.96);然而:

  软件包 libaio还没有被安装。

  软件包 libaio1还没有被安装。

dpkg :处理 oracle-xe-universal (--install)时出错:

  依赖关系问题 - 仍未被配置

在处理时有错误发生:

 oracle-xe-universal

 

原来是libaio缺少,没有安装,我就下载下来,是个rpm,然后安装这个rpm

 

sudo apt-get libaio-0.3.96-7.i386.rpm

 

正在读取软件包列表... 完成

正在分析软件包的依赖关系树... 完成

E: 无法找到软件包 libaio-0.3.96-7.i386.rpm

 

真是郁闷反复试验都不行

 

 

放弃这样安装,到网上查找其他方案安装libaio

 

网上说采用apt-get -f install安装方式可能自动获取包

 

 

apt-get -f  install 果然可以日志如下

root@ubuntu:/home/oem# apt-get -f  install

正在读取软件包列表... 完成

正在分析软件包的依赖关系树... 完成

正在更正依赖关系... 完成

将会安装下列额外的软件包:

  libaio1

下列【新】软件包将被安装:

  libaio1

共升级了 0 个软件包,新安装了 1 个软件包,要卸载 0 个软件包,有 7 个软件未被升级。

1 个软件包没有被完全安装或卸载。

需要下载 5182B 的软件包。

解压缩后会消耗掉 61.4kB 的额外空间。

您希望继续执行吗?[Y/n]y

获取:1 http://mirror.lupaworld.com dapper/main libaio1 0.3.104-1ubuntu6 [5182B]下载 5182B,耗时 2s (2346B/s)

选中了曾被取消选择的软件包 libaio1

( 正在读取数据库 ... 系统当前总共安装有 76207 个文件和目录。)

正在解压缩 libaio1 ( .../libaio1_0.3.104-1ubuntu6_i386.deb) ...

正在设置 libaio1 (0.3.104-1ubuntu6) ...

 

正在设置 oracle-xe-universal (10.2.0.1-1.0) ...

Executing Post-install steps...

You must run '/etc/init.d/oracle-xe configure' as the root user to configure the database.

 

 

2

 

root@ubuntu:/home/oem#  /etc/init.d/oracle-xe configure

 

 

Oracle Database 10g Express Edition Configuration

-------------------------------------------------

This will configure on-boot properties of Oracle Database 10g Express

Edition.  The following questions will determine whether the database should

be starting upon system boot, the ports it will use, and the passwords that

will be used for database accounts.  Press <Enter> to accept the defaults.

Ctrl-C will abort.

 

Specify the HTTP port that will be used for Oracle Application Express [8080]:8080

 

Specify a port that will be used for the database listener [1521]:1521

 

Specify a password to be used for database accounts.  Note that the same

password will be used for SYS and SYSTEM.  Oracle recommends the use of

different passwords for each database account.  This can be done after

initial configuration:

Confirm the password:

 

Do you want Oracle Database 10g Express Edition to be started on boot (y/n) [y]:y

 

Starting Oracle Net Listener...Done

Configuring Database...

 

Starting Oracle Database 10g Express Edition Instance...Done

Installation Completed Successfully.

To access the Database Home Page go to "http://127.0.0.1:8080/apex"

 

 

  这就安装完了?真是不可思以,比9I快很多啊,总共花了10几分钟,中间的配置少了好多啊。

 

3 :访问数据

http://127.0.0.1:8080/apex

根据设置的密码没有问题,能够正确访问

 

 

4: 需要注意的问题:

在刚开始安装的时候可能出现一下问题

 

root@ubuntu:/home/oem# dpkg -i oracle-xe-universal_10.2.0.1-1.0_i386.deb

选中了曾被取消选择的软件包 oracle-xe-universal

( 正在读取数据库 ... 系统当前总共安装有 73613 个文件和目录。)

正在解压缩 oracle-xe-universal ( oracle-xe-universal_10.2.0.1-1.0_i386.deb) ...

This system does not meet the minimum requirements for swap space.  Based on

the amount of physical memory available on the system, Oracle Database 10g

Express Edition requires 750 MB of swap space. This system has 711 MB

of swap space.  Configure more swap space on the system and retry the installation.

dpkg :处理 oracle-xe-universal_10.2.0.1-1.0_i386.deb (--install)时出错:

  子进程·pre-installation script·返回了错误号·1

在处理时有错误发生:

 oracle-xe-universal_10.2.0.1-1.0_i386.deb

 

这个问题是由于SWAP分区不够的原因造成的,那就增加一个SWAP分区


 

1 :采用文件的方式增加swap分区

Dd if=/dev/zero of=/tmp/tmp.swap bs=1M count =100( 建立一个100M的文件)

mkswap /tmp/tmp.swap( 标识swap文件)

swapon /tmp/tmp.swap( 激活swap)

修改/etc/fstab文件增加一行

 

/tmp/tmp.swap swap swap defaluts 0 0

Swapon –s 查看当前的swap分区情况

发现已经有2SWAP分区了,空间这下子够了,可以继续安装了

 

2 :也可已采用直接增加SWAP方式(我没有采用这样的办法)

 

 

 

 

 

 

posted @ 2006-10-23 11:13 小小程序程序员混口饭吃 阅读(2162) | 评论 (0)编辑 收藏
昨天晚上,我们排着整齐的队伍来到电影院观看了电影《夜宴》。电影票好贵哟,不过老师说,能够看到章子怡阿姨光溜溜的背影,再贵也是值得的。

许多同学都不明白什么叫“夜宴”,我的语文功底比较好,于是就告诉他们“夜宴”其实就是“晚饭”的意思。只不过穷人的“晚饭”是“晚饭”,而有钱人的“晚饭”叫“夜宴”。

以前我总认为皇帝是天下最幸福的职业了,看了《夜宴》才知道,其实皇帝也很不开心。葛优叔叔演的皇帝是那么的爱章阿姨,经常给她做推油按摩,还关心她晚上睡觉“这么大的人还蹬被子”。葛叔叔的心肠很好,当他看到一个老爷爷被人用棍子打时,忍不住说“太残酷了”。最重要的是,葛叔叔为人非常正直,一些人劝他用假太子和契丹人交换,他却说:“我不学他!泱泱大国,诚信为本……”联想到这世界上还有那么多生产假冒伪劣、不诚信的商家,葛叔叔的情操是多么的高尚啊!中央电视台的3·15晚会应该请葛叔叔去倡导诚信宣言。


    可是章阿姨一点都不喜欢葛叔叔,一边给他下毒酒,一边还穿得很少和一个长得很帅的面具哥哥跳芭蕾舞。章阿姨当皇后之前一定是个发廊的洗头妹,因为她在皇宫里给太子睡洗头发时的指法非常专业。葛叔叔本来是可以叫卫兵杀章阿姨的,可他却毅然喝下了那杯毒酒,倒在阿姨的怀中,死的时候一直喃喃地说:“是复仇的火焰让你穿越了死亡之谷,抑或是你的忧郁打动了女人的心,让她们维系着你的生命?百般算计都不如一颗单纯的心……”看到这里,我们全班同学都忍不住流下了同情的眼泪。葛叔叔啊,你实在是太傻了啊!以你的才华,活到今天,再孬也能混成个汪国真,为什么要去迷恋那个并不爱你的洗头妹吗?


    说到这里,我很想谴责那些贩毒的坏人。电影中有个老爷爷,专门就是贩毒的,只要谁有钱,就可以到他那里买毒品,美丽的周迅姐姐就是被他卖出的摇头丸毒死的。老师告诉我们要“珍惜生命,远离毒品”,我们一定要牢牢记住,周姐姐的血是不能白流的!


    还有一点我很不明白,黄晓明哥哥和周迅姐姐之间的感情好奇怪哦!

老师教育我们,近亲之间不能耍朋友,不能结婚。可他们本来是兄妹,看起来却像是一对情侣,也许是他们不懂这些知识吧。从电影中,我又明白了一个道理,那就是学习不能偏科,不但要学好语文、数学、英语,还要学好《生理卫生》。不然就可能和黄哥哥一样,爱上自己的亲妹妹,一旦生下低能儿,后悔也就晚了。


    许多同学看完《夜宴》后都说没看懂,不懂葛叔叔手下部队那么多为什么还要自杀;不懂章阿姨武功那么高想杀葛叔叔随便趁晚上一起睡觉时动手就是,为什么还要买毒品下毒酒那么麻烦;特别没看懂的是究竟谁用飞刀把章阿姨杀死了的。我想了半天也没想明白,看来这个事情只有请警察叔叔帮忙了。公安局承诺了的,命案必破!才一顿晚饭的时间,就死了那么多人,他们不能不管吧?我相信,总有一天,章阿姨被害真相会大白于天下的!


    当然,看了《夜宴》最大的收获就是让我们认识到,古代封建社会治安真的太乱了,皇宫里都并不安全,更何况民间了。我们要珍惜身边来之不易的安定团结生活,好好学习,天天向上,长大了为建设和谐社会而贡献自己的力量。


来自http://forum.techweb.com.cn/viewthread.php?tid=40238
posted @ 2006-10-20 09:21 小小程序程序员混口饭吃 阅读(485) | 评论 (0)编辑 收藏

    
  先用gunzip   lnx_920_disk1.cpio.gz  
   
          cpio   -idmv   <   lnx_920_disk1.cpio
posted @ 2006-10-18 18:00 小小程序程序员混口饭吃 阅读(1470) | 评论 (0)编辑 收藏
1:买一度电用多个灯泡,电业局不管
2:买一吨水用多个水龙头,也没有人管
3:按一部电话多个分机也没有人管
4:一个人家里有3台电脑必须用安装3条宽待?

真是操!体制造成垄断!
posted @ 2006-10-18 09:13 小小程序程序员混口饭吃 阅读(817) | 评论 (4)编辑 收藏

1:门前number one

在上车之前一定要占据门前的一个位置,这需要技巧,事先看准车要停的位置
一般来说车停的位置是固定的,你看那个黄色的线的颜色就可以了,要是颜色黯淡了就证明
是车门的位置,因为人员来往频繁,把黄色踩掉了,提前上车更容易找到大位置

2:车头车尾和中间

一般来说车头车尾和中间的2个车门人数较少,这是我观察的结果,从第3个车门开始人很多,
到了中间人减少一些,所以选择上车的车厢位置很关键

3:观其色,看其年龄

在西直门上车后如果没有座位一定要选择一个年长一点的有座位的,你站在边上,
据我观察,在积水谭下车的人都是些40来岁的,可能这里的国有企业比较多把,年轻人一般
在东直门,朝阳门,建国门下,特别是穿着光鲜的人,一定不要站在他座位边上,一般来说他
在外企,外企的位置基本在东直门,朝阳门,建国门,所以你就要站着了。

4:研究行为学和心理学,抢座位也要讲理
观察下车人的行为,观察没有座位人的心里,不要跟老弱病残抢,当然要礼让了


5:以上几条是常用的,还有好多没有时间总结,总之我每天基本上都有座位

posted @ 2006-10-17 17:34 小小程序程序员混口饭吃 阅读(875) | 评论 (1)编辑 收藏
摘 要:介绍了Servlet多线程机制,通过一个实例并结合Java 的内存模型说明引起Servlet线程不安全的原因,给出了保证Servlet线程安全的三种解决方案,并说明三种方案在实际开发中的取舍。

  关键字:Servlet 线程安全 同步 Java内存模型 实例变量

  Servlet/JSP技术和ASP、PHP等相比,由于其多线程运行而具有很高的执行效率。由于Servlet/JSP默认是以多线程模式执行的,所以,在编写代码时需要非常细致地考虑多线程的安全性问题。然而,很多人编写Servlet/JSP程序时并没有注意到多线程安全性的问题,这往往造成编写的程序在少量用户访问时没有任何问题,而在并发用户上升到一定值时,就会经常出现一些莫明其妙的问题。

  Servlet的多线程机制
 
  Servlet体系结构是建立在Java多线程机制之上的,它的生命周期是由Web容器负责的。当客户端第一次请求某个Servlet时,Servlet容器将会根据web.xml配置文件实例化这个Servlet类。当有新的客户端请求该Servlet时,一般不会再实例化该Servlet类,也就是有多个线程在使用这个实例。Servlet容器会自动使用线程池等技术来支持系统的运行,如图1所示。


图1 Servlet线程池

  这样,当两个或多个线程同时访问同一个Servlet时,可能会发生多个线程同时访问同一资源的情况,数据可能会变得不一致。所以在用Servlet构建的Web应用时如果不注意线程安全的问题,会使所写的Servlet程序有难以发现的错误。

  Servlet的线程安全问题

  Servlet的线程安全问题主要是由于实例变量使用不当而引起的,这里以一个现实的例子来说明。

Import javax.servlet. *;
Import javax.servlet.http. *;
Import java.io. *;
Public class Concurrent Test extends HttpServlet {PrintWriter output;
Public void service (HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {String username;
Response.setContentType ("text/html; charset=gb2312");
Username = request.getParameter ("username");
Output = response.getWriter ();
Try {Thread. sleep (5000); //为了突出并发问题,在这设置一个延时
} Catch (Interrupted Exception e){}
output.println("用户名:"+Username+"<BR>");
}
}

  该Servlet中定义了一个实例变量output,在service方法将其赋值为用户的输出。当一个用户访问该Servlet时,程序会正常的运行,但当多个用户并发访问时,就可能会出现其它用户的信息显示在另外一些用户的浏览器上的问题。这是一个严重的问题。为了突出并发问题,便于测试、观察,我们在回显用户信息时执行了一个延时的操作。假设已在web.xml配置文件中注册了该Servlet,现有两个用户a和b同时访问该Servlet(可以启动两个IE浏览器,或者在两台机器上同时访问),即同时在浏览器中输入:

  a: http://localhost: 8080/servlet/ConcurrentTest? Username=a

  b: http://localhost: 8080/servlet/ConcurrentTest? Username=b

  如果用户b比用户a回车的时间稍慢一点,将得到如图2所示的输出:


图2 a用户和b用户的浏览器输出

  从图2中可以看到,Web服务器启动了两个线程分别处理来自用户a和用户b的请求,但是在用户a的浏览器上却得到一个空白的屏幕,用户a的信息显示在用户b的浏览器上。该Servlet存在线程不安全问题。下面我们就从分析该实例的内存模型入手,观察不同时刻实例变量output的值来分析使该Servlet线程不安全的原因。

  Java的内存模型JMM(Java MemoryModel)JMM主要是为了规定了线程和内存之间的一些关系。根据JMM的设计,系统存在一个主内存(Main Memory),Java中所有实例变量都储存在主存中,对于所有线程都是共享的。每条线程都有自己的工作内存(Working Memory),工作内存由缓存和堆栈两部分组成,缓存中保存的是主存中变量的拷贝,缓存可能并不总和主存同步,也就是缓存中变量的修改可能没有立刻写到主存中;堆栈中保存的是线程的局部变量,线程之间无法相互直接访问堆栈中的变量。根据JMM,我们可以将论文中所讨论的Servlet实例的内存模型抽象为图3所示的模型。


图3 Servlet实例的JMM模型

  下面根据图3所示的内存模型,来分析当用户a和b的线程(简称为a线程、b线程)并发执行时,Servlet实例中所涉及变量的变化情况及线程的执行情况,如图4所示。

调度时刻 a线程b线程
T1访问Servlet页面 
T2  访问Servlet页面
T3 output=a的输出username=a休眠5000毫秒,让出CPU  
T4  output=b的输出(写回主存)username=b休眠5000毫秒,让出CPU
T5 在用户b的浏览器上输出a线程的username的值,a线程终止。 
T6 在用户b的浏览器上输出b线程的username的值,b线程终止。
                  图4 Servlet实例的线程调度情况

  从图4中可以清楚的看到,由于b线程对实例变量output的修改覆盖了a线程对实例变量output的修改,从而导致了用户a的信息显示在了用户b的浏览器上。如果在a线程执行输出语句时,b线程对output的修改还没有刷新到主存,那么将不会出现图2所示的输出结果,因此这只是一种偶然现象,但这更增加了程序潜在的危险性。
设计线程安全的Servlet

  通过上面的分析,我们知道了实例变量不正确的使用是造成Servlet线程不安全的主要原因。下面针对该问题给出了三种解决方案并对方案的选取给出了一些参考性的建议。

  1、实现 SingleThreadModel 接口

  该接口指定了系统如何处理对同一个Servlet的调用。如果一个Servlet被这个接口指定,那么在这个Servlet中的service方法将不会有两个线程被同时执行,当然也就不存在线程安全的问题。这种方法只要将前面的Concurrent Test类的类头定义更改为:

Public class Concurrent Test extends HttpServlet implements SingleThreadModel {
…………
}

  2、同步对共享数据的操作

  使用synchronized 关键字能保证一次只有一个线程可以访问被保护的区段,在本论文中的Servlet可以通过同步块操作来保证线程的安全。同步后的代码如下:

…………
Public class Concurrent Test extends HttpServlet { …………
Username = request.getParameter ("username");
Synchronized (this){
Output = response.getWriter ();
Try {
Thread. Sleep (5000);
} Catch (Interrupted Exception e){}
output.println("用户名:"+Username+"<BR>");
}
}
}

  3、避免使用实例变量

  本实例中的线程安全问题是由实例变量造成的,只要在Servlet里面的任何方法里面都不使用实例变量,那么该Servlet就是线程安全的。

  修正上面的Servlet代码,将实例变量改为局部变量实现同样的功能,代码如下:

……
Public class Concurrent Test extends HttpServlet {public void service (HttpServletRequest request, HttpServletResponse
Response) throws ServletException, IOException {
Print Writer output;
String username;
Response.setContentType ("text/html; charset=gb2312");
……
}
}

  对上面的三种方法进行测试,可以表明用它们都能设计出线程安全的Servlet程序。但是,如果一个Servlet实现了SingleThreadModel接口,Servlet引擎将为每个新的请求创建一个单独的Servlet实例,这将引起大量的系统开销。SingleThreadModel在Servlet2.4中已不再提倡使用;同样如果在程序中使用同步来保护要使用的共享的数据,也会使系统的性能大大下降。这是因为被同步的代码块在同一时刻只能有一个线程执行它,使得其同时处理客户请求的吞吐量降低,而且很多客户处于阻塞状态。另外为保证主存内容和线程的工作内存中的数据的一致性,要频繁地刷新缓存,这也会大大地影响系统的性能。所以在实际的开发中也应避免或最小化 Servlet 中的同步代码;在Serlet中避免使用实例变量是保证Servlet线程安全的最佳选择。从Java 内存模型也可以知道,方法中的临时变量是在栈上分配空间,而且每个线程都有自己私有的栈空间,所以它们不会影响线程的安全。

  小结

  Servlet的线程安全问题只有在大量的并发访问时才会显现出来,并且很难发现,因此在编写Servlet程序时要特别注意。线程安全问题主要是由实例变量造成的,因此在Servlet中应避免使用实例变量。如果应用程序设计无法避免使用实例变量,那么使用同步来保护要使用的实例变量,但为保证系统的最佳性能,应该同步可用性最小的代码路径。
posted @ 2006-09-19 11:43 小小程序程序员混口饭吃 阅读(545) | 评论 (0)编辑 收藏

     在美国麻省Amherst学院进行了一项很有意思的实验。试验人员用很多铁圈将一个小南瓜整个箍住,以观察当南瓜逐渐地长大时,对这个铁圈产生压力有多大。最初他们估计南瓜最大能够承受大约五百磅的压力。
 
  在实验的第一个月,南瓜承受了五百磅的压力;实验到第二个月时,这个南瓜承受了一千五百磅的压力,并且当它承受到两千磅的压力时,研究人员必须对铁圈加固,以免南瓜将铁圈撑开。
 
  最后当研究结束时,整个南瓜承受了超过五千磅的压力后才产生瓜皮破裂。
 
  他们打开南瓜并且发现它已经无法再食用,因为它的中间充满了坚韧牢固的层层纤维,试图想要突破包围它的铁圈。为了吸收充分的养分,以便于突破限制它成长的铁圈,它的根部甚至延展超过八万英呎,所有的根往不同的方向全方位的伸展,最后这个南瓜独自地接管控制了整个花园的土壤与资源。
 
  我们对于自己能够变成多么坚强都毫无概念!假如南瓜能够承受如此庞大的外力,那么人类在相同的环境下又能够承受多少的压力.

posted @ 2006-08-09 09:22 小小程序程序员混口饭吃 阅读(531) | 评论 (1)编辑 收藏

检查点(checkpoint)的工作机制

检查点是一个数据库事件,它把修改数据从高速缓存写入磁盘,并更新控制文件和数据文件。

检查点分为三类:
1)局部检查点:单个实例执行数据库所有数据文件的一个检查点操作,属于此实例的全部脏缓存区写入数据文件。
触发命令:
svmrgrl>alter system checkpoint local;
这条命令显示的触发一个局部检查点。
2)全局检查点:所有实例(对应并行数据服务器)执行数据库所有所有数据文件的一个检查点操作,属于此实例的全部脏缓存区写入数据文件。
触发命令
svrmgrl>alter system checkpoint global;
这条命令显示的触发一个全局检查点。
3)文件检查点:所有实例需要执行数据文件集的一个检查点操作,如使用热备份命令alter tablespace USERS begin backup,或表空间脱机命令alter tablespace USERS offline,将执行属于USERS表空间的所有数据文件的一个检查点操作。

检查点处理步骤:
1)获取实例状态队列:实例状态队列是在实例状态转变时获得,ORACLE获得此队列以保证检查点执行期间,数据库处于打开状态;
2)获取当前检查点信息:获取检查点记录信息的结构,此结构包括当前检查点时间、活动线程、进行检查点处理的当前线程、日志文件中恢复截止点的地址信息;
3)缓存区标识:标识所有脏缓存区,当检查点找到一个脏缓存区就将其标识为需进行刷新,标识的脏缓存区由系统进程DBWR进行写操作,将脏缓存区的内容写入数据文件;
4)脏缓存区刷新:DBWR进程将所有脏缓存区写入磁盘后,设置一标志,标识已完成脏缓存区至磁盘的写入操作。系统进程LGWR与CKPT进程将继续进行检查,直至DBWR进程结束为止;
5)更新控制文件与数据文件。
注:控制文件与数据文件头包含检查点结构信息。
在两种情况下,文件头中的检查点信息(获取当前检查点信息时)将不做更新:
1)数据文件不处于热备份方式,此时ORACLE将不知道操作系统将何时读文件头,而备份拷贝在拷贝开始时必须具有检查点SCN;
ORACLE在数据文件头中保留一个检查点的记数器,在正常操作中保证使用数据文件的当前版本,在恢复时防止恢复数据文件的错误版本;即使在热备份方式下,计数器依然是递增的;每个数据文件的检查点计数器,也保留在控制文件相对应数据文件项中。
2)检查SCN小于文件头中的检查点SCN的时候,这表明由检查点产生的改动已经写到磁盘上,在执行全局检查点的处理过程中,如果一个热备份快速检查点在更新文件头时,则可能发生此种情况。应该注意的是,ORACLE是在实际进行检查点处理的大量工作之前捕获检查SCN的,并且很有可能被一条象热备份命令 alter tablespace USERS begin backup进行快速检查点处理时的命令打断。
ORACLE在进行数据文件更新之前,将验证其数据一致性,当验证完成,即更新数据文件头以反映当前检查点的情况;未经验证的数据文件与写入时出现错误的数据文件都被忽略;如果日志文件被覆盖,则这个文件可能需要进行介质恢复,在这种情况下,ORACLE系统进程DBWR将此数据文件脱机。

检查点算法描述:
脏缓存区用一个新队列链接,称为检查点队列。对缓存区的每一个改动,都有一个与其相关的重做值。检查点队列包含脏的日志缓存区,这些缓存区按照它们在日志文件中的位置排序,即在检查点队列中,缓存区按照它们的低重做值进行排序。需要注意的是,由于缓存区是依照第一次变脏的次序链接到队列中的,所以,如果在缓存区写出之前对它有另外的改动,链接不能进行相应变更,缓存区一旦被链接到检查点队列,它就停留在此位置,直到将它被写出为止。

ORACLE系统进程DBWR在响应检查点请求时,按照这个队列的低重做值的升序写出缓存区。每个检查点请求指定一个重做值,一旦DBWR写出的缓存区重做值等于或大雨检查点的重做值,检查点处理即完成,并将记录到控制文件与数据文件。
由于检查点队列上的缓存区按照低重做值进行排序,而DBWR也按照低重做值顺序写出检查点缓存区,故可能有多个检查点请求处于活动状态,当DBWR写出缓存区时,检查位于检查点队列前端的缓存区重做值与检查点重做值的一致性,如果重做值小于检查点队列前缓存区的低重做值的所有检查点请求,即可表示处理完成。当存在未完成的活动检查点请求时,DBWR继续写出检查点缓存区。

算法特点:
1)DBWR能确切的知道为满足检查点请求需要写那些缓存区;
2)在每次进行检查点写时保证指向完成最早的(具有最低重做值的)检查点;
3)根据检查点重做值可以区别多个检查点请求,然后按照它们的顺序完成处理。


SQL> show parameter log_check;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_checkpoint_interval              integer     0
log_checkpoint_timeout               integer     1800
log_checkpoints_to_alert             boolean     FALSE
SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
------------------
            928767

 

##########################

今天学习过程中遇到一下问题

SQL> alter database open;
alter database open
*
ERROR 位于第 1 行:
ORA-01113: 文件 1 需要介质恢复
ORA-01110: 数据文件 1: 'E:\ORACLE\ORADATA\TESTABC\SYSTEM01.DBF'


#################################
改为非归档模式
archive log stop;

#################################


SQL> recover database;
完成介质恢复。
SQL> alter database open;

数据库已更改。

可以OPERN了,


#################################
查看数据文件的状态

SQL> select name,status from v$datafile;     


##################################


 

posted @ 2006-07-20 15:56 小小程序程序员混口饭吃 阅读(464) | 评论 (0)编辑 收藏

            

 

1 agent,tnslistener 都启动起来, OracleServiceTESTDB 实例也在服务里面启动起来了

2 oem 档案库也建立好了,就建立在 OracleServiceTESTDB 数据库上

 

3 :万事具备了,启动 OracleOraHome92ManagementServer, 报异常出来

 

 

服务器后又停止了,一些服务自动停止,如果他们没什么可做得,例如性能日志和警报服务

 

郁闷啊

 

  接下来我做了一下事情

 

 1 :重新建立了档案库,然后启动 OracleOraHome92ManagementServer 仍然没有成功

 2 ,TNSLISTNER OracleOraHome92ManagementServer OracleServiceTESTDB AGENT 都设置成自动启动,重新启动了机器吧,仍然没有成功

3 :重新安装了 ORACLE 然后重新做了以上事情,仍然没有成功

 

根据网上得资料和自己得实践发现一下问题

 

1
我自己得机器是路由器给得
IP ,不是自己机器设定得固定 IP ,在 XP 下面搜索了 C:

Hosts 文件,路径 C:\WINDOWS\system32\drivers\etc\hosts

 

127.0.0.1       localhost

10.200.7.71     USER-3286972EF7

把分配给自己得 IP ,和自己得主机名对应一下,就是说加上第二行,然后重新启动机器,

OMS 就启动起来了,
2:
我搜索了注册表里面
OracleOraHome92ManagementServer

 

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\OracleOraHome92ManagementServer   DependOnService 数值数据对应到 OracleServiceTESTDB, 要是不对应一定要修改注册表让他对应起来,就是说一定要又依赖关系!!!!否则成功不了

 

总之 2 条:

 

  1 :动态 IP 一定要对应主机名

  2 :注册表里面得依赖关系一定要依赖当前档案库所在得服务上就是 OracleServiceTESTDB 上面!!!!

 

 

posted @ 2006-07-04 13:58 小小程序程序员混口饭吃 阅读(1685) | 评论 (3)编辑 收藏

OMA启动不起来,把资料库用EMCA配置在当前的数据库上了,然后启动OMA怎么也启动不起来,
    提示:
   
     服务器启动后又停止了。一些服务自动停止,如果他们没有什么可做的,例如"性能日志和警报"服务
    
   
    日志:OMS.NOHUP
   
    java.lang.NullPointerException:
 at oracle.sysman.vxx.vxxo.VxxoEMORB.getName(VxxoEMORB.java:735)
 at oracle.sysman.vxx.vxxo.VxxoEMORB.deregister(VxxoEMORB.java:467)
 at oracle.sysman.vdg.VdgAgentGatewayImpl.killService(VdgAgentGatewayImpl.java:599)
 at oracle.sysman.vxa.VxaAppServer.connectionLost(VxaAppServer.java:1482)
 at oracle.sysman.vdg.VdgAgentGatewayImpl.initiateExitAndRestart(VdgAgentGatewayImpl.java:689)
 at oracle.sysman.vdg.vdgConn.VdgConnection.pollForConnectionEvents(VdgConnection.java:2087)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.inConnPollLoop_(VdgListenThread.java:427)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.run(VdgListenThread.java:362)
 at oracle.sysman.vtaGallery.threadPoolManager.WorkerThread.run(Worker.java:271)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.connectionLost(VxaAppServer.java:1474)
 at oracle.sysman.vdg.VdgAgentGatewayImpl.initiateExitAndRestart(VdgAgentGatewayImpl.java:689)
 at oracle.sysman.vdg.vdgConn.VdgConnection.pollForConnectionEvents(VdgConnection.java:2087)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.inConnPollLoop_(VdgListenThread.java:427)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.run(VdgListenThread.java:362)
 at oracle.sysman.vtaGallery.threadPoolManager.WorkerThread.run(Worker.java:271)
java.lang.NullPointerException:
 at oracle.sysman.vdb.VdbSessionFactory.checkForEmptyCreds(VdbSessionFactory.java:588)
 at oracle.sysman.vdb.VdbSessionFactory.getPrivateAutoCommitSession(VdbSessionFactory.java:1261)
 at oracle.sysman.vds.VdsImpl.getSystemAutoCommitSession(VdsImpl.java:1013)
 at oracle.sysman.vds.VdsImpl.getPrivateAutoCommitSession(VdsImpl.java:955)
 at oracle.sysman.vdg.vdgStore.VdgDbConnection.getRepositoryAutoSession(VdgDbConnection.java:84)
 at oracle.sysman.vdg.vdgStore.VdgNodeStore.getPingNodes(VdgNodeStore.java:372)
 at oracle.sysman.vdg.VdgPingManager.getNodes(VdgPingManager.java:411)
 at oracle.sysman.vdg.VdgPingManager.run(VdgPingManager.java:661)
 at oracle.sysman.vtaGallery.threadPoolManager.WorkerThread.run(Worker.java:271)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.connectionLost(VxaAppServer.java:1474)
 at oracle.sysman.vdg.VdgAgentGatewayImpl.initiateExitAndRestart(VdgAgentGatewayImpl.java:689)
 at oracle.sysman.vdg.vdgConn.VdgConnection.pollForConnectionEvents(VdgConnection.java:2087)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.inConnPollLoop_(VdgListenThread.java:427)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.run(VdgListenThread.java:362)
 at oracle.sysman.vtaGallery.threadPoolManager.WorkerThread.run(Worker.java:271)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.connectionLost(VxaAppServer.java:1474)
 at oracle.sysman.vdg.VdgAgentGatewayImpl.initiateExitAndRestart(VdgAgentGatewayImpl.java:689)
 at oracle.sysman.vdg.vdgConn.VdgConnection.pollForConnectionEvents(VdgConnection.java:2087)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.inConnPollLoop_(VdgListenThread.java:427)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.run(VdgListenThread.java:362)
 at oracle.sysman.vtaGallery.threadPoolManager.WorkerThread.run(Worker.java:271)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.connectionLost(VxaAppServer.java:1474)
 at oracle.sysman.vdg.VdgAgentGatewayImpl.initiateExitAndRestart(VdgAgentGatewayImpl.java:689)
 at oracle.sysman.vdg.vdgConn.VdgConnection.pollForConnectionEvents(VdgConnection.java:2087)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.inConnPollLoop_(VdgListenThread.java:427)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.run(VdgListenThread.java:362)
 at oracle.sysman.vtaGallery.threadPoolManager.WorkerThread.run(Worker.java:271)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.connectionLost(VxaAppServer.java:1474)
 at oracle.sysman.vdg.VdgAgentGatewayImpl.initiateExitAndRestart(VdgAgentGatewayImpl.java:689)
 at oracle.sysman.vdg.vdgConn.VdgConnection.pollForConnectionEvents(VdgConnection.java:2087)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.inConnPollLoop_(VdgListenThread.java:427)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.run(VdgListenThread.java:362)
 at oracle.sysman.vtaGallery.threadPoolManager.WorkerThread.run(Worker.java:271)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.connectionLost(VxaAppServer.java:1474)
 at oracle.sysman.vdg.VdgAgentGatewayImpl.initiateExitAndRestart(VdgAgentGatewayImpl.java:689)
 at oracle.sysman.vdg.vdgConn.VdgConnection.pollForConnectionEvents(VdgConnection.java:2087)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.inConnPollLoop_(VdgListenThread.java:427)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.run(VdgListenThread.java:362)
 at oracle.sysman.vtaGallery.threadPoolManager.WorkerThread.run(Worker.java:271)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.connectionLost(VxaAppServer.java:1474)
 at oracle.sysman.vdg.VdgAgentGatewayImpl.initiateExitAndRestart(VdgAgentGatewayImpl.java:689)
 at oracle.sysman.vdg.vdgConn.VdgConnection.pollForConnectionEvents(VdgConnection.java:2087)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.inConnPollLoop_(VdgListenThread.java:427)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.run(VdgListenThread.java:362)
 at oracle.sysman.vtaGallery.threadPoolManager.WorkerThread.run(Worker.java:271)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.connectionLost(VxaAppServer.java:1474)
 at oracle.sysman.vdg.VdgAgentGatewayImpl.initiateExitAndRestart(VdgAgentGatewayImpl.java:689)
 at oracle.sysman.vdg.vdgConn.VdgConnection.pollForConnectionEvents(VdgConnection.java:2087)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.inConnPollLoop_(VdgListenThread.java:427)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.run(VdgListenThread.java:362)
 at oracle.sysman.vtaGallery.threadPoolManager.WorkerThread.run(Worker.java:271)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.connectionLost(VxaAppServer.java:1474)
 at oracle.sysman.vdg.VdgAgentGatewayImpl.initiateExitAndRestart(VdgAgentGatewayImpl.java:689)
 at oracle.sysman.vdg.vdgConn.VdgConnection.pollForConnectionEvents(VdgConnection.java:2087)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.inConnPollLoop_(VdgListenThread.java:427)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.run(VdgListenThread.java:362)
 at oracle.sysman.vtaGallery.threadPoolManager.WorkerThread.run(Worker.java:271)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.connectionLost(VxaAppServer.java:1474)
 at oracle.sysman.vdg.VdgAgentGatewayImpl.initiateExitAndRestart(VdgAgentGatewayImpl.java:689)
 at oracle.sysman.vdg.vdgConn.VdgConnection.pollForConnectionEvents(VdgConnection.java:2087)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.inConnPollLoop_(VdgListenThread.java:427)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.run(VdgListenThread.java:362)
 at oracle.sysman.vtaGallery.threadPoolManager.WorkerThread.run(Worker.java:271)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.connectionLost(VxaAppServer.java:1474)
 at oracle.sysman.vdg.VdgAgentGatewayImpl.initiateExitAndRestart(VdgAgentGatewayImpl.java:689)
 at oracle.sysman.vdg.vdgConn.VdgConnection.pollForConnectionEvents(VdgConnection.java:2087)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.inConnPollLoop_(VdgListenThread.java:427)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.run(VdgListenThread.java:362)
 at oracle.sysman.vtaGallery.threadPoolManager.WorkerThread.run(Worker.java:271)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.connectionLost(VxaAppServer.java:1474)
 at oracle.sysman.vdg.VdgAgentGatewayImpl.initiateExitAndRestart(VdgAgentGatewayImpl.java:689)
 at oracle.sysman.vdg.vdgConn.VdgConnection.pollForConnectionEvents(VdgConnection.java:2087)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.inConnPollLoop_(VdgListenThread.java:427)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.run(VdgListenThread.java:362)
 at oracle.sysman.vtaGallery.threadPoolManager.WorkerThread.run(Worker.java:271)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.connectionLost(VxaAppServer.java:1474)
 at oracle.sysman.vdg.VdgAgentGatewayImpl.initiateExitAndRestart(VdgAgentGatewayImpl.java:689)
 at oracle.sysman.vdg.vdgConn.VdgConnection.pollForConnectionEvents(VdgConnection.java:2087)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.inConnPollLoop_(VdgListenThread.java:427)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.run(VdgListenThread.java:362)
 at oracle.sysman.vtaGallery.threadPoolManager.WorkerThread.run(Worker.java:271)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.connectionLost(VxaAppServer.java:1474)
 at oracle.sysman.vdg.VdgAgentGatewayImpl.initiateExitAndRestart(VdgAgentGatewayImpl.java:689)
 at oracle.sysman.vdg.vdgConn.VdgConnection.pollForConnectionEvents(VdgConnection.java:2087)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.inConnPollLoop_(VdgListenThread.java:427)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.run(VdgListenThread.java:362)
 at oracle.sysman.vtaGallery.threadPoolManager.WorkerThread.run(Worker.java:271)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.connectionLost(VxaAppServer.java:1474)
 at oracle.sysman.vdg.VdgAgentGatewayImpl.initiateExitAndRestart(VdgAgentGatewayImpl.java:689)
 at oracle.sysman.vdg.vdgConn.VdgConnection.pollForConnectionEvents(VdgConnection.java:2087)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.inConnPollLoop_(VdgListenThread.java:427)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.run(VdgListenThread.java:362)
 at oracle.sysman.vtaGallery.threadPoolManager.WorkerThread.run(Worker.java:271)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.connectionLost(VxaAppServer.java:1474)
 at oracle.sysman.vdg.VdgAgentGatewayImpl.initiateExitAndRestart(VdgAgentGatewayImpl.java:689)
 at oracle.sysman.vdg.vdgConn.VdgConnection.pollForConnectionEvents(VdgConnection.java:2087)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.inConnPollLoop_(VdgListenThread.java:427)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.run(VdgListenThread.java:362)
 at oracle.sysman.vtaGallery.threadPoolManager.WorkerThread.run(Worker.java:271)
oracle.sysman.vxx.vxxo.VxxoNameNotFoundException: VXX-2009 : 无法找到服务上下文
 at oracle.sysman.vxx.vxxo.VxxoEMORB.getNextBindName(VxxoEMORB.java:813)
 at oracle.sysman.vxx.vxxo.VxxoEMORB.bind(VxxoEMORB.java:333)
 at oracle.sysman.vxa.VxaAppServer.cacheServiceIOR(VxaAppServer.java:1904)
 at oracle.sysman.vxa.VxaAppServer.main(VxaAppServer.java:3150)
exception VxaInvalidStateException{wstring reason="VXA-3032 : \?25\?76\?50 ORB \?12\?21\?32 OMS \?15\?41\?66\?72\?31\?02\?43\?50\?63\?55 oms";}
 at oracle.sysman.vxa.VxaAppServer.main(VxaAppServer.java:3152)

启动 Oracle Management Server 时出错。java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.stopServices(VxaAppServer.java:1406)
 at oracle.sysman.vxa.VxaAppServer.exit(VxaAppServer.java:2533)
 at oracle.sysman.vxa.VxaAppServer.main(VxaAppServer.java:3166)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.stopServices(VxaAppServer.java:1406)
 at oracle.sysman.vxa.VxaAppServer.exit(VxaAppServer.java:2533)
 at oracle.sysman.vxa.VxaAppServer.main(VxaAppServer.java:3166)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.stopServices(VxaAppServer.java:1406)
 at oracle.sysman.vxa.VxaAppServer.exit(VxaAppServer.java:2533)
 at oracle.sysman.vxa.VxaAppServer.main(VxaAppServer.java:3166)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.stopServices(VxaAppServer.java:1406)
 at oracle.sysman.vxa.VxaAppServer.exit(VxaAppServer.java:2533)
 at oracle.sysman.vxa.VxaAppServer.main(VxaAppServer.java:3166)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.stopServices(VxaAppServer.java:1406)
 at oracle.sysman.vxa.VxaAppServer.exit(VxaAppServer.java:2533)
 at oracle.sysman.vxa.VxaAppServer.main(VxaAppServer.java:3166)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.stopServices(VxaAppServer.java:1406)
 at oracle.sysman.vxa.VxaAppServer.exit(VxaAppServer.java:2533)
 at oracle.sysman.vxa.VxaAppServer.main(VxaAppServer.java:3166)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.stopServices(VxaAppServer.java:1406)
 at oracle.sysman.vxa.VxaAppServer.exit(VxaAppServer.java:2533)
 at oracle.sysman.vxa.VxaAppServer.main(VxaAppServer.java:3166)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.stopServices(VxaAppServer.java:1406)
 at oracle.sysman.vxa.VxaAppServer.exit(VxaAppServer.java:2533)
 at oracle.sysman.vxa.VxaAppServer.main(VxaAppServer.java:3166)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.stopServices(VxaAppServer.java:1406)
 at oracle.sysman.vxa.VxaAppServer.exit(VxaAppServer.java:2533)
 at oracle.sysman.vxa.VxaAppServer.main(VxaAppServer.java:3166)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.stopServices(VxaAppServer.java:1406)
 at oracle.sysman.vxa.VxaAppServer.exit(VxaAppServer.java:2533)
 at oracle.sysman.vxa.VxaAppServer.main(VxaAppServer.java:3166)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.stopServices(VxaAppServer.java:1406)
 at oracle.sysman.vxa.VxaAppServer.exit(VxaAppServer.java:2533)
 at oracle.sysman.vxa.VxaAppServer.main(VxaAppServer.java:3166)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.stopServices(VxaAppServer.java:1406)
 at oracle.sysman.vxa.VxaAppServer.exit(VxaAppServer.java:2533)
 at oracle.sysman.vxa.VxaAppServer.main(VxaAppServer.java:3166)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.stopServices(VxaAppServer.java:1406)
 at oracle.sysman.vxa.VxaAppServer.exit(VxaAppServer.java:2533)
 at oracle.sysman.vxa.VxaAppServer.main(VxaAppServer.java:3166)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.stopServices(VxaAppServer.java:1406)
 at oracle.sysman.vxa.VxaAppServer.exit(VxaAppServer.java:2533)
 at oracle.sysman.vxa.VxaAppServer.main(VxaAppServer.java:3166)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.stopServices(VxaAppServer.java:1406)
 at oracle.sysman.vxa.VxaAppServer.exit(VxaAppServer.java:2533)
 at oracle.sysman.vxa.VxaAppServer.main(VxaAppServer.java:3166)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.stopServices(VxaAppServer.java:1406)
 at oracle.sysman.vxa.VxaAppServer.exit(VxaAppServer.java:2533)
 at oracle.sysman.vxa.VxaAppServer.main(VxaAppServer.java:3166)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.stopServices(VxaAppServer.java:1406)
 at oracle.sysman.vxa.VxaAppServer.exit(VxaAppServer.java:2533)
 at oracle.sysman.vxa.VxaAppServer.main(VxaAppServer.java:3166)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.stopServices(VxaAppServer.java:1406)
 at oracle.sysman.vxa.VxaAppServer.exit(VxaAppServer.java:2533)
 at oracle.sysman.vxa.VxaAppServer.main(VxaAppServer.java:3166)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.stopServices(VxaAppServer.java:1406)
 at oracle.sysman.vxa.VxaAppServer.exit(VxaAppServer.java:2533)
 at oracle.sysman.vxa.VxaAppServer.main(VxaAppServer.java:3166)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.stopServices(VxaAppServer.java:1406)
 at oracle.sysman.vxa.VxaAppServer.exit(VxaAppServer.java:2533)
 at oracle.sysman.vxa.VxaAppServer.main(VxaAppServer.java:3166)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.connectionLost(VxaAppServer.java:1474)
 at oracle.sysman.vdg.VdgAgentGatewayImpl.initiateExitAndRestart(VdgAgentGatewayImpl.java:689)
 at oracle.sysman.vdg.vdgConn.VdgConnection.pollForConnectionEvents(VdgConnection.java:2087)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.inConnPollLoop_(VdgListenThread.java:427)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.run(VdgListenThread.java:362)
 at oracle.sysman.vtaGallery.threadPoolManager.WorkerThread.run(Worker.java:271)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.connectionLost(VxaAppServer.java:1474)
 at oracle.sysman.vdg.VdgAgentGatewayImpl.initiateExitAndRestart(VdgAgentGatewayImpl.java:689)
 at oracle.sysman.vdg.vdgConn.VdgConnection.pollForConnectionEvents(VdgConnection.java:2087)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.inConnPollLoop_(VdgListenThread.java:427)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.run(VdgListenThread.java:362)
 at oracle.sysman.vtaGallery.threadPoolManager.WorkerThread.run(Worker.java:271)
java.lang.NullPointerException:
 at java.util.Hashtable.get(Hashtable.java:259)
 at oracle.sysman.vxa.VxaAppServer.connectionLost(VxaAppServer.java:1474)
 at oracle.sysman.vdg.VdgAgentGatewayImpl.initiateExitAndRestart(VdgAgentGatewayImpl.java:689)
 at oracle.sysman.vdg.vdgConn.VdgConnection.pollForConnectionEvents(VdgConnection.java:2087)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.inConnPollLoop_(VdgListenThread.java:427)
 at oracle.sysman.vdg.vdgConn.VdgListenThread.run(VdgListenThread.java:362)
 at oracle.sysman.vtaGallery.threadPoolManager.WorkerThread.run(Worker.java:271)
"Could not start management server. Initialization failure"
该如何解决

 我安装的是9。2。0。1。0版本,系统XP
   
   

posted @ 2006-06-28 16:10 小小程序程序员混口饭吃 阅读(2087) | 评论 (2)编辑 收藏
     摘要: JMX 入门   JMX 越来越多得出现在各种技术杂志、以及社区,如 ibm 的 developerworks ...  阅读全文
posted @ 2006-06-26 11:10 小小程序程序员混口饭吃 阅读(2350) | 评论 (1)编辑 收藏

/**
 * user java reg to check phone number and replace 86 or +86
 * only check start with "+86" or "86" ex +8615911119999 13100009999 replace +86 or 86 with ""
 * @param phoneNum
 * @return
 * @throws Exception
 */ 
 protected int checkPhoneNum(String phoneNum) throws Exception {
  
  Pattern p1 = Pattern.compile("^((\\+{0,1}86){0,1})1[0-9]{10}");
  Matcher m1 = p1.matcher(phoneNum);
  if (m1.matches()) {
   Pattern p2 = Pattern.compile("^((\\+{0,1}86){0,1})");
   Matcher m2 = p2.matcher(phoneNum);
   StringBuffer sb = new StringBuffer();
   while (m2.find()) {
    m2.appendReplacement(sb, "");
   }
   m2.appendTail(sb);
   return Integer.parseInt(sb.toString());

  } else {
   throw new Exception("The format of phoneNum "+phoneNum+"  is not correct!Please correct it");
  }

 }

posted @ 2006-06-19 11:15 小小程序程序员混口饭吃 阅读(8334) | 评论 (0)编辑 收藏
下载
posted @ 2006-06-09 14:28 小小程序程序员混口饭吃 阅读(344) | 评论 (0)编辑 收藏
     摘要: 1 : Package net.loocky.rmi.spring |-------BusinessService.java |-------Service.java |-------ServiceClient.java |-----...  阅读全文
posted @ 2006-05-29 14:45 小小程序程序员混口饭吃 阅读(682) | 评论 (0)编辑 收藏

1:文件Service.java ServiceImpl.java ServiceServer.java ServiceClient.java  client.policy

结构
 src
    net.loocky.rmi/ *.java
    client.policy

文件如下:
Service.java是个interface
package net.loocky.rmi;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Service extends Remote {

 public String getName() throws RemoteException;

 public void setName(String name) throws RemoteException;

}
ServiceImpl.java Service的实现
package net.loocky.rmi;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class ServiceImpl extends UnicastRemoteObject implements Service {
 private static final long serialVersionUID = 1L;

 private String name;

 public ServiceImpl(String name) throws RemoteException {
  this.name = name;
 }

 public String getName() throws RemoteException {
  return name;
 }

 public void setName(String name) throws RemoteException {
  this.name = name;

 }

}

ServiceServer
package net.loocky.rmi;

import java.rmi.Naming;

public class ServiceServer {

 /**
  * @param args
  */
 public static void main(String[] args) {
  try {

   ServiceImpl s1 = new ServiceImpl("my name is john");
   ServiceImpl s2 = new ServiceImpl("my name is loocky");
   Naming.rebind("john", s1);
   Naming.rebind("loocky", s2);
   System.out.println("waiting for clients...");
  } catch (Exception e) {
   e.printStackTrace();
  }

 }

}
ServiceClient
package net.loocky.rmi;

import java.rmi.Naming;
import java.rmi.RMISecurityManager;

public class ServiceClient {

 /**
  * @param args
  */
 public static void main(String[] args) {
  System.setSecurityManager(new RMISecurityManager());
  String url = "rmi://127.0.0.1:1099/";
  try {
   Service s1 = (Service) Naming.lookup(url + "john");
   Service s2 = (Service) Naming.lookup(url + "loocky");
   System.out.println(s1.getName());
   s2.setName("my name is not loocky");
   System.out.println(s2.getName());

  } catch (Exception e) {
   e.printStackTrace();
  }
 }

}
client.policy
grant
{
  permission java.security.AllPermission;
// permission java.net.SocketPermission "127.0.0.1:1099","connect";
// permission java.net.SocketPermission "127.0.0.1:80","connect";
};

有了这些文件下面要做的事情是

1:进入bin/  rmic net.loocky.rmi.ServiceImpl 生成STUB
2:dos下面 rmiregistry
3:java net.loocky.rmi.ServiceServer
4: java -Djava.security.policy=client.policy net.loocky.rmi.ServiceClient
5:查看控制台的结果吧!




posted @ 2006-05-26 11:10 小小程序程序员混口饭吃 阅读(375) | 评论 (0)编辑 收藏


<beans>

 <bean id="timer" class="org.springframework.scheduling.timer.TimerFactoryBean">
  <property name="scheduledTimerTasks">
   <list>
    <ref local="testtimertask"/>
   </list>
  </property>
 </bean>

 <bean id="timerbean" class="MyTimerImpl">

 </bean>
 <bean id="testtimertask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
  <property name="timerTask">
   <ref bean="timerbean" />
  </property>

  <property name="delay">
   <value>1000</value>
  </property>

  <property name="period">
   <value>1000</value>
  </property>

 </bean>

</beans>

MyTimerImpl

import java.util.TimerTask;

public class MyTimerImpl  extends TimerTask {

 public void run() {
  System.out.println("aaaaaaaa");
  
 }
TestTimer

import net.loocky.sowq.util.ServiceFactory;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class TestTimer {

 /**
  * @param args
  */
 public static void main(String[] args) throws Exception {
  
    ApplicationContext ctx=new FileSystemXmlApplicationContext("E:\\work\\Test\\bin\\spring-config.xml");
  Thread.sleep(100000);
 }

}

}

posted @ 2006-05-25 17:59 小小程序程序员混口饭吃 阅读(1684) | 评论 (2)编辑 收藏

冒泡排序
public class BubbleSort {
 public  static void sort(int[] data, int n) {
  int sortedNum = 0;
  int index;
  while (sortedNum < n) {
   for (index = 1; index < n - sortedNum; index++) {
    if (data[index - 1] > data[index]) {
     int tmp;
     tmp = data[index - 1];
     data[index - 1] = data[index];
     data[index] = tmp;

    }
   }
   sortedNum++;
  }
 }

}
选择排序
public class SelectSort {
 public static void sort(int[] data, int n) {
  int sortedNum = 0;
  int index;
  int maxIndex = 0;
  while (sortedNum < n) {
   for (index = 1; index < n - sortedNum - 1; index++) {
    if (data[maxIndex] < data[index]) {
     maxIndex = index;
    }
   }
   int tmp;
   tmp = data[maxIndex];
   data[maxIndex] = data[n - sortedNum - 1];
   data[n - sortedNum - 1] = tmp;
   sortedNum++;

  }

 }

}

插入排序
public class InsertSort {
 public static void sort(int[] data, int n) {
  int sortedNum = 1;
  int index;
  while (sortedNum < n) {
   int tmp = data[sortedNum];
   for (index = sortedNum; index > 0; index--) {
    if (tmp < data[index - 1]) {
     data[index] = data[index - 1];
    } else {
     break;
    }
   }
   //插入的他的位置
   //index就是找TMP的位置
   data[index] = tmp;
   sortedNum++;
   
   for(int i=0;i<n;i++){
    System.out.print(data[i]+",");
   }
   System.out.println("");
  }

 }

}

快速排序
public class QuickSort {

 public static void sort(int[] data, int n) {
  quickSortRescursive(data, 0, n - 1);
 }

 private static void quickSortRescursive(int[] data, int left, int right) {

  int pos;
  if (left >= right)
   return;
  pos = getPos(data, left, right);
  // 排左边的
  quickSortRescursive(data, left, pos - 1);
  quickSortRescursive(data, pos + 1, right);
 }

 private static int getPos(int[] data, int left, int right) {
  // 想左边移动
  while (true) {
   //遇到右边的大就忽略,并且缩小右边范围
   while (left < right && data[left] < data[right])
    right--;
   
   //遇到左边的大就往右边换
   if (left < right)
    swap(data, left++, right);
   else
    return left;
//   遇到右边的大就忽略,并且左边缩小范围
   while (left < right && data[left] < data[right])
    left++;
   if (left < right)
    //遇到左边的大就往右边换
    swap(data, left, right--);
   // return left;

   else
    return right;
   // return 0;
  }

 }

 private static void swap(int[] data, int i, int j) {
  int tmp = data[i];
  data[i] = data[j];
  data[j] = tmp;

 }

}

posted @ 2006-05-25 15:07 小小程序程序员混口饭吃 阅读(365) | 评论 (0)编辑 收藏

8 SyncML dm package

 

  SyncML dm 协议包括 2 个阶段 初始化阶段(认证和终端信息交换的阶段)和管理阶段,管理阶段服务器希望进行重复多次进行管理。 Manage 周期的开始以 package0 开始,本次出发依赖于不可更改的环境,在 SyncML Notifaction 开始的周期里面被指定

 

 

 

下图是描绘了 2 个阶段

 

 

 

 

 Management 阶段包括了几个协议的交互,从 server 发送到 client 的包的内容决定了这个周期是否进行下去,如果从 server 发送出来的包的管理指令需要得到 client 的回复, client 将会返回针对这些操作指令的回复。这些回复的包开始了新的协议的交互,服务器将发送一个新的管理指令的包并且开始一个新的协议交互的的过程。

     server package 里面不包含 management operation 的时候, client 将根据服务器发送过来的包回复一个新的包,这个包里面只包含了 status Synchr ,在这种情况下,真个回复的包不能被发送,协议中止。 Server 必须给任何 client 的包进行回复

     包的处理可能花费的时间是不可预知的,因此在 SyncML dm 协议中没有指定 2 者的超时时间。

     如果不是 operation command 另有规定,终端和 server 可以不按照 package 中的顺序执行指令。因此,在上一条管理指令在执行的顺序是必须的,管理指令必须按照他们发送的顺序进行执行。 Client 不能发送除了包含 Devinfo REPLACE command Result alert server

 

8 1 session abort

 

8 1 1 描述

      server 还是 client 任何时候都可以中止操作。终端操作的原因可能是 server 关闭, client 没电,或者用户在 client 上的其他交互操作,或者其他操作。这种情况下,最好的方式是发送一个中止的 ALERT 。推荐的做法是: message 包含了管理指令的任何 stauts result

如果发送一个 session 终端给接受方的 MESSAGE ,那么接收方的回应会忽略,(不会回应把,自己也不理解,有待更正)

有些终端是无法控制的, client 不在覆盖范围内或者电池没有电。 Server client 必须也对没有信号的情况做好准备。上面提到的需求只要是为了减少一些回应超时,或者没有回应的情况。

补充说明: request/response 在传输用的角色被倒置的情况, client 是个传输层的 server server 是个传输层的 client ,这种情况下 8.1.1 以上的推荐可能不会用到

 

8.1.2 需求

 

Alert 1223 是无法预知的操作中止的信号标识,发送方的 session 中断标识包含了 command 的状态和结果,这些指令将在 abort 之前执行,发送方必须包含一个 FINAL 的标识。当 server 收到 alert 提示的时候,必须在回复的 message 中包含状态和 SyncHR ,并且不回复新的 MESSAGE

 

 

 

8.2 package 0 server 发起的初始化 指令

 

  许多终端不能持续的侦听服务器的连接,由于安全原因一些终端只是不想开方一些端口。大部分终端可以接受一些主动提供的 MESSAGE, 称作通知 (notifaction).

 

  Server可以用通知的这种能力使终端初始化一个连接回server SyncML dm 协议规定了几种管理初始化通知的发送方式。发送者和通知的内容可以参考Notification Initiated Session, Version 1.1.2

 

 

      需要说明的是:接收一个管理初始化的通知会受其他方面影响。如终端设备可能会允许用户操作设备去初始化管理周期,另外,终端用户也可以管理超时的管理周期,一些错误得操作也会使终端发起一个管理周期。

 

 

8 3 package1 :客户端发起初始化指令

 

   管理阶段跟SyncML dm 数据协议得描述完全相同,客户端发起包的意图如下:

  

 

1 :发送终端信息(厂商,版本,其他)DM server,终端必须在第一个message中管理周期中发送设备信息

2 :根据SELECTION 9中的规则终端向DM server确认身份

3 :通知dmserver本次SESSION由客户端发起还是由Dmserver 发起(package0往往不会用到,如果是客户端发起的话)。

 

 

  客户端发起得初始化package得具体需求如下:

  1 :在SyncHdr 元素里面得需求

VerDTD 的值必须是1.1

VerProto 的值必须是“DM/1.1

Sessionid 必须能标明但前Management session 的身份,如果client 回复通知,那么Alert1200)标识由server发起的,sessionid必须跟notifaction里面的sessionid相同,否则client产生的sessionid不会唯一,sessionid会贯穿整个session

MsgID 必须明确的指出message属于哪个management session

Target 元素必须指明是个那个目标server

Source 元素指明的是哪个client service

Cred element 可能包含再认证的message里面,一般是从client发起,section9将会详细描述

  2 Syncbody中必须包含alert信息无论client发起还是server发起

Alert command 的需求如下

  CmdId 是必须的

  存放management session type Data element或者由server发起(1200)或者由client发起(1201

  3 :终端的信息必须在syncbody中包含Relpace commandreplace command需求如下

  Cmdid 是必须的

  Dm tree 每个节点的item都可以被找到,在DMSTDOBJ中有详细描述

  Source element 必须包含一个指定的URI 节点

  Data element 用来装载device 信息数据

 

Final element 必须包含在Syncbody 的最后一个message

posted @ 2006-05-24 13:41 小小程序程序员混口饭吃 阅读(848) | 评论 (1)编辑 收藏

4 :简介

 

Dm 协议允许管理指令在节点上执行,跟 SyncML 同步协议和 SyncML 表示协议类似都采用的是包的形式。设备的一个节点表示为一组可配置参数,可以这个节点进行读和设定参数的键、值操作,而终端的应用软件另外一个节点可能是的正在可运行环境中(意思是不会影响到别的节点的功能),对这类型的节点操作可以对软件的一部分功能进行下载、升级或者卸载 .

 

SyncML DM 这些指令代表这些操作,在 SymcML 表现协议和 SyncML 表现协议 DM 的用户手册中有描述。这些指令和消息的结构等同于 SyncML 数据同步协议,并且管理协议的 DTM 就是来源于 SyncML 数据同步协议的 DTD

 

5 :节点处理

 

每一个节点的路径就是设备的唯一统一资源标识,这些标识必须遵循这样一些指定的需求: SyncML DM 树和描述加以限制和指定

 

每一个节点都有一个可以决定什么样的管理内容可以用来设置或者读的类型,在节点上操作需要实现定义这个类型的值,当节点被读的时候,这个类型的值将被返回。

举例说明,有的节点只是一个简单文本类型,需要设置,而有的节点是 WAP Provisioning document MIME 的复杂类型,甚至其他节点可能象 WAP 设置或者软件安装这样更复杂的值

 

SyncML DM 协议的指令的 target souce 目标和来源 元素分别指定 target 是接纳着, source 是来源,这些过程出现的异常都会在管理命令需求中的异常中会被提及

 

 

6 :包中的多消息

 

6 1 描述

  DM 管理协议中中提供用多个 MESSAGE 来传输一个包的功能,当一个包非常大的时候,分成多个 MESSAGE 进行传输是非常有必要的,这样的局限是可能由传输协议或者终端的功能限制决定,(分成多个 MESSAGE 就可以解决这个问题)。

 

  DM 管理协议中,包作为一个逻辑组的作用是非常有限的,大部分的限制在 MESSAGE 上,而不是在 PACKAGE 上,举例:一个 COMMAND 必须完全适从一个 MESSAGE

 

 

为了避免大量客户端而有限的资源,服务器等待从客户端的包的 command 返回一个状态,

如果上一个 COMMAND 没有返回一个状态服务器不允许发送一个新的 COMMAND ,换句话来说,大部分 server 发送到客户端的 COMMAND 都会收到 CMMAND package )的返回信息,除非 SERVER 发送一个大的对象或者请求更多的 MESSAGE (用 1222 ALERT

一个 PACKAGE 包含大对象数据将会被分成很多 MESSAGE 传输,在第七部分会详细描述

  说明 server 在处于一下一种包的边界的状态的时候:

 

   1 server 有一个完全大的包,在这种状况下, server 等待从 client COMMAND 返回状态,由于状态和结果非常大(如 GET COMMAND 的结果), client 将发送多个 MESSAGE server ,然后结束他的回应

   2 server client 接受到一个完整的包, server 将会发送一个新的 COMMAND client

   3 server 发送了包中的一个或多个指令,但是没有发送包中的最后一个指令的时候,只有当 package 中的最后一个指令被发送出去的时候,这次状态才被认为是有效的

 

 

由于 SyncML 的传输形式是 request/response    的形式,无论是客户端还是服务器端在传输消息的时候都不应该包含一个开始命令或者一个结束的标志,以便保证 response/request 循环进行下去(言外之意就是有个这个标志就是开始和结束的时候) .

 

举例:当 server STATE1, 他可能收到客户端的很多 MESSAGE, 这些 MESSAGE 包含了 status result Server 会对任何一个 message 回应,除了对 NEW COMMAND 进行回应外。

Server 对发送的回应在 SyncHdr 中包含了一个 1222 ALERT client 也指定了,(表示没有结束还有消息)。 STAUTS 必须对 ALERT 的回应进行发送而不是对 RESULT 的回应进行发送

 

 

ALERT1222 可以被 ALERT 1223 替换,因为服务器可以主动结束一个过程

 

下图展示了多个 message 被发送

6 2 需求

 

  如果 SyncML package 分成多个 MESSAGE 被传送,最后一个 MESSAGE 必须包含一个 FINAL 的标志,其他么 message 一定不能包含 final 标志。 Final element server 发送而不是由 client 发送,最终停止本次的 PACKAGE 操作。

   Server 在每个 MESSAGE 必须发送 FINAL message ,不过在发送大的对象的时候或者发送 NEXT MESSAGE 的相应的时候不会发送

7 :大对象的处理

 

  SyncML dm 协议中,大对象不能完全在一个 Message 中传输,根据 SyncML data 同步协议指定的大对象处理方案可以分成多个 Message 。规则如下:

 

第一个限制就是支持大对象处理的终端必须显示的之处 DevDetail/LrgObj 的标识为 true

第二个限制是在 server client 传输的 MaxObjSize 有多大,在 SyncML data 同步协议中 MaxObjSize 会在 Meta information 中指定。 DM 协议中被发送着接受的最大对象的大小( MaxObjSize )包含在 syncHdr 中( message META INFO ,syncHdr 中指定的 MaxObjSize ,发送者发送的单个对象都不能超过这个大小,如果 MaxObjSize 没有被发送,接收者可以自由发送任何大小的 message server

 

需要指出的是: MaxObjSize 会影响整个 DM session ,如果在随后的 message 中没有对这个值进行重新设置。新的 MaxObjSize 在后来的 message 指定一个可能的原因是 client free memory 大小的依赖,(有东西创建在 MEMORY 的时候或者删除的时候 FREE MOMORY 会发生变化)。

第三个限制:在上一个单元结束前终端会检测新的对象( messge ),终端会回复一个 1225 alert

 

 

 

 

 

 

 

posted @ 2006-05-23 13:58 小小程序程序员混口饭吃 阅读(2033) | 评论 (6)编辑 收藏
好多地方感觉并没有理解透,有时间再次整理一下

http://www.blogjava.net/Files/loocky/pattern.zip
posted @ 2006-05-19 18:02 小小程序程序员混口饭吃 阅读(1399) | 评论 (0)编辑 收藏
细节决定成败,气度左右格局
细节决定成败,气度左右格局
细节决定成败,气度左右格局
细节决定成败,气度左右格局
细节决定成败,气度左右格局
细节决定成败,气度左右格局
细节决定成败,气度左右格局
posted @ 2006-05-18 18:07 小小程序程序员混口饭吃 阅读(369) | 评论 (0)编辑 收藏
     摘要: 最近深入的学习了一下 Spring, 感受到了 AOP 的威力,以前看过 BEA 的 DEV2DEV 杂志,有一期专门的 AOP ,里面很详细讲的,看了有一年多了,今天真正来作个例子   这个例子也是从 ...  阅读全文
posted @ 2006-05-18 18:04 小小程序程序员混口饭吃 阅读(389) | 评论 (0)编辑 收藏

    <bean id="transactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"

         abstract="true">

       <property name="transactionManager" ref="transactionManager"/>

       <property name="transactionAttributes">

           <props>

              <prop key="insert*">PROPAGATION_REQUIRED</prop>

              <prop key="update*">PROPAGATION_REQUIRED</prop>

              <prop key="delete*">PROPAGATION_REQUIRED</prop>

              <prop key="change*">PROPAGATION_REQUIRED</prop>

              <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>

           </props>

       </property>

    </bean>

1

一旦你决定要用 AOP 来做 SERVICE 内部每个方法的事务处理,那么在 DAO 层内部最好不要从自己去 catch 异常,因为在 SERVICE 里面可能多次调用 DAO ,一旦多次调用,你其中一个方法捕获了异常就没有办法保证事务回滚,所以即使你捕获异常为了调试,一定要在 CATCH 方法中一定还要抛出一个异常来,否则无法保证事务

 

2

一旦决定要用 spring aop 方式来处理事务,一定要不采用 JDOtemplate ,或者 HIBERNATE TEMPALATE 内部类的方式,因为那样他们自己去管理事务,一旦在内部类中事务回滚,无法保证其他的 DAO 中事务回滚

 

3

1、  PROPAGATION_REQUIRED -- 支持当前的事务,如果不存在就创建一个新的。这是最常用的选择。
2
PROPAGATION_SUPPORTS -- 支持当前的事务,如果不存在就不使用事务。
3
PROPAGATION_MANDATORY -- 支持当前的事务,如果不存在就抛出异常。
4
PROPAGATION_REQUIRES_NEW -- 创建一个新的事务,并暂停当前的事务(如果存在)。
5
PROPAGATION_NOT_SUPPORTED -- 不使用事务,并暂停当前的事务(如果存在)。
6
PROPAGATION_NEVER -- 不使用事务,如果当前存在事务就抛出异常。
7
PROPAGATION_NESTED -- 如果当前存在事务就作为嵌入事务执行,否则与 PROPAGATION_REQUIRED 类似。

 

 

4 < prop key="change*">PROPAGATION_REQUIRED</prop>

  你可以在 PROPAGATION_REQUIRE 之后指定抛出什么样的异常事务才回滚,或者事务的隔离方式是什么等等都可以配置如 <prop key="change*">PROPAGATION_REQUIRED,readOnly,-PetClinicException</prop>

posted @ 2006-05-17 17:37 小小程序程序员混口饭吃 阅读(1276) | 评论 (0)编辑 收藏

1 oracle 不支持 read uncomitted 方式

2 read-only 不是sql92标准,readonly的好处是提高了数据库的效率,readonly的同时又允许DML操作,我原来以为readonly就不允许DML操作数据库了呢

3 read committed serializable的一些区别与联系  

 1 :都看不到脏数据

 2 read committed 不能够重复读,而serializable能够重复读,(重复读的意思就是,在一个事务中多次读取一条被被的事务提高的数据(COMMITEserializable看不到!!)

 3 :隔离程度越高,数据库的并发性越差;隔离程度越低,数据库的并发性越好。也就是说你要的数据准确一致性好,就要牺牲一些数据的效率胃代价的

 4   如果有在serializable事务开始时未提交的事务在serializable事务结束之前修改了serializable事务将要修改的行并进行了提交,则serializable事务提交的时候回法场发生无法序列化访问的错误

posted @ 2006-05-16 15:37 小小程序程序员混口饭吃 阅读(568) | 评论 (0)编辑 收藏


经过尝试,发现可以利用 Office 2003 中的 Microsoft Office Document Imaging 组件来实现PDF转WORD文档,也就是说利用WORD来完成该任务。方法如下:

用Adobe Reader 打开想转换的PDF文件 ,接下来 选择 “文件→打印”菜单,在打开的“打印”窗口中将 “打印机”栏中的名称设置为 “Microsoft Office Document Image Writer”,确认后将该PDF文 件输出为 MDI格式的虚拟打印文件 。

注: 如果没有找到“Microsoft Office Document Image Writer”项,使用Office 2003安装光盘中的“添加/删除组件”更新安装该组件,选中“Office 工具 Microsoft DRAW转换器”。

然后, 运行 “Microsoft Office Document Imaging”,并利用它来 打开 刚才保存的MDI文件,选择“工具→ 将文本发送到Word ”菜单,在弹出的窗口中选中“ 在输出时保持图片版式不变 ”,确认后系统会提示“必须在执行此操作前重新运行 OCR 。这可能需要一些时间”,不管它, 确认 即可。

注: 对PDF转DOC的识别率不是特别完美,转换后会丢失原来的排版格式,所以转换后还需要手工对其进行排版和校对工作。

以上仅在 word2003 中可用,其他版本没有Microsoft Office Document Image Writer。
posted @ 2006-05-10 11:25 小小程序程序员混口饭吃 阅读(356) | 评论 (0)编辑 收藏

1.1 准备工作
一。 Tomcat 已正确配置与使用。
二。软件下载: log4j------http://www.apache.org/dist/jakarta/log4j/jakarta-log4j-1.2.8.zip

1.2. Log4j
简介

在强调可重用组件开发的今天,除了自己从头到尾开发一个可重用的日志操作类外, Apache 为我们提供了一个强有力的日志操作包 -Log4j
Log4j
Apache 的一个开放源代码项目,通过使用 Log4j ,我们可以控制日志信息输送的目的地是控制台、文件、 GUI 组件、甚至是套接口服务器、 NT 的事件记录器、 UNIX Syslog 守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
此外,通过 Log4j 其他语言接口,您可以在 C C++ .Net PL/SQL 程序中使用 Log4j ,其语法和用法与在 Java 程序中一样,使得多语言分布式系统得到一个统一一致的日志组件模块。而且,通过使用各种第三方扩展,您可以很方便地将 Log4j 集成到 J2EE JINI 甚至是 SNMP 应用中。本文介绍的 Log4j 版本是 1.2.8 ,怎样通过一个配置文件来灵活地进行配置,主要的应用平台是 Tomcat4.

1.3
Log4j 的配置。

首先到 jakarta 下载一个 log4j 的组件。把 jakarta-log4j-1.2.8\dist\lib 下的 log4j-1.2.8.jar 文件 copy classpath 指定的目录下!可以是 Tomcat common\lib 目录下,也可以是你需要用到 log4j application 下的 lib 目录。
1.4
Application 目录下的 web.xml 文件加入以后代码

log4j
com.apache.jakarta.log4j.Log4jInit

log4j
/WEB-INF/log4j.properties

1


这段代码的意思是说,在 Tomcat 启动时加载 com.apache.jakarta.log4j.Log4jInit 这个名叫 Log4jInit.class 这个类文件。其中 Log4jInit.class 的源代码如下

package com.apache.jakarta.log4j;
import org.apache.log4j.PropertyConfigurator;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Log4jInit extends HttpServlet {

public void init() {
String prefix = getServletContext().getRealPath("/");
String file = getInitParameter("log4j");
// if the log4j-init-file is not set, then no point in trying
System.out.println("................log4j start");
if(file != null) {
PropertyConfigurator.configure(prefix+file);
}
}
public void doGet(HttpServletRequest req, HttpServletResponse res) {
}
}
这段代码很简单,可以看出,在加载的过程中,程序会读取 /WEB-INF/log4j.properties 这个文件
这个文件就是本文的重点,也就是 log4j 的配置文件。

# Set root logger level to DEBUG and its only appender to A1
#log4j
中有五级 logger
#FATAL 0
#ERROR 3
#WARN 4
#INFO 6
#DEBUG 7
#
配置根 Logger ,其语法为:
#log4j.rootLogger = [ level ] , appenderName, appenderName, …
log4j.rootLogger=INFO, A1 ,R
#
这一句设置以为着所有的 log 都输出
#
如果为 log4j.rootLogger=WARN, 则意味着只有 WARN,ERROR,FATAL
#
被输出, DEBUG,INFO 将被屏蔽掉 .
# A1 is set to be a ConsoleAppender.
#log4j
Appender 有几层如控制台、文件、 GUI 组件、甚至是套接口服务器、 NT 的事件记录器、 UNIX Syslog 守护进程等
#ConsoleAppender
输出到控制台
log4j.appender.A1=org.apache.log4j.ConsoleAppender
# A1
使用的输出布局,其中 log4j 提供 4 种布局 . org.apache.log4j.HTMLLayout (以 HTML 表格形式布局)
#org.apache.log4j.PatternLayout
(可以灵活地指定布局模式),
#org.apache.log4j.SimpleLayout
(包含日志信息的级别和信息字符串),
#org.apache.log4j.TTCCLayout
(包含日志产生的时间、线程、类别等等信息)

log4j.appender.A1.layout=org.apache.log4j.PatternLayout
#
灵活定义输出格式 具体查看 log4j javadoc org.apache.log4j.PatternLayout
#d
时间 ....
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
#R
输出到文件 RollingFileAppender 的扩展,可以提供一种日志的备份功能。
log4j.appender.R=org.apache.log4j.RollingFileAppender
#
日志文件的名称
log4j.appender.R.File=log4j.log
#
日志文件的大小
log4j.appender.R.MaxFileSize=100KB
#
保存一个备份文件
log4j.appender.R.MaxBackupIndex=1

log4j.appender.R.layout=org.apache.log4j.TTCCLayout
#log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n

配置以这里就差不多了,如果你想更深入了解配置文件的各个细节,可以去查看 docs 。还有,在文章的最后面我们提供配置文件中一些主要的语法。下面我们来看看怎样在程序中使用 log4j.

1.4
  Log4j 的使用。
使用 Log4j ,第一步就是获取日志记录器,这个记录器将负责控制日志信息。其语法为:
public static Logger getLogger( String name)

必须在使用前要把这个类导入
import org.apache.log4j.Logger;

name
一般是类文件的名字,如下:
static Logger logger = Logger.getLogger ("".class.getName () ) ;

您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方,其语法如下:
logger.debug ( Object message ) ;
logger.info ( Object message ) ;
logger.warn ( Object message ) ;
logger.error ( Object message ) ;

为什么这里要分级别的呢?试想一下,我们在写程序的时候,为了调试程序,会在很多会出错的地方加入大量的 logger.info(); 信息。当然程序调试完毕,我们不需要这些输出信息了,那怎么办呢?以前的做法是把每个程序中的 logger.info 删除,但这是不现实的,如果程序不大还可以,但如果程序很多,做这些事情就很烦人了。但因为 log4j 分级别了,当我们不需要输出这样调试时用到的 log.info() 时,我们可以把输出的级别调高,如调到 warn, error 级别,这样 info 级别及以下的级别就不会出输出了,是不是很方便的呢?

其实除了这种使用方式, log4j 还有其它的使用方面,不需要配置文件,直接在程序中定义输入出级别,层次等信息,如果要了解这方法的使用,可以参考文档。

1.5
。附注:
以下是配置文件的一些重要的语法
定义配置文件

其实您也可以完全不使用配置文件,而是在代码中配置 Log4j 环境。但是,使用配置文件将使您的应用程序更加灵活。

Log4j
支持两种配置文件格式,一种是 XML 格式的文件,一种是 Java 特性文件(键 = 值)。下面我们介绍使用 Java 特性文件做为配置文件的方法:

配置根 Logger ,其语法为:

log4j.rootLogger = [ level ] , appenderName, appenderName, …
其中, level 是日志记录的优先级,分为 OFF FATAL ERROR WARN INFO DEBUG ALL 或者您定义的级别。 Log4j 建议只使用四个级别,优先级从高到低分别是 ERROR WARN INFO DEBUG 。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了 INFO 级别,则应用程序中所有 DEBUG 级别的日志信息将不被打印出来。
appenderName
就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。

配置日志信息输出目的地 Appender ,其语法为

log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1

log4j.appender.appenderName.option = valueN
其中, Log4j 提供的 appender 有以下几种:
org.apache.log4j.ConsoleAppender
(控制台),
org.apache.log4j.FileAppender
(文件),
org.apache.log4j.DailyRollingFileAppender
(每天产生一个日志文件), org.apache.log4j.RollingFileAppender (文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender
(将日志信息以流格式发送到任意指定的地方)

配置日志信息的格式(布局),其语法为:

log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1

log4j.appender.appenderName.layout.option = valueN
其中, Log4j 提供的 layout 有以下几种:
org.apache.log4j.HTMLLayout
(以 HTML 表格形式布局),
org.apache.log4j.PatternLayout
(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout
(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout
(包含日志产生的时间、线程、类别等等信息)

posted @ 2006-05-09 16:06 小小程序程序员混口饭吃 阅读(2134) | 评论 (0)编辑 收藏
在nativeascii的时候一定要指定encoding:否则在windows下和linux下build的时候会出现问题,如果你在WINDOWS下测试,windows默认的是GBK,
而LINUX默认的却不是GBK,BUILD就会出问题,所以必须指定其encoding
posted @ 2006-05-09 16:00 小小程序程序员混口饭吃 阅读(522) | 评论 (1)编辑 收藏

weblogic突然down掉了.大家帮忙看看原因

An unexpected exception has been detected in native code outside the VM.

Unexpected Signal : EXCEPTION_ACCESS_VIOLATION (0xc0000005) occurred at PC=0x7C9

4AE22

Function=RtlImpersonateSelf+0x3A5

Library=C:\WINDOWS\system32\ntdll.dll

 

Current Java thread:

        at java.util.zip.ZipFile.getEntry(Native Method)

        at java.util.zip.ZipFile.getEntry(ZipFile.java:146)

        - locked <0x11b16650> (a weblogic.utils.classloaders.ClasspathClassFinde

r$ZipFileWrapper)

        at weblogic.servlet.internal.WarClassFinder.getSource(WarClassFinder.jav

a:236)

        at weblogic.servlet.internal.WebAppServletContext.getSource(WebAppServle

tContext.java:4584)

        at weblogic.servlet.internal.WebAppServletContext.findIndexFile(WebAppSe

rvletContext.java:4475)

        at weblogic.servlet.internal.WebAppServletContext.getIndexServletStub(We

bAppServletContext.java:4225)

        at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestIm

pl.java:2639)

        at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:219)

        at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:178)

 

Dynamic libraries:

0x00400000 - 0x0040B000         C:\bea\JDK142~1\bin\java.exe

0x7C920000 - 0x7C9B4000         C:\WINDOWS\system32\ntdll.dll

0x7C800000 - 0x7C91C000         C:\WINDOWS\system32\kernel32.dll

0x77DA0000 - 0x77E49000         C:\WINDOWS\system32\ADVAPI32.dll

0x77E50000 - 0x77EE1000         C:\WINDOWS\system32\RPCRT4.dll

0x77BE0000 - 0x77C38000         C:\WINDOWS\system32\MSVCRT.dll

0x08000000 - 0x08139000         C:\bea\JDK142~1\jre\bin\client\jvm.dll

0x77D10000 - 0x77D9F000         C:\WINDOWS\system32\USER32.dll

0x77EF0000 - 0x77F36000         C:\WINDOWS\system32\GDI32.dll

0x76B10000 - 0x76B3A000         C:\WINDOWS\system32\WINMM.dll

0x76300000 - 0x7631D000         C:\WINDOWS\system32\IMM32.DLL

0x62C20000 - 0x62C29000         C:\WINDOWS\system32\LPK.DLL

0x73FA0000 - 0x7400B000         C:\WINDOWS\system32\USP10.dll

0x10000000 - 0x10007000         C:\bea\JDK142~1\jre\bin\hpi.dll

0x008A0000 - 0x008AE000         C:\bea\JDK142~1\jre\bin\verify.dll

0x008B0000 - 0x008C9000         C:\bea\JDK142~1\jre\bin\java.dll

0x008D0000 - 0x008DD000         C:\bea\JDK142~1\jre\bin\zip.dll

0x02C80000 - 0x02C9C000         C:\bea\JDK142~1\jre\bin\jdwp.dll

0x06CA0000 - 0x06CA5000         C:\bea\JDK142~1\jre\bin\dt_socket.dll

0x71A20000 - 0x71A37000         C:\WINDOWS\system32\ws2_32.dll

0x71A10000 - 0x71A18000         C:\WINDOWS\system32\WS2HELP.dll

0x719C0000 - 0x719FE000         C:\WINDOWS\system32\mswsock.dll

0x60FD0000 - 0x61025000         C:\WINDOWS\system32\hnetcfg.dll

0x71A00000 - 0x71A08000         C:\WINDOWS\System32\wshtcpip.dll

0x07090000 - 0x0709F000         C:\bea\jdk142_05\jre\bin\net.dll

0x76EF0000 - 0x76F17000         C:\WINDOWS\system32\DNSAPI.dll

0x76F80000 - 0x76F88000         C:\WINDOWS\System32\winrnr.dll

0x76F30000 - 0x76F5C000         C:\WINDOWS\system32\WLDAP32.dll

0x76F90000 - 0x76F96000         C:\WINDOWS\system32\rasadhlp.dll

0x071B0000 - 0x071B8000         C:\bea\jdk142_05\jre\bin\nio.dll

0x07CD0000 - 0x07CD6000         C:\bea\jdk142_05\jre\bin\ioser12.dll

0x07DE0000 - 0x07DE5000         C:\bea\weblogic81\server\bin\stackdump.dll

0x07E30000 - 0x07E35000         C:\bea\weblogic81\server\bin\wlntio.dll

0x76C60000 - 0x76C88000         C:\WINDOWS\system32\imagehlp.dll

0x68D60000 - 0x68E01000         C:\WINDOWS\system32\DBGHELP.dll

0x77BD0000 - 0x77BD8000         C:\WINDOWS\system32\VERSION.dll

0x76BC0000 - 0x76BCB000         C:\WINDOWS\system32\PSAPI.DLL

 

Heap at VM Abort:

Heap

 def new generation   total 2304K, used 1362K [0x10010000, 0x10290000, 0x10f7000

0)

  eden space 2048K,  59% used [0x10010000, 0x101407b8, 0x10210000)

  from space 256K,  56% used [0x10250000, 0x10274400, 0x10290000)

  to   space 256K,   0% used [0x10210000, 0x10210000, 0x10250000)

 tenured generation   total 30272K, used 29848K [0x10f70000, 0x12d00000, 0x1c810

000)

   the space 30272K,  98% used [0x10f70000, 0x12c961f0, 0x12c96200, 0x12d00000)

 compacting perm gen  total 27904K, used 27876K [0x1c810000, 0x1e350000, 0x24810

000)

   the space 27904K,  99% used [0x1c810000, 0x1e3493b0, 0x1e349400, 0x1e350000)

 

Local Time = Tue Apr 25 13:46:19 2006

Elapsed Time = 327

#

# The exception above was detected in native code outside the VM

#

# Java VM: Java HotSpot(TM) Client VM (1.4.2_05-b04 mixed mode)

#

# An error report file has been saved as hs_err_pid2616.log.

# Please refer to the file for further information.

#

posted @ 2006-04-26 09:08 小小程序程序员混口饭吃 阅读(922) | 评论 (0)编辑 收藏


tomcat去调用weblogic上的EJB服务,抛出的异常,好像是tomcat 与weblogic之间的认证造成的,
ejb的调用是成功的,抛出的异常并没有影响到程序的执行,请大家帮忙看看什么问题,mbean的问题,是不是tomcat的某些组件的配置问题?

006-4-19 14:55:38 org.apache.commons.modeler.Registry registerComponent

严重 : Error registering Catalina:type=RequestProcessor,worker=http-8080,name=Htt

Request3

ava.security.AccessControlException: Access denied (mx4j.server.MBeanTrustPermi

sion register): MBean class org.apache.commons.modeler.BaseModelMBean is not tr

sted for registration

       at mx4j.server.interceptor.SecurityMBeanServerInterceptor.checkTrustRegi

tration(SecurityMBeanServerInterceptor.java:156)

       at mx4j.server.interceptor.SecurityMBeanServerInterceptor.registration(S

curityMBeanServerInterceptor.java:116)

       at mx4j.server.interceptor.DefaultMBeanServerInterceptor.registration(De

aultMBeanServerInterceptor.java:113)

       at mx4j.server.interceptor.DefaultMBeanServerInterceptor.registration(De

aultMBeanServerInterceptor.java:113)

       at mx4j.server.interceptor.ContextClassLoaderMBeanServerInterceptor.regi

tration(ContextClassLoaderMBeanServerInterceptor.java:108)

       at mx4j.server.MBeanServerImpl.registerImpl(MBeanServerImpl.java:1051)

       at mx4j.server.MBeanServerImpl.registerMBeanImpl(MBeanServerImpl.java:10

2)

       at mx4j.server.MBeanServerImpl.registerMBean(MBeanServerImpl.java:978)

       at org.apache.commons.modeler.Registry.registerComponent(Registry.java:8

1)

       at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.init(

ttp11Protocol.java:670)

       at org.apache.tomcat.util.net.TcpWorkerThread.getInitData(PoolTcpEndpoin

.java:527)

       at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadP

ol.java:672)

       at java.lang.Thread.run(Thread.java:534)

006-4-19 14:55:38 org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandl

r init

警告 : Error registering request

006-4-19 14:55:47 org.apache.commons.modeler.Registry registerComponent

严重 : Error registering Catalina:type=RequestProcessor,worker=http-8080,name=Htt

Request4

ava.security.AccessControlException: Access denied (mx4j.server.MBeanTrustPermi

sion register): MBean class org.apache.commons.modeler.BaseModelMBean is not tr

sted for registration

       at mx4j.server.interceptor.SecurityMBeanServerInterceptor.checkTrustRegi

tration(SecurityMBeanServerInterceptor.java:156)

       at mx4j.server.interceptor.SecurityMBeanServerInterceptor.registration(S

curityMBeanServerInterceptor.java:116)

       at mx4j.server.interceptor.DefaultMBeanServerInterceptor.registration(De

aultMBeanServerInterceptor.java:113)

       at mx4j.server.interceptor.DefaultMBeanServerInterceptor.registration(De

aultMBeanServerInterceptor.java:113)

       at mx4j.server.interceptor.ContextClassLoaderMBeanServerInterceptor.regi

tration(ContextClassLoaderMBeanServerInterceptor.java:108)

       at mx4j.server.MBeanServerImpl.registerImpl(MBeanServerImpl.java:1051)

       at mx4j.server.MBeanServerImpl.registerMBeanImpl(MBeanServerImpl.java:10

2)

       at mx4j.server.MBeanServerImpl.registerMBean(MBeanServerImpl.java:978)

       at org.apache.commons.modeler.Registry.registerComponent(Registry.java:8

1)

       at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.init(

ttp11Protocol.java:670)

       at org.apache.tomcat.util.net.TcpWorkerThread.getInitData(PoolTcpEndpoin

.java:527)

       at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadP

ol.java:672)

       at java.lang.Thread.run(Thread.java:534)

006-4-19 14:55:47 org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandl

r init

警告 : Error registering request

 

posted @ 2006-04-20 08:54 小小程序程序员混口饭吃 阅读(1116) | 评论 (1)编辑 收藏
在新的项目中,领导要求所有的图片样式表都必须使用相对路径,../../来回写很麻烦,跟我要求用绝对路径/jsp/images,结果被领导批驳一番,唉,领导总是对的,谁叫俺是小兵呢

  俺认为对的理由是

   (1)用绝对路径不用考虑考虑部署带来的问题
   (2)XP开发过程中,需要快速重构,特别是调整文件夹和模块的时候,图片样式表都不用改动
   (3)在SERVLET和JSP之间forward的时候,servlet的context path 跟JSP的context不可能永远保持一致,会导致图片和样式表的路径有误,当你用struts的时候/login/login.do,与/jsp/login/login.jsp的conetext path不一致,会出现图片路径错误,要避免这个问题,必须调整.do 为/jsp/login/login.do,或者直接调整module 为config/jsp,才能调整过来.

 以上3点就是俺的理由,不知道俺错了还是领导错了
posted @ 2006-04-19 20:54 小小程序程序员混口饭吃 阅读(585) | 评论 (2)编辑 收藏

Ejb 的调用问题

 

 

  环境:在 web.xml 中定义了 ejb 的方式 islocal,provider_url ,可以远程调用,也可以本地调用 , 设计在 servlet plugin 里面缓存了 home 的接口,然后进行远程的 2 weblogic 之间使用, 1 台部署 war 包,另外一台部署 ejb 应用,可以调用,没有任何问题 . 按理说吧 wlclient.jar 打到 war 里面,然后把 WAR 部署在 Tomcat 上也能调用,当 servlet 起来的时候通过 plugin home 接口缓存起来,一样能运行,但是抛出异常。反复查找原因,原来是 tomcat classloader 有问题,在 plugin 缓存的时候并没有找到 wlclient 的包 ( 我个人认为 ) ,所以改动一下缓存 home 接口的方式,在 plugin 里面不实行缓存,在第一调用的时候缓存, tomcat 启动正常,程序运行也正常,问题得到解决,用的是weblogic 8.1 tomcat 4.1

posted @ 2006-04-19 08:51 小小程序程序员混口饭吃 阅读(3006) | 评论 (3)编辑 收藏

ClassLoader in Tomcat (http://rosonsandy.blogdriver.com/rosonsandy/871539.html


1 - Tomcat 的类载入器的结构

Tomcat Server 在启动的时候将构造一个ClassLoader树,以保证模块的类库是私有的
Tomcat Server
ClassLoader结构如下:

        +-----------------------------+ 

        |         Bootstrap          

        |             |               

        |          System            

        |             |              

        |          Common            

        |         /      \           

        |     Catalina  Shared       

        |               /    \       

         |          WebApp1  WebApp2  

        +-----------------------------+

其中:
- Bootstrap -
载入JVM自带的类和$JAVA_HOME/jre/lib/ext/*.jar
- System -
载入$CLASSPATH/*.class
- Common -
载入$CATALINA_HOME/common/...,它们对TOMCAT和所有的WEB APP都可见
- Catalina -
载入$CATALINA_HOME/server/...,它们仅对TOMCAT可见,对所有的WEB APP都不可见
- Shared -
载入$CATALINA_HOME/shared/...,它们仅对所有WEB APP可见,对TOMCAT不可见(也不必见)
- WebApp -
载入ContextBase?/WEB-INF/...,它们仅对该WEB APP可见

2 - ClassLoader 的工作原理

每个运行中的线程都有一个成员contextClassLoader,用来在运行时动态地载入其它类
系统默认的contextClassLoadersystemClassLoader,所以一般而言java程序在执行时可以使用JVM自带的类、$JAVA_HOME/jre/lib/ext/中的类和$CLASSPATH/中的类
可以使用
Thread.currentThread().setContextClassLoader(...); 更改当前线程的contextClassLoader,来改变其载入类的行为

ClassLoader 被组织成树形,一般的工作原理是:
1)
线程需要用到某个类,于是contextClassLoader被请求来载入该类
2) contextClassLoader
请求它的父ClassLoader来完成该载入请求
3)
如果父ClassLoader无法载入类,则contextClassLoader试图自己来载入

注意 WebApp?ClassLoader的工作原理和上述有少许不同:
它先试图自己载入类(在ContextBase?/WEB-INF/...中载入类),如果无法载入,再请求父ClassLoader完成

由此可得:
-
对于WEB APP线程,它的contextClassLoaderWebApp?ClassLoader
-
对于Tomcat Server线程,它的contextClassLoaderCatalinaClassLoader

3 类的查找

ClassLoader类中loadClass方法为缺省实现,用下面的顺序查找类:

1、调用findLoadedClass方法来检查是否已经被加载。如果没有则继续下面的步骤。

2、如果当前类装载器有一个指定的委托父装载器,则用委托父装载器的loadClass方法加载类,也就是委托给父装载器加载相应的类。

3、如果这个类装载器的委托层级体系没有一个类装载器加载该类,则使用类装载器定位类的特定实现机制,调用findClass方法来查找类。

4 - 部分原代码分析

4.1 - org/apache/catalina/startup/Bootstrap.java

Bootstrap中定义了三个classloader:commonLoader,catalinaLoader,sharedLoader.三者关系如下:

// 注意三个自己定置的ClassLoader的层次关系: 

            // systemClassLoader (root) 

              //   +--- commonLoader 

            //          +--- catalinaLoader 

            //          +--- sharedLoader

Tomcat Server 线程的起点
构造ClassLoader树,通过Thread.currentThread().setContextClassLoader(catalinaLoader)设置当前的classloader为catalinaLoader。
载入若干类,然后转入org.apache.catalina.startup.Catalina类中

4.2 org.apache.catalina.loader.StandardClassLoader.java

通过看loadClass这个方法来看tomcat是如何加载类的,顺序如下:

(0) Check our previously loaded class cache查找已经装载的class
        clazz = findLoadedClass(name);

(1) If a system class, use system class loader通过系统classloader来装载class

        ClassLoader loader = system;
            clazz = loader.loadClass(name);

(2) Delegate to our parent if requested如果有代理则使用父类classloader

            ClassLoader loader = parent;
            if (loader == null)
                loader = system;
            clazz = loader.loadClass(name);

(3) Search local repositories 查找本地类池,比如$CATALINA_HOME/server

           clazz = findClass(name);

(4) Delegate to parent unconditionally 默认使用代理装载器

[ 查看代码]

4.3 - org/apache/catalina/startup/ClassLoaderFactory.java

根据设置创建并返回StandardClassLoader的实例

[ 查看代码]

4.4 - org/apache/catalina/loader/StandardClassLoader.java

类载入器

4.5 - org/apache/catalina/startup/SecurityClassLoad.java

该类仅包含一个静态方法,用来为catalinaLoader载入一些类

[ 查看代码]

Appendix - 参考

[1] http://jakarta.apache.org/tomcat/ 中的Tomcat 4.1.x文档Class Loader HOW-TO

在一个 JVM 中可能存在多个 ClassLoader ,每个 ClassLoader 拥有自己的 NameSpace 。一个 ClassLoader 只能拥有一个 class 对象类型的实例,但是不同的 ClassLoader 可能拥有相同的 class 对象实例,这时可能产生致命的问题。如 ClassLoaderA ,装载了类 A 的类型实例 A1 ,而 ClassLoaderB ,也装载了类 A 的对象实例 A2 。逻辑上讲 A1=A2 ,但是由于 A1 A2 来自于不同的 ClassLoader ,它们实际上是完全不同的,如果 A 中定义了一个静态变量 c ,则 c 在不同的 ClassLoader 中的值是不同的。

posted @ 2006-04-18 08:48 小小程序程序员混口饭吃 阅读(438) | 评论 (0)编辑 收藏

转自:http://m47121.blogchina.com/2555077.html

                                      

编程

  我们将首先编写远程对象,并将代码保存为名字为AddServer.Java的文件:

import Java.rmi.*;

public interface AddServer extends Remote {

public int AddNumbers(int firstnumber,int secondnumber) throws RemoteException;

}

  我们来看看上面的代码。首先,为了使用其内容,我们导入rmi包。然后,我们创建一个扩展了Java.rmi中远程接口的接口。所有的远程对象必须扩展该远程接口,我们将该远程接口称为AddServer。在该远程对象中,有一个名字为AddNumbers的方法,客户端可以调用这一方法。我们必须记住的是,所有的远程方法都需要启动RemoteException方法,有错误发生时就会调用该方法。

  下面我们开始编写远程对象的实现。这是一个实现远程对象并包含有所有方法代码的类,将下面的代码保存为名字为AddServerImpl.Java的文件:

import Java.rmi.*;

public class AddServerImpl extends UnicastRemoteObject implements AddServer {
public AddServerImpl() {
super();
}
public int AddNumbers(int firstnumber,int secondnumber) throws RemoteException {
return firstnumber + secondnumber;
}
}

  首先,我们导入rmi包,然后创建一个扩展UnicastRemoteObject和实现创建的远程对象的类;其次,我们可以为类创建一个缺省的构建器。我们还了解了AddNumbers方法的代码,它启动RemoteException。这样我们就覆盖了创建的远程对象中的方法。AddNumbers方法的代码非常好理解,它接受2个整型参数,然后相加并返回它们的和。

  至此,我们已经有了二个Java文件:远程对象和远程对象的实现。下面我们将使用Javac命令编译这二个文件:

  编译远程对象:

C:\jdk\bin\Javac workingdir\AddServer.Java

  编译远程对象实现:

C:\jdk\bin\Javac workingdir\AddServerImpl.Java

  这样,就会达到二个Java文件和二个类文件,下面我们将创建stub和skeleton。为了创建stub和skeleton文件,我们必须使用rmic编译器编译远程对象实现文件。

  用Rmic编译远程对象实现文件:

C:\jdk\bin\rmic workingdir\AddServerImpl.Java

  然后,我们就会发现多了2个新建的类文件,它们分别是AddServerImpl_Stub.class 和AddServerImpl_Skel.class 。

  The Coding (Contd.)

  我们已经编译了所有的源代码,下面我们来创建客户端和服务器端,将下面的代码保存为名字为RmiServer.Java的文件:

import Java.rmi.*;
import Java.net.*;

public class RmiServer {
public static void main (String args[]) throws RemoteException, MalformedURLException {
AddServerImpl add = new AddServerImpl();
Naming.rebind("addnumbers",add);
}
}

  首先,我们导入Java.rmi包和Java.net包。另外,我们还使用throws从句捕获任何异常。我们从对象中得出远程对象实现,使用rebind方法将字符串addnumbers与该对象绑定。下面的例子显示了绑定的含义:
从现在开始,无论何时客户端要调用远程对象,使用字符串addnumbers就可以实现。rebind方法有二个参数:第一个参数是字符串变量,第二个参数是远程对象实现类的对象。

  下面我们来创建客户端,将下面的代码保存为名字为RmiClient.Java的文件:

import Java.rmi.*;
import Java.net.*;

public class RmiClient {
public static void main(String args[]) throws RemoteException, MalformedURLException {
String url="rmi://127.0.0.1/addnumbers";
AddServer add;
add = (AddServer)Naming.lookup(url);
int result = add.AddNumbers(10,5);
System.out.println(result);
}
}

  首先,我们导入Java.rmi包和Java.net包,并使用throws从句捕获所有必要的异常。然后通过利用Naming类中的静态lookup方法从远程对象中得到一个对象。(这也是我们无需从Naming类中得到一个对象并调用它。而只使用类名字的原因。)

  lookup方法接受远程对象的完整的URL名字,该URL由完整的机器IP地址以及与对象绑定的字符串(也誻对象的绑定名)组成。在调用远程对象时,我们使用了RMI协议。lookup方法向我们返回一个对象,在能够使用它前,我们必须将它的数据类型转换为与远程对象的数据类型一致。

Since we have both our server and client source ready, let's compile them both:

  至此,我们已经有了服务器端和客户端的源代码,下面我们来编译这二个源文件:

  编译远程服务器:

C:\jdk\bin\Javac workingdir\RmiServer.Java

  编译远程客户端:

C:\jdk\bin\Javac workingdir\RmiClient.Java

  在对我们的代码进行测试前,还必须首先启动RMI Registry。RMI Registry存储有所有绑定的数据,没有它,RMI就不能正常地运行!

  启动Rmi Registry服务器:

C:\jdk\bin\start rmiregistry

  我们会注意到,这时会出现一个空白的DOS提示符窗口,这表明Rmi Registry服务器在运行,注意不要关闭该窗口。然后,我们首先在一个DOS提示符窗口中运行Rmi服务器,然后在另一个DOS提示符窗口中运行Rmi客户端。

  启动RMI服务器:

C:\jdk\bin\Java workingdir\RmiServer

  启动RMI客户端:

C:\jdk\bin\Java workingdir\RmiClient

  如果一切正常,我们应该能够得到15这个输出。我们向AddNumbers方法输入10和5二个数字,该方法将这二者加起来,并将其和15返回给我们。如果得到了15这个输出,说明我们已经成功地执行了一个远程方法。当然,在这里,我们并没有执行真正意义上的远程方法,因为我们的计算机既是服务器,又是客户机。如果有计算机网络,我们就可以方便地进行执行远程方法的试验了。

posted @ 2006-04-14 09:17 小小程序程序员混口饭吃 阅读(1797) | 评论 (0)编辑 收藏
 
Spring中事务的定义:
一、Propagation :

对于特定的方法或方法命名模式,代理的具体事务行为由事务属性驱动,如下面的例子所示:
<prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="store*">PROPAGATION_REQUIRED</prop>

  key属性确定代理应该给哪个方法增加事务行为。这样的属性最重要的部份是传播行为。有以下选项可供使用:

  • PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
  • PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
  • PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
  • PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
  • PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  • PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。

      前六个策略类似于EJB CMT:常量名相同,因此,对EJB开发人员来说,应该立刻就感到熟悉。第七个(PROPAGATION_NESTED)是Spring所提供的一个特殊变量。它要求事务管理器或者使用JDBC 3.0 Savepoint API提供嵌套事务行为(如Spring的DataSourceTransactionManager),或者通过JTA支持嵌套事务。

    

二、Isolation Level(事务隔离等级):
1、Serializable:最严格的级别,事务串行执行,资源消耗最大;
2、REPEATABLE READ:保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了“脏读取”和“不可重复读取”的情况,但是带来了更多的性能损失。
3、READ COMMITTED:大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读取”。该级别适用于大多数系统。
4、Read Uncommitted:保证了读取过程中不会读取到非法数据。

spring中的Isolation属性:
1、ISOLATION_DEFAULT :使用当前数据源的默认级别
2、ISOLATION_READ_UNCOMMITTED :Dirty reads, non-repeatable reads, and phantom reads can occur.
3、ISOLATION_READ_COMMITTED :Dirty reads are prevented; non-repeatable reads and phantom reads can occur.
4、ISOLATION_REPEATABLE_READ:Dirty reads and non-repeatable reads are prevented; phantom reads can occur.
5、ISOLATION_SERIALIZABLE:Dirty reads, non-repeatable reads, and phantom reads are prevented.

三、readOnly
事务属性中的readOnly标志表示对应的事务应该被最优化为只读事务。这是一个最优化提示。在一些情况下,一些事务策略能够起到显著的最优化效果,例如在使用Object/Relational映射工具(如:Hibernate或TopLink)时避免dirty checking(试图“刷新”)。

四、Timeout

      在事务属性中还有定义“timeout”值的选项,指定事务超时为几秒。在JTA中,这将被简单地传递到J2EE服务器的事务协调程序,并据此得到相应的解释。

事务划分策略

1、推荐在业务层使用事务,这样可以允许业务层捕获导致rollback的异常,并抛出恰当的业务层异常;不在dao层使用事务是因为这会限制了dao重用其他事务需求,并且dao层没有实现业务逻辑,并且原子性也是业务层的概念。

spring声明性事务的划分:
1、有四个地方需要配置:The four participants are transaction manager, proxy factory, transaction interceptor, and a set of transaction attributes.




2、使用ProxyFactoryBean/Transaction Interceptor(transactionInterceptor)配置spring事务

以下为配置实例:

<!-- The DBCP DataSource -->
  <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"  
        destroy-method="close">
    <property name="driverClassName">
      <value>${jdbc.driverClassName}</value>
    </property>
    <property name="url"><value>${jdbc.url}</value></property>
    <property name="username"><value>${jdbc.username}</value></property>
    <property name="password"><value>${jdbc.password}</value></property>
  </bean>
   
  <!-- The DAO class -->
  <bean id="dao" 
class="org.springframework.prospring.ticket.dao.jdbc.JdbcBoxOfficeDao">
    <property name="dataSource">
      <ref local="dataSource"/>
    </property> 
  </bean>
   
  <!-- The transactionmanager to use for regular non JTA datasource -->
  <bean id="transactionManager"    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource">
      <ref local="dataSource"/>
    </property> 
  </bean>
   
  <!-- TransactionInterceptor -->
  <bean id="transactionInterceptor"     class="org.springframework.transaction.interceptor.TransactionInterceptor">    <property name="transactionManager">      <ref bean="transactionManager"/>    </property>    <property name="transactionAttributeSource">      <value>org.springframework.prospring.ticket.service.BoxOffice.get*=PROPAGATION_SUPPORTS,readOnlyorg.springframework.prospring.ticket.service.BoxOffice.allocate*=PROPAGATION_REQUIRED
      </value>
    </property>
  </bean>  
   
  <!-- Transactional proxy for the primary business object -->
  <bean id="boxOffice"         class="org.springframework.aop.framework.ProxyFactoryBean">    <property name="target">      <ref local="boxOfficeTarget"/>    </property>    <property name="proxyInterfaces">      <value>org.springframework.prospring.ticket.service.BoxOffice</value>    </property>    <property name="interceptorNames">      <value>transactionInterceptor</value>    </property>
  </bean>  
   
  <!-- Business Object -->
  <bean id="boxOfficeTarget" 
    class="org.springframework.prospring.ticket.service.BoxOfficeImpl">
    <property name="boxOfficeDao">
      <ref local="dao"/>
    </property> 
  </bean>

3、使用TransactionProxyFactoryBean配置spring事务
以下为配置实例:

  <!-- The DBCP DataSource -->
  <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
        destroy-method="close">
    <property name="driverClassName">
      <value>${jdbc.driverClassName}</value>
    </property>
    <property name="url"><value>${jdbc.url}</value></property>
    <property name="username"><value>${jdbc.username}</value></property>
    <property name="password"><value>${jdbc.password}</value></property>
  </bean>
   
  <!-- The DAO class -->
  <bean id="dao"
class="org.springframework.prospring.ticket.dao.jdbc.JdbcBoxOfficeDao">
    <property name="dataSource">
      <ref local="dataSource"/>
    </property> 
  </bean>
   
  <!-- The transactionmanager to use for regular non JTA datasource -->
  <bean id="transactionManager"    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource">
      <ref local="dataSource"/>
    </property> 
  </bean>
   
  <!-- Transactional proxy and the primary business object -->
  <bean id="boxOffice"    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">    <property name="transactionManager"><ref bean="transactionManager"/></property>    <property name="target">      <bean class="org.springframework.prospring.ticket.service.BoxOfficeImpl">
        <property name="boxOfficeDao">
          <ref local="dao"/>
        </property> 
      </bean>
    </property>
    <property name="transactionAttributes">      <props>        <prop key="get*">PROPAGATION_SUPPORTS,readOnly</prop>        <prop key="allocate*">PROPAGATION_REQUIRED</prop>      </props>    </property>
  </bean>  

4、使用BeanNameAutoProxyCreator配置spring事务
如果有大量的bean需要使用事物,那么只要在配置文件中提供bean name给BeanNameAutoProxyCreator,spring就会个给该bean提供事务代理,配置实例如下:

  <!-- The DBCP DataSource -->
  <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
      destroy-method="close">
    <property name="driverClassName">
      <value>${jdbc.driverClassName}</value>
    </property>
    <property name="url"><value>${jdbc.url}</value></property>
    <property name="username"><value>${jdbc.username}</value></property>
    <property name="password"><value>${jdbc.password}</value></property>
  </bean>
   
  <!-- The DAO class -->
  <bean id="dao"
class="org.springframework.prospring.ticket.dao.jdbc.JdbcBoxOfficeDao">
    <property name="dataSource">
      <ref local="dataSource"/>
    </property> 
  </bean>
   
  <!-- The transactionmanager to use for regular non JTA datasource -->
  <bean id="transactionManager"    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource">
      <ref local="dataSource"/>
    </property> 
  </bean> 
   
  <!-- TransactionInterceptor -->
  <bean id="transactionInterceptor"         class="org.springframework.transaction.interceptor.TransactionInterceptor">    <property name="transactionManager">      <ref bean="transactionManager"/>    </property>    <property name="transactionAttributeSource">      <value>org.springframework.prospring.ticket.service.BoxOffice.get*=PROPAGATION_SUPPORTS,readOnlyorg.springframework.prospring.ticket.service.BoxOffice.allocate*=PROPAGATION_REQUIRED      </value>    </property>
  </bean>  
   
  <!-- BeanNameAutoProxyCreator -->
<bean id="autoProxyCreator"    class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">  <property name="interceptorNames">    <value>transactionInterceptor</value>  </property>  <property name="beanNames">    <list>      <idref local="boxOffice"/>    </list>  </property>
</bean>  
   
<!-- Business Object -->
<bean id="boxOffice"
   class="org.springframework.prospring.ticket.service.BoxOfficeImpl">
  <property name="boxOfficeDao">
    <ref local="dao"/>
  </property> 
</bean>
posted on 2006-04-04 09:06 loocky 阅读(0)
posted @ 2006-04-13 09:04 小小程序程序员混口饭吃 阅读(414) | 评论 (0)编辑 收藏
 
Kodo是BEA公司收购SolarMetric公司后获得的持久层框架项目,以前只是支持JDO标准,2006年2月13日,BEA公司宣布发布Kodo项目的最新版本——Kodo 4.0.0 Early Access 4,Kodo 4.0.0 EA4支持EJB3和JDO2两个标准,本文中,我们将首先学习和了解KODO EJB,了解如何使用Kodo EJB完成开发工作。

    我们将按照两种不同的情况讲述如何使用Kodo EJB进行开发,一种是通过命令行工具,另外一种是在Eclipse中使用Ant任务。

    关于EJB3和JDO2的更多内容请大家查看文章最后参考资源中的相关内容。

    为什么使用Kodo EJB

  
在Kodo EJB框架中,对象和关系数据库之间的映射(对象-表,对象属性-字段等)都是使用JDK5.0中的最新特性—注释(Annotation)来提供,不再需要提供额外的配置文件。

    根据EJB3规范的要求,Kodo EJB除了支持在EJB容器中使用满足重量级企业应用的需求之外,也支持在普通Java应用中采用,提供轻量级的持久层框架。只不过当我们在EJB容器中使用Kodo EJB时我们需要更多的工作以便满足EJB容器的要求。

    下载、安装Kodo

  准备工作

  
由于Kodo是基于注释机制的框架,我们必须使用JDK5.0完成开发工作。所以下载、安装Kodo之前,请确保您已经下载和安装了JDK5.0.

    为了演示的需要,我们选择MySQL数据库作为持久化的目标数据库,请大家自己到www.mysql.com下载最新的MySQL数据库后安装。

    下载、安装Kodo

  Kodo的最新版本是Kodo 4.0.0 Early Access 4,目前大家可以到http://www.solarmetric.com/去下载试用版本,下载时需要注册,你会得到30天的License.

    将下载的压缩文件解压到c:/kodo4目录下(后面将使用%KODO_HOME%来引用这个目录),打开%KODO_HOME%/bin/kodocmd.cmd文件,将其中的KODODIR设置为您的Kodo的安装目录,将JDKHOME设置为Java的安装目录。

    Kodo EJB实例

  
上面的工作完成以后,我们就可以开发Kodo EJB应用了,下面的例子将主要讲述如何开发一个轻量级的Kodo EJB例子,支持在Java应用中的调用,而不依赖于EJB容器,关于如何在EJB容器中配置使用Kodo EJB是一个大的课题,作者将另外撰文详细论述。

    下面我们将用一个简单的例子来说明创建Kodo EJB应用的典型步骤,实例中我们将创建名为Book的持久化对象,该对象将被持久化到本地的MySQL数据库中。

    请大家注意的是,下面的说明都基于Windows 2000操作系统,如果您使用其它操作系统,可能需要做出相应的变更。

    建立工程目录在C:盘根目下创建名为KodoExamples的目录,我们所有的类文件和配置都放在这个目录下。

    创建持久化类新创建持久化类Book,为了说明的简单,该类只有两个属性:id和name,其中id是书的编号(编号由MySQL数据库自动生成),name属性表示书的名称。持久化类的全部代码、注释和说明如下: ackage org.vivianj.kodo.examples.beans;import javax.persistence.Basic;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.Inheritance;import javax.persistence.InheritanceType;import javax.persistence.Table;

    /** * Book 用于表征系统中的书籍对象,他有两个属性id - 书籍编号,书籍编号将由MySQL数据库自动生成name - 书名*/ /* Entity注释表示该类是持久化类,的name属性是该实体在查询中对应的唯一名称,默认是类名 */(name = "Book")

    /* Table注释的name属性指定该持久化类对应的数据表的名称,默认数据表名和类名保持一致,为了增强代码的可移植性,建议大家在name属性中使用大写英文字母 */(name = "BOOKS")

    /* Inheritance注释的strategy确定了持久化对象和数据表之间的关系,可选择项包括SINGLE_TABLE、JOINED和TABLE_PER_CLASS,我们这里采用TABLE_PER_CLASS */(strategy = InheritanceType.TABLE_PER_CLASS)

    public class Book { /* Id注释表示该字段是标识字段 */

    /* GeneratedValue注释定义了该标识字段的产生方式,我们的演示系统中id由MySQL数据库字段自动生成,因此选择GenerationType.IDENTITY */(strategy = GenerationType.IDENTITY)

    /* Column注释的name属性定义了该类属性对应的数据字段的名称,为了最大限度保持系统和数据库之前的独立性,建议使用大写字符 */(name = "ID")

    public int id;

    /* Basic注释表示该属性是基本属性 */

    /* Column注释的name属性定义了该类属性对应的数据字段的名称,为了最大限度保持系统和数据库之前的独立性,建议使用大写字符 */(name = "NAME")

    public String name = null;准备数据库在MySQL数据库中新建名为Kodo的数据库。

    准备配置文件在C:KodoExamples新建META-INF目录,随后在该目录下新建kodo.xml和persistence.xml文件。

    a)

    Kodo.xml文件中提供访问数据库所需要的细节信息、使用Kodo所需要的授权(License)内容、Kodo运行时的日志管理等。

    <?xml version="1.0"?> <persistence> <persistence-unit name=""> <properties> <!—— Kodo的序列号,请输入您下载或者购买Kodo时得到的License ——> <property name="kodo.LicenseKey" value="093D-BF3F-C10E-0F8F-0F00" />

    <!—— 以下是访问数据库时需要提供的信息 ——> <property name="kodo.ConnectionURL" value="jdbc:mysql://localhost/kodo" /> <property name="kodo.ConnectionDriverName" value="org.gjt.mm.mysql.Driver" /> <property name="kodo.ConnectionUserName" value="root" /> <property name="kodo.ConnectionPassword" value="root" />

    <!—— 设置Kodo运行过程中的日志级别 ——> <property name="kodo.Log" value="DefaultLevel=WARN, Runtime=INFO, Tool=DEBUG" /> </properties> </persistence-unit> </persistence>

    b)

    persistence.xml提供EJB实体管理所需要的信息,比如确定使用哪种持久化管理器和需要被管理的持久化类。

    <?xml version="1.0"?> <persistence> <persistence-unit name=""> <provider>kodo.persistence.PersistenceProviderImpl</provider> <!—— 需要被Kodo EJB管理的持久化类 ——> <class>org.vivianj.kodo.examples.beans.Book</class> </persistence-unit> </persistence>编译持久化类打开一个命令行窗口,进入%KODO_HOME%/bin目录下,执行kodocmd.cmd命令,然后将MySQL的驱动文件使用set classpath=%classpath%;c:/mysql-connector-java-3.1.8-bin.jar这样的方式加入到CLASSPATH中。

    执行javac C:KodoExamplesorgvivianjkodoxampleseans*.java编译持久化类。

    加强(Enhancer)持久化类KODO中使用加强工具(Enhancer)对持久化类进行调整,支持性能优化、懒惰式装载等特性。

    我们可以使用kodoc C:KodoExamplesorgvivianjkodoxampleseans*.java这样的命令来完成持久化类的加强工作。

    生成数据库表KODO中提供了专门的MappingTool工具,能够自动的根据持久化类及他们之间的关系为我们生成创建数据库所需要的SQL语句或者直接创建数据表。

    演示实例中,我们使用kodoc C:KodoExamplesorgvivianjkodoxampleseans*.java完成数据表的创建,命令执行完成后,我们访问MySQL中的kodo数据库,可以看到里面已经创建了名为books的数据表。

    测试一下现在,所有的工作都已经完成,我们可以编写一段代码测试一下上面的工作是否有效,在C:kodoExamples目录下新建Test.java,然后输入如下内容:

    import javax.persistence.EntityManager;import javax.persistence.EntityManagerFactory;import javax.persistence.Persistence;import javax.persistence.PersistenceContextType;

    import org.vivianj.kodo.examples.beans.Book;

    public class Test {

    public static void main(String[] args) { /* 获得EJB的实体管理器 */ EntityManagerFactory emf = Persistence.createEntityManagerFactory(null);EntityManager em = emf。createEntityManager(PersistenceContextType.EXTENDED);/* 开始事务 */ em.getTransaction()。begin();

    /* 创建新的持久化对象 */ Book book = new Book();/* 设置Book对象的name属性 */ book.name = "Kodo入门";/* 持久化对象 */ em.persist(book);

    /* 结束事务 */ em.getTransaction()。commit();em.close();emf.close();}

    }执行Test类,执行完后会发现books表中已经增加了一条新的记录。

    在Eclipse中开发Kodo EJB上面的步骤都是基于命令行的,操作起来不是很方便,因此我们需要考虑将Kodo的开发过程和Eclipse开发工具进行集成。

    分析上面开发Kodo EJB的整个过程,只有步骤 5)加强(Enhancer)持久化类和 6)生成数据表和字段无法在Eclipse中直接实现,查看Kodo的帮助文档,发现Kodo的发布包中已经提供了对应命令的Ant任务脚本,因此我们可以使用Ant来完成Eclipse和Kodo的集成。

    我们仍然使用上面的例子来演示如何在Eclipse中开发Kodo EJB,我们打开Eclipse,新建立KodoExamples工程,将%KODO_HOME%ib下面所有jar文件加入到该工程的引用中,将您所使用的数据库的JDBC驱动jar文件也加入到该工程的引用中。然后请大家参考上面的说明完成前5步工作,下面我们主要描述如何完成Ant配置文件。

    基本配置内容在工程的当前目录下,新建build.xml文件,输入如下内容:

    <project name="kodo enhance" basedir="." default="enhance"> <!— 请将value的值设置为您安装kodo时选择的目录 ——> <property name="KODO_HOME" value="C:kodo4" /> <property name="src" value="." /> <property name="classes" value="." />

    <!——  准备公用的CLASSPATH路径 ?

    <path id="build_classpath"> <pathelement location="" /> <!—此处请输入数据库驱动文件的路径,作者使用的MySQL数据库驱动 ?

    <pathelement location="C:/ mysql-connector-java-3.1.8-bin.jar" />

    <fileset dir="/lib"> <include name="**/*.jar" /> </fileset> </path> </project>编写完成步骤 6)加强(Enhance)持久化类所需要的任务和这个步骤对应的任务是kodo.ant.PCEnhancerTask类,在%KODO_HOME%srckodont下面我们可以看到PCEnhancerTask类的源代码。首先使用taskdef加入新的任务类型kodoc,然后调用该任务完成工作。

    在build.xml文件中增加如下内容:

    <target name="enhance"> <!——  引入新的Ant任务 ?

    <taskdef name="kodoc" classname="kodo.ant.PCEnhancerTask"> <!——  引用上面步骤中定义的build_classpath作为CLASSPATH ?

    <classpath refid="build_classpath" /> </taskdef>

    <kodoc jdoEnhance="true"> <fileset dir="."> <!——  指定需要被加强的持久化类,可以使用通配符* ?

    <include name="**/Book.java" /> </fileset> <!——  引用上面步骤中定义的build_classpath作为CLASSPATH ?

    <classpath refid="build_classpath" /> </kodoc> </target>编写完成步骤 7)生成数据库表所需要的任务Kodo包中为这个任务提供的任务类kodo.jdbc.ant.MappingToolTask在Eclipse中执行时有点问题,我将它修改了一下,主要是修改执行该任务时使用的ClassLoader,现在可以满足要求了。

    在当前工程中新建kodo.jdbc.ant.MappingToolTask类(目录中的类比lib文件中的类有更高的执行级别),类的代码可以在%KODO_HOME%/src/kodo/jdbc/ant目录下找到。在类源代码中找到这两行。

    if (!MappingTool.run (conf, files, flags, loader))

    throw new BuildException (_loc.get ("bad-conf", "MappingToolTask"));将它修改为:if (!MappingTool.run (conf, files, flags, MappingTool.class.getClassLoader ()))

    throw new BuildException (_loc.get ("bad-conf", "MappingToolTask"));

    现在,我们在build.xml文件中增加如下内容就可以完成项目中生成持久化类对应的数据库表了:<target name="create-schema"> <!——  引入新的Ant任务 ?

    <taskdef name="mappingtool" classname="kodo.jdbc.ant.MappingToolTask"> <!——  引用上面步骤中定义的build_classpath作为CLASSPATH ?

    <classpath refid="build_classpath" /> </taskdef>

    <mappingtool action="refresh"> <!——  引用上面步骤中定义的build_classpath作为CLASSPATH ?

    <classpath refid="build_classpath" /> <fileset dir=""> <!——  指定需要生成数据表的持久化类,可以使用通配符* ?

    <include name="**/Book.java" /> </fileset> </mappingtool> </target>现在你可以将打开Eclipse中的Ant视图,然后再其中执行Enhance和create-schema任务,完成加强持久化类和创建数据库表的工作,最后,你可以使用同样的测试代码完成代码的测试工作。

    总结

  Kodo是BEA最新发布的持久层框架,屏蔽了开发者访问数据库的众多细节,为开发者提供了更加简单的编程模式,大大较少了开发量,目前Kodo支持EJB3和JDO2标准。BEA承诺在不久的将来将Kodo的核心代码开源。

    本文中,作者通过一个简单的例子,详细地讲解了如何完成Kodo EJB的开发工作,同时讲解了如何在Eclipse中集成Kodo完成开发的步骤,并且解决了集成过程中还存在的一个小问题,希望能够帮助大家更好的学习和使用Kodo.

    参考资源:

  
EJB3规范:http://jcp.org/aboutJava/communityprocess/pfd/jsr220/index.html
  JDO2规范:http://jcp.org/aboutJava/communityprocess/pfd/jsr243/index.html
  Kodo在线文档:http://solarmetric.com/kodo/Documentation/4.0.0EA4/docs/full/html/index.html

    作者简介

  
唯J族(www.vivianj.org)创始人,BEA 杭州User Group负责人,自由撰稿人,开源项目BuildFileDesigner(buildfiledesign.sourceforge.net)和V-Security(v-security.sourceforge.net)创始人。

posted @ 2006-04-13 09:03 小小程序程序员混口饭吃 阅读(241) | 评论 (0)编辑 收藏
 
牛牛的站
JDON
posted @ 2006-04-13 09:02 小小程序程序员混口饭吃 阅读(178) | 评论 (0)编辑 收藏
 

JTA(Java Transaction API)是一种高层的,与实现无关的,与协议无关的API,应用程序和应用服务器可以使用JTA来访问事务。


JTA是Java Transaction API,是java为处理事务而引入的API,这个事务,包括分布式事务。Java内部的JDBC也提供了事务支持,但那只面向单数据源的本地事务管理。若想做分布式事务管理,必须求助于JTA。



        Transaction不管在J2EE还是.NET领域中都是相当重要的一个组成部分。尽管很多与Transaction相关的概念在两个不同的平台中都是相通的,但是它们在Transaction的实现方面却有着很多的不同。想对.NET下的Transaction有更深入了解的朋友,可以参考 idior 兄写 Transaction in ADO.net 2.0 。在以下的篇幅里面,我就J2EE中与Transaction相关的几个概念做些讲述。
        1.什么是Transaction?所谓Transaction是指一系列不可分割的改动数据库的操作。在这个解释中,有三个关键词:一系列不可分割以及改动。仅仅是一个改动数据库的操作是没有Transaction可言,只有“一系列”操作(一组SQL语句)才可能组成Transaction;“不可分割”就意味着一致性和完整性,要么这一系列操作全部commit,要么就全部rollback;如果一系列的操作只包含enquiry操作,那么这些操作也不是Transaction。 
        2.在J2EE中,Transaction主要有几大类,具体有几种?在J2EE中,Transaction主要有Bean-Managed Transaction和Container-Managed Transaction两大类。其中在Bean-Managed Transaction中还会分为JDBC Transaction和JTA Transaction两种。
        3.什么是JDBC Transaction?它有怎样的特点?JDBC Transaction是指由Database本身去管理的事务。其最大的特点就是通过显示调用Connection接口的commit和rollback方法来完成事务的提交和回滚。事务结束的边界是commit或者rollback方法的调用,而开始的边界则不是那么明显了,它会开始于组成当前事务的所有statement中的第一个被执行的时候。具体代码如下:

class  CreditDAoImpl implements CreditDAO  {
    Connection conn 
=
 getConnection();
    
public   void  transfer(Currency amount, Account fromAccount, Account toAccount) throws CreditException 
{
        
try  
{
             conn.setAutoCommit(
false
);
             depositToAccount(conn, toAccount, amount);
             withdrawFromAccount(conn, fromAccount, amount);     
             conn.commit();
        }
  catch  (Exception e)  {
            
try  
{
                 conn.rollback();
                 
throw   new
 CreditException(e.getMessage());
            }
  catch  (SQLException e1)  {
                 
throw   new
 CreditException(e.getMessage());
            }
                       
        }
 
    }

}

        4.什么是JTA Transaction?它有怎样的特点呢?JTA Transaction是指由J2EE Transaction manager去管理的事务。其最大的特点是调用UserTransaction接口的begin,commit和rollback方法来完成事务范围的界定,事务的提交和回滚。JTA Transaction可以实现同一事务对应不同的数据库,但是它仍然无法实现事务的嵌套。具体的代码如下[1]

public   void  withdrawCash( double  amount)  {
   UserTransaction ut 
=
 context.getUserTransaction();
   
try  
{
      ut.begin();
      updateChecking(amount);
      machineBalance 
-=
 amount;
      insertMachine(machineBalance);
      ut.commit();
   }
  catch  (Exception ex)  {
       
try  
{
          ut.rollback();
       }
  catch  (SystemException syex) 
{
           
throw   new
 EJBException
              (
" Rollback failed:  "   +
 syex.getMessage());
       }

       
throw   new  EJBException 
          (
" Transaction failed:  "   +
 ex.getMessage());
    }

}

        5.什么是Container-Managed Transaction?它又有怎样的特点呢?Container-Managed Transaction,顾名思义,就是由Container负责管理的Transaction,当然这样Transaction是出现在EJB的范畴中。Container-Managed Transaction最大的特点是不需要显式界定事务的边界,也不需要显式的提交或者回滚事务,这一切都由Container来替我们完成。我们需要做的就是设定在一个Bean中,哪些方法是跟事务相关的,同时设定它们的Transaction Attribute既可。
        Transaction的Scope是相当重要的,特别是在一个Bean的方法中调用另外一个Bean的方法。为了便于说明问题,我们把这两个方法分别称为methodA和methodB。当methodA调用methodB的时候,methodB在事务的层面上对调用者methodA有怎样的限制(methodB中是否存在事务)以及methodA如何在事务的层面上实现对methodB的调用(是否需要重新创建一个新的事务来处理methodB的调用)都需要通过Transaction Attribute来设定的。具体的Transaction Attribute有以下六种:Required,RequiresNew,Mandatory,NotSupported,Supports和Never。有关Transaction Attribute的介绍,可以参阅J2EE Tutorial中关于Container-Managed Transaction的介绍

posted @ 2006-04-13 09:02 小小程序程序员混口饭吃 阅读(496) | 评论 (0)编辑 收藏
 
读了几遍struts的源代码,感觉struts还是比较容易扩充的,比如对taglib,对action servlet的扩充,对struts-config.xml的扩充都是比较容易的,但是也存在一些问题
1:struts的taglib感觉是struts里面最不灵活的(用法不灵活)
2:exception handler是个不错的设计
3:对plugin,filter的支持只是对servlet的一个扩充支持而已
4:  多种action:baseaction ,dispacth ,mappingdispach,lookup,等等提供多种支持还是不错的
5:对于doubleclick和reload的token支持感觉效果一般,并不是很灵活
6:form的使用还是有些绑定比较死
7:validator的设计也不是很灵活,感觉在action没有valitor,很不灵活,设计在Formbean中难道是为了结构?


有时间读一下webwork的源代码,看一下webwork的优缺点
posted @ 2006-04-13 09:02 小小程序程序员混口饭吃 阅读(160) | 评论 (0)编辑 收藏
 
    在开发ejb之前,我们先得配置好服务器,我使用的是Weblogic9.0中文版,关于Weblogic9.0配置请看我的另一片文章。配置Weblogic9.0
   
    首先需要配置好eclipse。我这里主要说明weblogic的配置。
    ejb19.jpg

    注意JDK选择JDK5.0的版本。
   
    顺便将weblogic8的配置也贴上来,供大家比较参考
    ejb18.jpg
   
    注意weblogic8的JDK版本必须是JDK1.4。
   
    接下来就开始我们的开发了。

ejb1.jpg

ejb2.jpg

ejb3.jpg

ejb4.jpg

ejb5.jpg

下面就是SessionBean的代码
30

其实就是修改了其中的一个方法:
 1 /**
 2      * An example business method
 3      *
 4      * @ejb.interface-method view-type = "remote"
 5      * 
 6      * @throws EJBException Thrown if method fails due to system-level error.
 7      */
 8     public String hello() throws EJBException {
 9         // rename and start putting your business logic here
10         return new String("HelloEJBWorld!");
11     }
注意:代码中的解释文字不要删除,因为XDoclet需要。

配置属性
ejb6.jpg

添加weblogic.jar。我的路径是:bea\weblogic90\server\lib\weblogic.jar
ejb16.jpg

ejb7.jpg

ejb8.jpg

ejb9.jpg

ejb10.jpg

ejb11.jpg

ejb12.jpg

ejb13.jpg

ejb14.jpg

ejb15.jpg

就下来写EJBTest类:
 1 package com;
 2 
 3 import java.rmi.RemoteException;
 4 import java.util.Properties;
 5 
 6 import javax.ejb.CreateException;
 7 import javax.naming.Context;
 8 import javax.naming.InitialContext;
 9 import javax.naming.NamingException;
10 
11 import com.interfaces.HelloWorld;
12 import com.interfaces.HelloWorldHome;
13 
14 public class EJBTest {
15 
16     /**
17      * @param args
18      */
19     public static void main(String[] args) {
20         // TODO 自动生成方法存根
21         Properties properties=new Properties();
22         properties.setProperty(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
23         properties.setProperty(Context.PROVIDER_URL,"t3://localhost:7001");
24         
25         Context context;
26         try {
27             context = new InitialContext(properties);
28             HelloWorldHome hwh=(HelloWorldHome)context.lookup("ejb/HelloWorld");
29             HelloWorld hw=hwh.create();
30             String s=hw.hello();
31             System.out.println(s);
32         } catch (NamingException e) {
33             // TODO 自动生成 catch 块
34             e.printStackTrace();
35         } catch (RemoteException e) {
36             // TODO 自动生成 catch 块
37             e.printStackTrace();
38         } catch (CreateException e) {
39             // TODO 自动生成 catch 块
40             e.printStackTrace();
41         }
42         
43     }
44 
45 
46 }
47 


最后就是看结果了,先启动weblogic,然后运行EJBTest程序。

ejb17.jpg




作者写了一篇很好的文章:出处(http://www.blogjava.net/rickhunter/articles/25484.html)感谢他的辛苦劳动!
posted @ 2006-04-13 09:01 小小程序程序员混口饭吃 阅读(391) | 评论 (1)编辑 收藏
 
BEA WebLogic Server8.1 JMS入门

时间:2003-11-28
作者:周海根
浏览次数: 2831 2728
本文关键字:JMS基础教程概念
文章工具
推荐给朋友 推荐给朋友
打印文章 打印文章

一. JMS简介
1. JMS基本概念

JMS(Java Message Service)是访问企业消息系统的标准API,它便于消息系
统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发。

2. JMS基本功能
JMS是用于和面向消息的中间件相互通信的应用程序接口。它既支持点对点(point-to-point)的域,又支持发布/订阅(publish/subscribe)类型的域,并且提供对下列类型的支持:经认可的消息传递,事务型消息的传递,一致性消息和具有持久性的订阅者支持。JMS还提供了另一种方式来对您的应用与旧的后台系统相集成。
3. WebLogic JMS Server介绍
WebLogic Server8.1符合JAVA规范,并通过Sun Microsystems J2EE 1.3认
证.作为WebLogic的一部分,当然WebLogic JMS Server也完全遵从JMS规范,还支持集群,并可以应用于实际企业系统.下图是WebLogic JMS Server体系结构.图中可以看到WebLogic JMS Server主要组件有: WebLogic JMS servers(用于消息通信),Java客户端,JNDI(用于域名查找), 后备存储(用于持久消息存储,基于文件或者JDBC数据库).

二. WebLogic JMS特性
1. 消息通信模型
JMS 支持两种消息通信模型:点到点(point-to-point)(PTP)模型和发布/订阅(Pub/Sub)模型。除了下列不同之外,这两种消息通信模型非常地相似:
PTP 模型规定了一个消息只能有一个接收者;Pub/Sub 模型允许一个消息可以有多个接收者。
2. 消息组成
消息传递系统的中心就是消息。
一条 Message 分为三个组成部分:
· 头(header)是个标准字段集,客户机和供应商都用它来标识和路由消息。
· 属性(property)支持把可选头字段添加到消息。如果您的应用程序需要不使用标准头字段对消息编目和分类,您就可以添加一个属性到消息以实现这个编目和分类。提供 set<Type>Property(...) 和 get<Type>Property(...) 方法以设置和获取各种 Java 类型的属性,包括 Object。JMS 定义了一个供应商选择提供的标准属性集。
· 消息的主体(body)包含要发送给接收应用程序的内容。每个消息接口特定于它所支持的内容类型。
JMS 为不同类型的内容提供了它们各自的消息类型,但是所有消息都派生自 Message 接口。
· StreamMessage:包含 Java 基本数值流,用标准流操作来顺序的填充和读取。
· MapMessage:包含一组名/值对;名称为 string 类型,而值为 Java 的基本类型。
· TextMessage:包含一个 String。
· ObjectMessage:包含一个 Serializable Java 对象;能使用 JDK 的集合类。
· BytesMessage:包含未解释字节流: 编码主体以匹配现存的消息格式。
· XMLMessage: 包含XML内容。扩展TextMessage,XMLMessage 类型的使用,使得消息过滤非常便利。
3. 消息确认模式
非事务性会话中,应用程序创建的会话有5 种确认模式,而在事务性会话中,确认模式被忽略。
五种确认模式说明:
· AUTO_ACKNOWLEDGE:自动确认模式。一旦接收方应用程序的方法调用从处理消息处返回,会话对象就会确认消息的接收。
· CLIENT_ACKNOWLEDGE:客户端确认模式。会话对象依赖于应用程序对被接收的消息调用一个acknowledge()方法。一旦这个方法被调用,会话会确认最后一次确认之后所有接收到的消息。这种模式允许应用程序以一个调用来接收,处理并确认一批消息。注意:在管理控制台中,如果连接工厂的Acknowledge Policy(确认方针)属性被设置为"Previous"(提前),但是你希望为一个给定的会话确认所有接收到的消息,那么就用最后一条消息来调用acknowledge()方法。
· DUPS_OK_ACKNOWLEDGE:允许副本的确认模式。一旦接收方应用程序的方法调用从处理消息处返回,会话对象就会确认消息的接收;而且允许重复确认。在需要考虑资源使用时,这种模式非常有效。注意:如果你的应用程序无法处理重复的消息的话,你应该避免使用这种模式。如果发送消息的初始化尝试失败,那么重复的消息可以被重新发送。
· NO_ACKNOWLEDGE:不确认模式。不确认收到的消息是需要的。消息发送给一个NO_ACKNOWLEDGE 会话后,它们会被WebLogic 服务器立即删除。在这种模式下,将无法重新获得已接收的消息,而且可能导致下面的结果:1. 消息可能丢失;和(或者)另一种情况:2. 如果发送消息的初始化尝试失败,会出现重复消息被发送的情况。
· MULTICAST_NO_ACKNOWLEDGE:IP组播下的不确认模式,同样无需确认。发送给一个MULTICAST_NO_ACKNOWLEDGE会话的消息, 会共享之前所述的NO_ACKNOWLEDGE 确认模式一样的特征。这种模式支持希望通过IP 组播方式进行消息通信的应用程序,而且无需依赖会话确认提供的服务质量。注意:如果你的应用程序无法处理消息的丢失或者重复,那么你应该避免使用这种模式。如果发送消息的初始化尝试失败的话,重复的消息可能会被再次发送。
注:在上表的5 种确认模式中,AUTO_ACKNOWLEDGE ,DUPS_OK_ACKNOWLEDGE 和
CLIENT_ACKNOWLEDGE 是JMS 规范定义的,NO_ACKNOWLEDGE 和MULTICAST_NO_ACKNOWLEDGE是WebLogic JMS 提供的。
三. 配置JMS
1. 创建连接工厂
(1) 启动WebLogic Server8.1,登录控制台,选中JMS Connection Factories节点,点击右边的" Configure a new JMS Connection Factory...";

(2) 填写连接工厂的名称SendJMSFactory和JNDI名称SendJMSFactory,点击"Create";

(3) 勾上"myserver",将SendJMSFactory应用到myserver;

2. 定义后备存储
(1) 选中JMS Stores节点,点击右边的" Configure a new JMS Connection Factory...";

(2) 填写文件后备存储的名称SendFileStore和目录Directionary E:\BEA\user_projects\domains\mydomain\sendfilestore,点击"Create".

3. 创建JMS服务器
(1) 选中JMS Servers节点,点击右边的" Configure a new JMSServer...";

(2) 填写JMS服务器的名称SendJMSServer和Paging Store设为" SendFileStore",点击"Create";

(3) Target选中"myserver",将SendJMSServer应用到myserver.

4. 创建消息队列
(1) 展开"SendJMSServer"节点,点击" Configure a new JMS Queue...";

(2) 填写消息队列的名称SendJMSQueue和JNDI名称SendJMSQueue,点击"Create";

四. JMS应用程序
一个 JMS 应用程序由下列元素组成:
· JMS 客户机。 用 JMS API 发送和接收消息的 Java 程序。
· 非 JMS(Non-JMS)客户机。 认识到这一点很重要 - 旧的程序经常成为整个 JMS 应用程序的一部分,而且它们的包含应该在设计时预先考虑。
· 消息。 在 JMS 和非 JMS 客户机之间交换的消息的格式和内容是 JMS 应用程序设计所必须考虑的部分。
· JMS 供应商。供应商必须提供特定于其 MOM 产品的具体的实现。
· 受管对象。 消息传递系统供应商的管理员创建了一个对象,它独立于供应商专有的技术。包括连接工厂ConnectionFactory和目的Destination。
一种典型的 JMS 程序需要经过下列步骤才能开始消息产生和使用:
· 通过 JNDI 查找 ConnectionFactory。
· 通过 JNDI 查找一个或多个 Destination。
· 用 ConnectionFactory 创建一个 Connection。
· 用 Connection 创建一个或多个 Session。
· 用 Session 和 Destination 创建所需的 MessageProducer 和 MessageConsumer。
· 启动 Connection。
下面利用上面配置的JMS资源演示点对点消息发送和接收的过程。
五. 设计消息发送端
1. 使用的JMS资源
服务器URL: t3://localhost:80
连接工厂: SendJMSFactory
队列: SendJMSQueue
2. 设计步骤
· 初始化JNDI Tree
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
env.put(Context.PROVIDER_URL, PROVIDER_URL);
return new InitialContext(env);
· lookup ConnectionFactory
qconFactory = (QueueConnectionFactory) ctx.lookup(JMS_FACTORY);
· lookup Destination
queue = (Queue) ctx.lookup(queueName);
· 用 ConnectionFactory 创建Connection
qcon = qconFactory.createQueueConnection();
· 用 Connection 创建一个Session
qsession = qcon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
· 用 Session 和 Destination 创建MessageProducer
qsender = qsession.createSender(queue);
· 启动 Connection。
qcon.start();
· 发送消息
msg = qsession.createTextMessage();
msg.setText(message);
qsender.send(msg);
3. 源代码
package jmssample;

import java.util.Hashtable;
import javax.jms.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/** This example shows how to establish a connection
* and send messages to the JMS queue. The classes in this
* package operate on the same JMS queue. Run the classes together to
* witness messages being sent and received, and to browse the queue
* for messages. The class is used to send messages to the queue.
*
* @author Copyright (c) 1999-2003 by BEA Systems, Inc. All Rights Reserved.
*/
public class QueueSend
{
// Defines the JNDI context factory.
public final static String JNDI_FACTORY="weblogic.jndi.WLInitialContextFactory";

// Defines the JNDI provider url.
public final static String PROVIDER_URL=" t3://localhost:80";

// Defines the JMS connection factory for the queue.
public final static String JMS_FACTORY="SendJMSFactory";

// Defines the queue.
public final static String QUEUE="SendJMSQueue";


private QueueConnectionFactory qconFactory;
private QueueConnection qcon;
private QueueSession qsession;
private QueueSender qsender;
private Queue queue;
private TextMessage msg;

/**
* Creates all the necessary objects for sending
* messages to a JMS queue.
*
* @param ctx JNDI initial context
* @param queueName name of queue
* @exception NamingException if operation cannot be performed
* @exception JMSException if JMS fails to initialize due to internal error
*/
public void init(Context ctx, String queueName)
throws NamingException, JMSException
{
qconFactory = (QueueConnectionFactory) ctx.lookup(JMS_FACTORY);
qcon = qconFactory.createQueueConnection();
qsession = qcon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
queue = (Queue) ctx.lookup(queueName);
qsender = qsession.createSender(queue);
msg = qsession.createTextMessage();
qcon.start();
}

/**
* Sends a message to a JMS queue.
*
* @param message message to be sent
* @exception JMSException if JMS fails to send message due to internal error
*/
public void send(String message) throws JMSException {
msg.setText(message);
qsender.send(msg);
}

/**
* Closes JMS objects.
* @exception JMSException if JMS fails to close objects due to internal error
*/
public void close() throws JMSException {
qsender.close();
qsession.close();
qcon.close();
}
/** main() method.
*
* @param args WebLogic Server URL
* @exception Exception if operation fails
*/
public static void main(String[] args) throws Exception {
InitialContext ic = getInitialContext();
QueueSend qs = new QueueSend();
qs.init(ic, QUEUE);
readAndSend(qs);
qs.close();
}

private static void readAndSend(QueueSend qs)
throws IOException, JMSException
{
BufferedReader msgStream = new BufferedReader(new InputStreamReader(System.in));
String line=null;
boolean quitNow = false;
do {
System.out.print("Enter message (\"quit\" to quit): ");
line = msgStream.readLine();
if (line != null && line.trim().length() != 0) {
qs.send(line);
System.out.println("JMS Message Sent: "+line+"\n");
quitNow = line.equalsIgnoreCase("quit");
}
} while (! quitNow);

}

private static InitialContext getInitialContext()
throws NamingException
{
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
env.put(Context.PROVIDER_URL, PROVIDER_URL);
return new InitialContext(env);
}

}

六. 设计消息接收端
1. 使用的JMS资源
服务器URL: t3://localhost:80
连接工厂: SendJMSFactory
队列: SendJMSQueue
2. 设计步骤
· 初始化JNDI Tree
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
env.put(Context.PROVIDER_URL, PROVIDER_URL);
return new InitialContext(env);
· lookup ConnectionFactory
qconFactory = (QueueConnectionFactory) ctx.lookup(JMS_FACTORY);
· lookup Destination
queue = (Queue) ctx.lookup(queueName);
· 用 ConnectionFactory 创建Connection
qcon = qconFactory.createQueueConnection();
· 用 Connection 创建一个Session
qsession = qcon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
· 用 Session 和 Destination 创建MessageConsumer
qreceiver = qsession.createReceiver(queue);
· 设置监听
qreceiver.setMessageListener(this);
· 启动 Connection
qcon.start();
3. 源代码
package jmssample;

import java.util.Hashtable;
import javax.jms.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.util.Hashtable;
import javax.jms.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

/**
* This example shows how to establish a connection to
* and receive messages from a JMS queue. The classes in this
* package operate on the same JMS queue. Run the classes together to
* witness messages being sent and received, and to browse the queue
* for messages. This class is used to receive and remove messages
* from the queue.
*
* @author Copyright (c) 1999-2003 by BEA Systems, Inc. All Rights Reserved.
*/
public class QueueReceive implements MessageListener
{
// Defines the JNDI context factory.
public final static String JNDI_FACTORY="weblogic.jndi.WLInitialContextFactory";

// Defines the JNDI provider url.
public final static String PROVIDER_URL=" t3://localhost:80";

// Defines the JMS connection factory for the queue.
public final static String JMS_FACTORY="SendJMSFactory";

// Defines the queue.
public final static String QUEUE="SendJMSQueue";

private QueueConnectionFactory qconFactory;
private QueueConnection qcon;
private QueueSession qsession;
private QueueReceiver qreceiver;
private Queue queue;
private boolean quit = false;

/**
* Message listener interface.
* @param msg message
*/
public void onMessage(Message msg)
{
try {
String msgText;
if (msg instanceof TextMessage) {
msgText = ((TextMessage)msg).getText();
} else {
msgText = msg.toString();
}

System.out.println("Message Received: "+ msgText );

if (msgText.equalsIgnoreCase("quit")) {
synchronized(this) {
quit = true;
this.notifyAll(); // Notify main thread to quit
}
}
} catch (JMSException jmse) {
jmse.printStackTrace();
}
}

/**
* Creates all the necessary objects for receiving
* messages from a JMS queue.
*
* @param ctx JNDI initial context
* @param queueName name of queue
* @exception NamingException if operation cannot be performed
* @exception JMSException if JMS fails to initialize due to internal error
*/
public void init(Context ctx, String queueName)
throws NamingException, JMSException
{
qconFactory = (QueueConnectionFactory) ctx.lookup(JMS_FACTORY);
qcon = qconFactory.createQueueConnection();
qsession = qcon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
queue = (Queue) ctx.lookup(queueName);
qreceiver = qsession.createReceiver(queue);
qreceiver.setMessageListener(this);
qcon.start();
}

/**
* Closes JMS objects.
* @exception JMSException if JMS fails to close objects due to internal error
*/
public void close()throws JMSException
{
qreceiver.close();
qsession.close();
qcon.close();
}
/**
* main() method.
*
* @param args WebLogic Server URL
* @exception Exception if execution fails
*/

public static void main(String[] args) throws Exception {

InitialContext ic = getInitialContext();
QueueReceive qr = new QueueReceive();
qr.init(ic, QUEUE);

System.out.println("JMS Ready To Receive Messages (To quit, send a \"quit\" message).");

// Wait until a "quit" message has been received.
synchronized(qr) {
while (! qr.quit) {
try {
qr.wait();
} catch (InterruptedException ie) {}
}
}
qr.close();
}

private static InitialContext getInitialContext()
throws NamingException
{
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
env.put(Context.PROVIDER_URL, PROVIDER_URL);
return new InitialContext(env);
}


}
七. 测试消息发送和接收
1. 设置WebLogic Classpath;


2. 转到发送接收程序目录编译文件;

3. 执行接受程序;
4. 打开另一窗口,执行发送程序;


5. 输入发送消息"quit",接收程序结束.


总结
本文先简要介绍了JMS的一些基本概念,继而引入了WebLogic JMS Server的体系结构和相关特性。在此基础之上,图文并茂地讲述了JMS在WebLogic Server 8.1上的配置。最后在解剖JMS应用程序框架的同时,以点对点为例演示了JMS的发送接收消息流程。

 作者简介
周海根是(dev2dev论坛id:zhouhg) 长城软件系统有限公司 J2EE架构设计师, 项目经理
posted @ 2006-04-13 09:00 小小程序程序员混口饭吃 阅读(553) | 评论 (0)编辑 收藏
 
在Struts中reset方法有什么作用(转)
大大熊 发表于 2005-6-7 17:48:00

 

 
创建人:王艺
创建时间:2003年6月15日星期日


第一步:
对象的可视范围:request、session、application、page。
Request:在一个请求周期内有效。就是从你点击页面上的一个按钮开始到服务器返回响应页面为止(包括响应页面)。
Session:在一个用户与服务器建立连接的整个过程中有效。
Application:在整个web应用程序内有效。
Page:仅在一个jsp页面内有效。

第二步:
ActionForm在你确定的有效期(可视范围)内是唯一的。

第三步:
在每次为ActionForm赋值前调用它的reset方法。作用是使ActionForm中的值恢复初始状态。在应用中我们可以通过在reset中为变量赋初值的方式,使得页面上的某个对象有显示值。

第四步:
可视范围与赋值前的初始化结合。
由于第二步所述特性,如果可视范围是request,则reset方法并不是很重要,因为你每次调用时都会产生一个新的ActionForm实例,所以你所操作的ActionForm不会与别人分享同时也就不会受别人的影响;如果可视范围是session,由于在session范围内此ActionForm是唯一的,所以你在session范围内需要用到此ActionForm的地方调用的都是同一个ActionForm,要是你没有在reset中对变量赋初值那么前一次调用ActionForm是为它赋的值将在此次调用时有效,这到也没什么。但是,如果恰巧再次调用时你仅仅需要为ActionForm中的一部分变量赋值,那么其余的变量将保持上一次得到的值,这样你就得到了一个“新旧混合体”,我想这多半不是你所期望的;如果可视范围是application,那其影响就更是不难理解了,这时不但是你自己会影响你自己,使用应用的其他用户的操作也会影响到你。

第五步:
知道了reset方法的作用和ActionForm在scope内唯一的特性后就为我们灵活处理ActionForm的行为提供了基础。比如说你现在需要跨过多个页面收集数据信息,这时你就可以把scope设置为session,并且不实现reset方法――这样在每个页面put数据时都不会将之前收集的数据清空,最后在你收集完数据后在Action中调用ActionForm中你自定义的初始化方法,如:resetField。
在具体的我也想不出了,还是要大家在应用时多多体会这些特性,这样才能把架构的威力发挥到最大。

posted @ 2006-04-13 09:00 小小程序程序员混口饭吃 阅读(1740) | 评论 (0)编辑 收藏
 
113:
移位运算符性质
适用数据类型:byte、short、char、int、long,对低于int型的操作数将先自动转换为int型再移位
对于int型整数移位,系统先将b对32取模,得到的结果才是真正移位的位数
对于long型整数移位时 ,则是先将移位位数b对64取模
114:
byte--short--int--long--float--double
     char---/
posted @ 2006-04-13 08:58 小小程序程序员混口饭吃 阅读(161) | 评论 (0)编辑 收藏
     摘要: 一、 Assertion 的语法和语义 J2SE 1.4 在语言上提供了一个新特性,就是assertion(断言)功能,它是该版本在...  阅读全文
posted @ 2006-04-13 08:58 小小程序程序员混口饭吃 阅读(770) | 评论 (0)编辑 收藏

<logic:iterate id="user" property="users" name="usersForm" type="net.wjp.pro.db.entity.logon.User">

< bean:write name="user" property="username"/><br/>

/FONT>

从USERSFORM中取的users的LIST,list里面的type是User

里面的PROPERTY是USERNAME

</logic:iterate >

posted @ 2006-04-13 08:57 小小程序程序员混口饭吃 阅读(250) | 评论 (0)编辑 收藏
 
19:     class A {
public int getNumber(int a) {
    return a + 1;
}
        }
 
        class B extends A {
public int getNumber (int a) {
return a + 2;
        }
 
public static void main (String args[])  {
A a = new B();
14. System.out.printIn(a.getNumber(0));
15.    }
16. }  
What is the result?
A. Compilation succeeds and 1 is printed.
B. Compilation succeeds and 2 is printed.
C. An error at line 8 causes compilation to fail.
D. An error at line 13 causes compilation to fail.
E. An error at line 14 causes compilation to fail.
Answer:B。记住一句话,成员变量(编译时)看左边,方法(运行时)看右边。
posted @ 2006-04-13 08:57 小小程序程序员混口饭吃 阅读(918) | 评论 (1)编辑 收藏
 

其实生成JAVADOC很简单,在DOS下用命令而已,生成JAVADOC的目的有2个:

 1:生成DOC

2:检验一下你写的代码时候规范

步骤:

wsad-->window->preference->java->javadoc-->javadoc command-->select the javadoc.exe

java perspective 下面

wsad-->project-->Generate Javadoc-->select package

  next-->next-->input the argument in the javaoptions

ok!你就可以看到生成的文档了,要是CONSOLE有红色的出现,证明你写的程序不规范了,需要修改以下,调整以下,具体参数可以参考JAVADOC命令的参数行:

如下

javadoc: No packages or classes specified.
usage: javadoc [options] [packagenames] [sourcefiles] [classnames] [@files]
-overview           Read overview documentation from HTML file
-public                   Show only public classes and members
-protected                Show protected/public classes and members (default)
-package                  Show package/protected/public classes and members
-private                  Show all classes and members
-help                     Display command line options
-doclet            Generate output via alternate doclet
-docletpath         Specify where to find doclet class files
-1.1                      Generate output using JDK 1.1 emulating doclet
-sourcepath     Specify where to find source files
-classpath      Specify where to find user class files
-bootclasspath Override location of class files loaded
                          by the bootstrap class loader
-extdirs         Override location of installed extensions
-verbose                  Output messages about what Javadoc is doing
-locale             Locale to be used, e.g. en_US or en_US_WIN
-encoding           Source file encoding name
-J                  Pass directly to the runtime system

Provided by Standard doclet:
-d             Destination directory for output files
-use                      Create class and package usage pages
-version                  Include @version paragraphs
-author                   Include @author paragraphs
-splitindex               Split index into one file per letter
-windowtitle        Browser window title for the documenation
-doctitle      Include title for the package index(first) page
-header        Include header text for each page
-footer        Include footer text for each page
-bottom        Include bottom text for each page
-link                Create links to javadoc output at
-linkoffline Link to docs at using package list at
-group :.. Group specified packages together in overview page
-nodeprecated             Do not include @deprecated information
-nosince                  Do not include @since information
-nodeprecatedlist         Do not generate deprecated list
-notree                   Do not generate class hierarchy
-noindex                  Do not generate index
-nohelp                   Do not generate help link
-nonavbar                 Do not generate navigation bar
-serialwarn               Generate warning about @serial tag
-charset         Charset for cross-platform viewing of generated docu
ntation.
-helpfile           Include file that help link links to
-stylesheetfile     File to change style of the generated documentation
-docencoding        Output encoding name

posted @ 2006-04-13 08:56 小小程序程序员混口饭吃 阅读(1765) | 评论 (0)编辑 收藏
 
 

//IJavaProject javaProj = JavaCore.create(proj);

//IProjectDescription des = proj.getDescription();

//IPackageFragmentRoot fragroot = javaProj.getPackageFragmentRoot(folder);

//IPackageFragment frag = fragroot.getPackageFragment(packageName) ;

//{

//frag = fragroot.createPackageFragment(packageName,

//}

//}

//System.out.println(

//}

//try {//if(frag == null || ! frag.exists())true,null);catch(Exception jme) {"Exception in createpackageInStructsProject :" + jme);
posted @ 2006-04-13 08:56 小小程序程序员混口饭吃 阅读(164) | 评论 (0)编辑 收藏
 

1:zoom是如何使用在里面的

    (1)ZoomManager extends ZoomManager
       为visualgroup 增加了zoom
       ===constructor
      public GraphZoomManager(ScalableFigure pane,ViewPoint viewPoint,VisualGroup visualGroup){
        super(pane,viewpoint);
        this.visualGroup = visualGroup;
      }
    (2)override method
       protected void primSetZoom(double zoom){
          super.primSetZoom(zoom);
          getScalableFigure().setScale(1);
          visualGroup.setZoom(zoom);
      }
     (3)在visualGroup setZoom的时候,进行了如下操作
       public void setZoom(double zoom){
          setSize(getWidth()*zoom/getZoom(),getHight().zoom/getZoom());
          super.setZoom(zoom);
          //一下是对里面的点进行zoom
          for(Iterator iter = getVisualVertexList().iterator();iter.hasNext();){
                 VisualVertext vertext = (VisualVertext)iter.next();
                 vertext.setZoom(zoom);
           }


2:gef mvc

 GEF model iteract with controller only,to let controller know model's change ,所以应该把控制器作为事件监听者,注册在模型中,当模型发生变化,就出发相应的时间给控制器,然后负责通知给视图进行更新

3:Design pattern
   OBSERVER的应用http://www.jdon.com/designpatterns/observer.htm这篇文章浅显易懂,很不错的


4:所有事件都在VISUAL model里面,再COMMAND里面的EXECUTE来call
   所有的时间分布再不同的COMMAND的EXECUTE()里面

   policy里面会SET COMMMAND,然后MVC会自动调用里面的EXECUTE方法

   然后去刷新FIGURE
5:orpha

6:ervery visual model -->every visual part-->every visual figure -->one or more policy -->one or more command
7:figure是在MODEL更新完毕之后,有相关的EDIRPART,来监控,就是说OBSERVER来监视当前的EVENT,如果当前EVENT匹配一个
那么会更新一个FIGRUE
   code : visualVertextPart
   editpart ===>c他有多个EDITPART,就跟STRUTS有多个ACTION一个道理。
   GEF肯定也有一个核心的PART,负责整体的流装,但是没有找到是哪一个类。
 public void update(Observer o,Object arg){
    
    //if(type ==locaction) then refresh figure;
    //of course. GEF MVC,已经包装好了,就不用我们考虑了,只需要你去做填鸭就可以了,:)
   if (VisualGraphConstant.LOCATION.equals(type))
        {
            IFigure figure = getFigure();
            VisualVertex visualVertex = getVisualVertex();
            figure.setLocation(new Point(visualVertex.getX(), visualVertex
                    .getY()));
        }

}
8;property 和outline是怎么加上去的??放在明天看吧


9:toolbar跟 MENU是怎么加上去的:
   toobar 是在PLUGIN.XML的ContributorClass 中加上去的,可以先看一下

   extends ActionBarContributor
   TOOLbar的东西ECLIPSE已经封装的很好了,发现GEF真是了不起啊

   menu是如何加上去的

   都是在EDITOR里面的CREATEACTIONS里面加上去的,OVERRIDES createActions method()

   code as following
     pretected void createActions(){
        super.createActions();
        IAction zoomInAction = new ZoomInAction(getZoomManager());
        IAction zoomOutAction = new ZoomOutAction(getZoomManager());
        addAction(zoomInAction());
        addAction(zoomOutAction());
        addAction(new OpenPropertiesViewAction());
     }

   OpenPropertiesViewActions code as follows

    1:利用现在的PROPERTIES的view,open properties sheet,ok...


   OpendataPropertiesViewAction code as follwos
     
    2:新建一个dataPropertiesViewAction

     
       

posted on 2006
posted @ 2006-04-13 08:56 小小程序程序员混口饭吃 阅读(177) | 评论 (0)编辑 收藏
 

1:GEF mvc framework

2:policy 所有的POLICY应该是注册在visual....part中的
  每一个POLICY来生命相应的COMMMAND,可能会对应多个COMMMAND
3:visualGraph -->rootEditpart--->

  configureGraphviewer()
     ---super.configureGraphviewer()
     ---getGraphicalViewer().setRootEditPart(rootEditPart);
     ---getGraphicalViewer().setEditPartFactory(new GraphEdirPartFactory());
   以上属于把ROOTEDITPART和EDIRPARTFACTORY()注册到当前的Graphicalviewer当中
   内部已经已经封装好了监听,就跟STRUT一样,你配置好,提交的时候就会又相应的ACTION去执行他,

    CONFIG--->STRUTS-CONFIG  =======  当前的REISTRY graphicalView().set()....
    control核心  -->strust-actionServlet 和requestProcessor =======   当前的editpart 的GraphEditPartFactory();
    实际的action   struts-action =========每个editpart --->policy -- >可能对应多格COMMAND

4:commmandstack.addCommandStackListner();
   getSite().getWorkBenchWindow().getSelectionService().addSelectionListener(this)

   rootEidtpart.getZoomManger();

   ZoomManger也是ACTION所以就注册在了EDITPART中了
   
5:我的疑问:
   FIGURE和VERTEX GROUP,EDGE,GRAP的关系,是最小的????
   FIGURE是未来显示在EDITOR里面的最小单元???

6:EDITOR里面的CreateGraphicalViewer(Composite composite)


7:editpart initialize the editdomain,viewers,palette,
  editpart bootstraps the editpartviewers as content;

8:
     Model:
          The model should be changed using commands

     View:
          View can bi several things
          (1) visual part,which serves as the primary represention for model object  
          (2) the most flexible visual part are Figures form drar2d
     Cotroler:
          (1)a controller is an editpart,Editparts are the bread-and-butter of GEF
          (2) the entire view is managed by Editpart
          (3) editPart's responsibility is to manipulate the model with commands,complex model can lead to

complex commands
          (4)to make editpart's job easier,each role is implemented by a pluggable object called editpolicy


9: Result:
    (1)edit part reprents a single conceptual object with which user can use direct or indirect interact
       but an editpart itself is not visible to user,but will represent itself through it's view              
 

10:
    (1)
   each editpart istall one or more editpolicies,editpart foward edit request to every installed editPolicy

=================================11:Using EditPolicies,request,roles===============


 (1)Editpolicy

    an editpart iterates over all it's policies to handle requests,but editpolicy ignore the request

 (2)role
    as i understand ,role is string ,like COMPONENT_ROLE..
 (3)request
    are used to communicate with an editpart


 (4) role and editpolicies in GEF are partitioned into two basic types:graphical and non-graphical

  

posted @ 2006-04-13 08:55 小小程序程序员混口饭吃 阅读(207) | 评论 (0)编辑 收藏
 

2005-10-20 16:30:46

正则表达式(regular expression)对象包含一个正则表达式模式(pattern)。它具有用正则表达式模式去匹配或代替一个字符串(string)中特定字符(或字符集合)的属性(properties)和方法(methods)。 要为一个单独的正则表达式添加属性,可以使用正则表达式构造函数(constructor function),无论何时被调用的预设置的正则表达式拥有静态的属性(the predefined RegExp object has static properties that are set whenever any regular expression is used, 我不知道我翻得对不对,将原文列出,请自行翻译)。

创建:
一个文本格式或正则表达式构造函数
文本格式: /pattern/flags
正则表达式构造函数: new RegExp("pattern"[,"flags"]);
参数说明:
pattern -- 一个正则表达式文本
flags -- 如果存在,将是以下值:
g: 全局匹配
i: 忽略大小写
gi: 以上组合
[注意] 文本格式的参数不用引号,而在用构造函数时的参数需要引号。如:/ab+c/i new RegExp("ab+c","i")是实现一样的功能。
在构造函数中,一些特殊字符需要进行转意(在特殊字符前加"\")。如:re = new RegExp("\\w+")

正则表达式中的特殊字符

字符 含意
\ 做为转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/,转意为匹配一个单词的边界。
-或-
对正则表达式功能字符的还原,如"*"匹配它前面元字符0次或多次,/a*/将匹配a,aa,aaa,加了"\"后,/a\*/将只匹配"a*"。

^ 匹配一个输入或一行的开头,/^a/匹配"an A",而不匹配"An a"
$ 匹配一个输入或一行的结尾,/a$/匹配"An a",而不匹配"an A"
* 匹配前面元字符0次或多次,/ba*/将匹配b,ba,baa,baaa
+ 匹配前面元字符1次或多次,/ba*/将匹配ba,baa,baaa
? 匹配前面元字符0次或1次,/ba*/将匹配b,ba
(x) 匹配x保存x在名为$1...$9的变量中
x|y 匹配x或y
{n} 精确匹配n次
{n,} 匹配n次以上
{n,m} 匹配n-m次
[xyz] 字符集(character set),匹配这个集合中的任一一个字符(或元字符)
[^xyz] 不匹配这个集合中的任何一个字符
[\b] 匹配一个退格符
\b 匹配一个单词的边界
\B 匹配一个单词的非边界
\cX 这儿,X是一个控制符,/\cM/匹配Ctrl-M
\d 匹配一个字数字符,/\d/ = /[0-9]/
\D 匹配一个非字数字符,/\D/ = /[^0-9]/
\n 匹配一个换行符
\r 匹配一个回车符
\s 匹配一个空白字符,包括\n,\r,\f,\t,\v等
\S 匹配一个非空白字符,等于/[^\n\f\r\t\v]/
\t 匹配一个制表符
\v 匹配一个重直制表符
\w 匹配一个可以组成单词的字符(alphanumeric,这是我的意译,含数字),包括下划线,如[\w]匹配"$5.98"中的5,等于[a-zA-Z0-9]
\W 匹配一个不可以组成单词的字符,如[\W]匹配"$5.98"中的$,等于[^a-zA-Z0-9]。



说了这么多了,我们来看一些正则表达式的实际应用的例子:

E-mail地址验证:
function test_email(strEmail) {
var myReg = /^[_a-z0-9]+@([_a-z0-9]+\.)+[a-z0-9]{2,3}$/;
if(myReg.test(strEmail)) return true;
return false;
}
HTML代码的屏蔽
function mask_HTMLCode(strInput) {
var myReg = /<(\w+)>/;
return strInput.replace(myReg, "<$1>");
}

正则表达式对象的属性及方法
  预定义的正则表达式拥有有以下静态属性:input, multiline, lastMatch, lastParen, leftContext, rightContext和$1到$9。
其中input和multiline可以预设置。其他属性的值在执行过exec或test方法后被根据不同条件赋以不同的值。
许多属性同时拥有长和短(perl风格)的两个名字,并且,这两个名字指向同一个值。(JavaScript模拟perl的正则表达式)

正则表达式对象的属性 属性 含义
$1...$9 如果它(们)存在,是匹配到的子串
$_ 参见input
$* 参见multiline
$& 参见lastMatch
$+ 参见lastParen
$` 参见leftContext
$’          参见rightContext
constructor    创建一个对象的一个特殊的函数原型
global       是否在整个串中匹配(bool型)
ignoreCase     匹配时是否忽略大小写(bool型)
input        被匹配的串
lastIndex     最后一次匹配的索引
lastParen     最后一个括号括起来的子串
leftContext    最近一次匹配以左的子串
multiline     是否进行多行匹配(bool型)
prototype     允许附加属性给对象
rightContext    最近一次匹配以右的子串
source       正则表达式模式
lastIndex     最后一次匹配的索引


正则表达式对象的方法
方法 含义
compile      正则表达式比较
exec        执行查找
test        进行匹配
toSource      返回特定对象的定义(literal representing),其值可用来创建一个新的对象。重载Object.toSource方法得到的。
toString      返回特定对象的串。重载Object.toString方法得到的。
valueOf      返回特定对象的原始值。重载Object.valueOf方法得到

例子
Smith, John
将输出"Smith, John"

 
posted @ 2006-04-13 08:55 小小程序程序员混口饭吃 阅读(205) | 评论 (0)编辑 收藏
 

JSTL包含以下的标签:
   常用的标签:如<c:out>、<c:remove>、<c:catch>、<c:set>等
   条件标签:如<c:if><c:when>、<c:choose>、<c:otherwise>等
   URL标签:如<c:import>、<c:redirect>和<c:url>等
   XML标签:如<xml:out>等
   国际化输出标签:如<fmt:timeZone>等
   SQL标签:如<sql:query>、<sql:update>、<sql:transaction>等
 
一般用途的标签:
1.<c:out>
没有Body时的语法
<c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"]/>
有Body时的语法
<c:out value="value" [escapeXml="{true|false}"]>
这里是Body部分
</c:out>
名字                  类型               描述
value               Object         将要输出的表达式
escapeXml    boolean      确定以下字符:<,>,&,',"在字符串中是否被除数,默认为true
default            Object          如果vaule计算后的结果是null,那么输出这个默认值

2.<c:set>
这个标签用于在某个范围(page、request、session、application等)中使用某个名字设定特定的值,或者设定某个已经存在的javabean对象的属性。他类似于<%request.setAttrbute("name","value");%>
语法1:使用value属性设定一个特定范围中的属性。
<c:set value="value" var="varName" [scope="{page|request|session|application}"]/>
语法2:使用value属性设定一个特定范围中的属性,并带有一个Body。
<c:set var="varName" [scope="{page|request|session|application}"]>
Body部分
</c:set>
语法3:设置某个特定对象的一个属性。
<c:set value="value" target="target" property="propertyName"/>
语法4:设置某个特定对象的一个属性,并带有一个Body。
<c:set target="target" property="propertyName">
Body部分
</c:set>

名字             类型                         描述
value            Object           将要计算的表到式。
var                String            用于表示value 值的属性,如果要在其他标签中使用,就是通过这 个var指定的值来进行的。它相当于在标签定义了一个变量,并且这个变量只能在标签中的一个。
scope          String             var的有效范围,可以是page|request|session|application中的一个
target           String           将要设置属性的对象,它必须是javabean或则java.util.Map对象
property       Object           待设定的Target对象中的属性名字,比如在javabean中有个name属性,提供了setUserId方法,那么这里填userId。

3.<c:remove>
<c:remove var="varName" [scope="{page|request|session|application}"]/>

4.<c:catch>
这个标签相当于捕获在它里边的标签抛出的异常对象
<c:catch [var="varName"]> //var是异常的名字
内容
</c:catch>

条件标签
1. <c:if>
语法1:无Body情况
<c:if test="testCondition" var="varName" [scope="page|request|session|application"]/>
语法2:有Body的情况
<c:if test="testCondition" var="varName" [scope="page|request|session|application"]>
Body内容
</c:if>

名字 类型 描述
test Boolean 表达式的条件,相当于if()中的条件判断语句。
var String 表示这个语句的名字。
scope String var这个变量的作用范围。

2.<c:choose>
语法:<c:choose>
Body内容(<c:when>和<c:otherwise>子标签)
</c:choose>
注意:它的Body只能由以下元素组成:
1) 空格
2) 0或多个<c:when>子标签,<c:when>必须在<c:otherwise>标签之前出现.
3) 0个或多个<c:otherwise>子标签。

3.<c:when>
代表的是<c:choose>的一个条件分支,只能在<c:choose>中使用
语法:<c:when test="testCondition"> //test是boolean类型,用于判断条件真假
Body语句
</c:when>

4.<c:otherwise>
代表的是<c:choose>中的最后选择。必须在最后出现
<c:otherwise>
内容
</c:otherwise>

迭代标签
1.<c:forEach>
语法1:在Collection中迭代
<c:forEach[var="varName"] items="collection" [varStatus="varStatusName"]
[begin="begin"] [end="end"] [step="step"]
Body内容
</c:foeEach>

语法2:迭代固定的次数.
<c:forEach [var="varName"] [varStatus="varStatusName"]
[begin="begin"] [end="end"] [step="step"]
Body内容
</c:foeEach>

名字               类型                                    描述
var                 String                                迭代的参数,它是标签参数,在其他标签中通过它来引用这个标签中的内容。
Items           Collection、ArrayList、  要迭代的items集合.
                     Iterator、Map、String、
                      Eunmeration等
VarStatus   String                                  表示迭代的状态,可以访问迭代自身的信息
Begin          int                                        表示开始迭代的位置。
End              int                                       表示结束迭代的位置。
Step            int                                        表示迭代移动的步长,默认为1。

URL相关的标签
1.<c:import>
语法1:资源的内容使用String对象向外暴露
<c:import url="url" [context="context"]
[var="varName"] [scope="{page|request|session|application}"] [charEncoding="charEncoding"]>
内容
</c:import>

语法2:资源的内容使用Reader对象向外暴露。
<c:import url="url" [context="context"]
varReader="varReaderName" [charEncoding="charEncoding"]>
内容
</c:import>
名字                  类型                               描述
url                     String                     待导入资源的URL,可以是相对路径和绝对路径,并且可以导入其他主机资源
context             String                     当使用相对路径访问外部context资源时,context指定了这个资源的名字。
var                     String                    参数的名字。
scope               String                    var参数的作用范围。
cahrEncoding String                    输入资源的字符编码。
varReader       String                    这个参数的类型是Reader,用于读取资源。

2.<c:redirct>
语法1:没有Body的情况.
<c:redirect url="value" [context="context"]/>
语法2:有Body情况下,在Body中指定查询的参数
<c:redirect url="value" [context="context"]>
<c:param name="name" value="value"/>
</c:redirect>

3.<c:url>
语法1:没有Body
<c:url value="value" [context="context"] [var="varName"] [scope="{page|request|session+application}"]/>
语法2:有Body
<c:url value="value" [context="context"] [var="varName"] [scope="{page|request|session+application}"]>
<c:param name="name" value="value"/>
</c:url>

名字                  类型                  描述
value             String                URL值
context          String                 当使用相对路径访问外部context资源时,context指定了这个资源的名字
var                 String                 标识这个URL标量。
Scope           String                变量作用范围。

SQL相关的标签
1.<sql:setDataSource>
2.<sql:query>
3.<sql:update>
4.<transaction>
5.<param>

 

posted @ 2006-04-13 08:54 小小程序程序员混口饭吃 阅读(869) | 评论 (0)编辑 收藏
 

1: struts1.2.7 中使用 mappingdispatchAction

 

parameter 中直接来定义的就是 METHOD name

一个 /xxxx.do 用一个 <action mapping…/> 来定义比如

 

 

<action path=”/add”

parameter=”add”

type=”xxxextMappingdispatchAction”

>

<forward name=”success” path=”/addsuccess.jsp”/>

</acton>

 

<action path=”/edit”

parameter=”edit”

type=”xxxextMappingdispatchAction”

>

<forward name=”success” path=”/editsuccess.jsp”/>

</action>

看一下STRUTS的源代码,其实实现就是java relection非常的简单

posted @ 2006-04-13 08:53 小小程序程序员混口饭吃 阅读(702) | 评论 (0)编辑 收藏
 

Ø       Exit TOAD Launch TOAD On the Login screen their should be an option to
> use 'SQL Net compatible Net8' Please check this

 

问题就解决了呵呵,可能是要求兼容以前的ORACLE的用法,现在去掉了就好了,没有问题了

posted @ 2006-04-13 08:53 小小程序程序员混口饭吃 阅读(1992) | 评论 (1)编辑 收藏
 

HttpSessionBindingListener 接口的对象 - -

                                      

Session 代表客户的会话过程,客户登录时,往 Session 中传入一个对象,即可跟踪客户的会话。在 Servlet 中,传入 Session 的对象如果有一个实现 HttpSessionBindingListener 接口的对象(方便起见,此对象称为监听器),则在传入的时候(即调用 HttpSession 对象的 setAttribute 方法的时候)和移去的时候(即调用 HttpSession 对象的 removeAttribute 方法的时候或 Session Time out 的时候) Session 对象会自动调用监听器的 valueBound valueUnbound 方法(这是 HttpSessionBindingListener 接口中的方法)。
posted @ 2006-04-13 08:52 小小程序程序员混口饭吃 阅读(3584) | 评论 (2)编辑 收藏
 

    <target name="deploy.selfcare" depends="compile">

        <delete dir="${selfcare.web.dir}/WEB-INF/classes" failonerror="false" />

        <delete dir="${selfcare.web.dir}/WEB-INF/lib" failonerror="false" />

        <mkdir dir="${selfcare.web.dir}/WEB-INF/lib" />

        <mkdir dir="${selfcare.web.dir}/WEB-INF/classes" />

       <copy todir="${selfcare.web.dir}/WEB-INF/classes">

           <fileset dir="${classes.main}" />

        </copy>

       <copy todir="${selfcare.web.dir}/WEB-INF/lib" flatten="true">

           <fileset dir="${libs}" excludes="**/xdoclet*.jar"/>

        </copy>

       <copy todir="${selfcare.web.dir}/WEB-INF/classes">

           <fileset dir="${src.main}" includes="**/*.xml, **/*.properties" />

        </copy>

    </target>

 

<property name="src.main" value="${basedir}/src" />

Property 就是定义常量

<target> 就是一个任务

<delete dir= 删除一个目录

<mkdir dir 家里目录

<copt todir 就是拷贝到哪个目录

  <fileset dir 就是从哪里拷贝

 

<target depends> 就是依赖别的任务

 

 

    <target name="compile" depends="init">

        <mkdir dir="${classes.main}" />

        <javac srcdir="${src.main}" destdir="${classes.main}" debug="${debug}">

            <classpath refid="classpath.lib" />

        </javac>

        <native2ascii src="${src.main}" dest="${classes.main}" includes="**/*.properties" />

    <antcall target="enhance"/>

    </target>

    <target name="init" depends="clean">

           <mkdir dir="${junit.report}"/>

           <mkdir dir="${build.dir}"/>

</target>

 

    <target name="enhance" >

       <copy todir="${classes.main}" >

           <fileset dir="${src.main}" >

               <include name="**/*.jdo"/>

           </fileset>

        </copy>

       <ant antfile="build-jdo.xml" target="enhance"/>

</target>

 

    <path id="classpath.main">

        <pathelement location="${classes.main}" />

    </path>

Path 是类的路径,指定当前编译的类路径

 

<taskdef name="ejbdoclet" classname="xdoclet.modules.ejb.EjbDocletTask" classpathref="xdoclet.jars" />

 

定义任务标签,

posted @ 2006-04-13 08:52 小小程序程序员混口饭吃 阅读(190) | 评论 (0)编辑 收藏
 

头标:JAVA-CODE STYLE-CODE TEMPLATE-->NEW JAVA FILES-->

/**
 * Copyright (c) 2001-2005 by ** Corporation
 *   All rights reserved.

**/

作者版本:java ->code stype-->code templates-->Comment -->types

/**
 * @author Jianping Wang (aaa@aaa.com)

 * @version $$Id: ${file_name},v 1.1 ${date} ${time}Jianping Wang Exp $$

 * ${tags}

 */

posted @ 2006-04-13 08:51 小小程序程序员混口饭吃 阅读(672) | 评论 (0)编辑 收藏
 

Static 变量对于改类所有的对象都是可见的,如果实在一个 JVM 里面,当然对于 WEB 来说,在一个 WEGLOIGC server 上调试一个程序,相当于一个 JVM STATIC 对于该类的任何实例都是可见的。

要是在应用程序里面,如果调试 2 个应用程序,那么这 2 个应用程序不会在一个 JVM 里面,那么 STATIC 各自维护各自的没有任何联系,除非是一个应用程序有多个窗口你才能看到 STATIC 变量的效果

 

 

写这段文字的意思就是说: STATIC JVM 的关系,有时间一定看看 JAVA 虚拟机这本书

posted @ 2006-04-13 08:49 小小程序程序员混口饭吃 阅读(279) | 评论 (0)编辑 收藏
     摘要: 1 :单表添加过程 添加单表的过程非常简单直接写一个对象就可以,最关键的是处理主键,主键的 SEQUERCE 的生成,(不过还不太懂如何去配置 SEQUENCE 的生成) ...  阅读全文
posted @ 2006-04-13 08:49 小小程序程序员混口饭吃 阅读(386) | 评论 (0)编辑 收藏
 

java.io.InputStream is = Test.Class.GetResourceAsStream("test.template");

is  --->String  all = "sdfsdfsfd<>"; //like....

//replice <> as   user:wjp

String replace = "user:wjp";

RE r = new RE("<>");

r.subst(all,replace);

OK,you can get the replaced String ...

posted @ 2006-04-13 08:48 小小程序程序员混口饭吃 阅读(291) | 评论 (0)编辑 收藏
 

                                      

asnchronized  在一个线程调用它之前必须先给它加

类修饰符
Public                  可以从其他类中访问
obstract                本类不能被实例化
final                   不能再声明子类

构造器修饰符
Public                  可以从所有的类中访问
Protected               只能从自己的类和它的子类中访问
Private                 只能在本类中访问

域修饰符
Public                  可以从所有的类中访问
Protected               只能从本类和它的子类中访问
Private                 只能从本类中访问它
Static                  对该类的所有实例只能有一个域值存在
transient               不是一个对象持久状态的一部份
Volatile                可以被异步的线程所修改
final                   必须对它赋予初值并且不能修改它

局部变量修饰符
final                   必须对它赋予初值并且不能修改它

方法修饰符
Public                  可以从所有的类中访问它
Protected               只能从本类及其子类中访问它
Private                 只能从本类中访问它
abstract                没有方法体,属于一个抽象类
final                   子类不能覆盖它
static                  被绑定于类本身而不是类的实例
native                  该方法由其他编程语言实现
asnchronized            在一个线程调用它之前必须先给它加

posted @ 2006-04-13 08:48 小小程序程序员混口饭吃 阅读(201) | 评论 (0)编辑 收藏
 

(1:)sitemesh.xml 文件好像默认只能放在web-inf下面,

不过我感觉肯定sitemesh提供其他的loader方式,在类包里面提供,
decorators.xml 文件的位置就比较随便了,在sitemesh.xml 中配置一下她的路径就好
如:
  <property name="decorators-file" value="/WEB-INF/decorators.xml"/>
(2:)

decorators.xml


<?xml version="1.0" encoding="ISO-8859-1"?>
<decorators defaultdir="/jsp/decorators">
    <decorator name="main" page="main.jsp">
        <pattern>*.jsp</pattern>
    </decorator>
</decorators>


这里面可以定义多个decorator

对应不同的文件名,或者匹配不同的路径何文件后缀都可以


(3:)
main.jsp

<%@ include file="/common/header.jsp">
<%@ taglib uri="sitemesh-decorator" prefix="decorator" %>
<%@ include file="/common/meta.jsp">

<html>
  <head>
    <title><decorator:title default="decorator" />default title</title>
    <decorator:head />
  </head>
  <body>
<%@ include file="/common/header.jsp">
    <hr>
    <decorator:body />
<%@ include file="/common/footer.jsp">
    <hr>this is template footer
  </body>
</html>

不过SITMESH对一些设计来说简直是在灾难,ajax感觉无法与其整合在一起用

posted @ 2006-04-13 08:45 小小程序程序员混口饭吃 阅读(2428) | 评论 (0)编辑 收藏
 
最近有时间看了一下最近钞作比较厉害的AJAX,感觉确实有些好的地方,我认为主要在2个点上

1:XMLHTTP
2:   DOM
3:JAVASCRIPT对dom的便利

只要熟悉这3个方面的东西ajax并不难掌握

至于ajax 的engine,并没有去使用和熟悉,51期间可以好好利用这个时间熟悉一下,用在www.sowq.com的开发上


一下程序从网站上抄来的

URL:http://lilac.greatweb.cn/zhangyuanyi/weblog/2005/11/ajax1-helloworld.html


<HTML>
        <HEAD>

        <TITLE> AJAX指南(1) ---- Hello,world! </TITLE>
        </HEAD>
        <BODY onload="HelloWorld()">
        <DIV ID="ajax-sample">
        </DIV>
        </BODY>
        </HTML>


function getHTTPObject()          
        {                                  
               
var http;
               
var browser = navigator.appName;

               
if(browser == "Microsoft Internet Explorer")
               
{
                        //如果用户使用IE,就返回XMLHTTP的ActiveX对象

                        http = new ActiveXObject("Microsoft.XMLHTTP"); 
                }
                else
                {
                        //否则返回一个XMLHttpRequest对象
                        http = new XMLHttpRequest(); 
                }

                return http;
        }

  得到HTTP请求对象之后,我们需要向服务段发送请求,假设服务端为hello.php,下面的代码负责获取服务端的响应:

        //获取全局的HTTP请求对象
        var http = getHTTPObject();

        //处理请求状态变化
        function getHello()        
        {
                //4表示请求已完成
                if (http.readyState == 4) 
                {
                        //获取服务段的响应文本
                        var helloStr = http.responseText; 

                        //插入响应到ID为ajax-sample的DIV标签内
                        document.getElementById("ajax-sample").innerHTML = helloStr;
                }
        }

        function HelloWorld()
        {
                var url = "hello.php";

                //指定服务端的地址
                http.open("GET", url, true); 
                //请求状态变化时的处理函数
                http.onreadystatechange = getHello;
                //发送请求
                http.send(null);            
        }


上面的这段程序就用到了xmlhttp,非常明了,不过可以考虑用http的state来做真正的进度条,解决一个假进度的问题,绝对是个不错的主意
posted @ 2006-04-13 08:44 小小程序程序员混口饭吃 阅读(161) | 评论 (0)编辑 收藏
 

1 jstl 配置使用

 

 

  web.xml

 

    <context-param>

       <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>

        <param-value>com.bitfone.smartdm.selfcare.web.resources.ApplicationResource</param-value>

    </context-param>

   <taglib>

       <taglib-uri>jstl-core</taglib-uri>

       <taglib-location>/WEB-INF/tld/c.tld</taglib-location>

    </taglib> 

    <taglib>

       <taglib-uri>jstl-fmt</taglib-uri>

       <taglib-location>/WEB-INF/tld/fmt.tld</taglib-location>

    </taglib>

 

需要 2 个包就可以 jstl.jar standerd.jar

 

2: weblogic ,页面采用 UTF-8 也是乱码问题

 

startweblogic 中加上 -dEncoding utf-8

 

解决

3 :被 sitmesh exclude 得页面也出现乱码得问题

 

 

如何解决还没有解决

 

4 struts exceptionHandler 老是无法定位 errormessage ,仔细一检查原来是 message-resources parameter=””/> 没有配置,真是大意啊

 

5 :开发过程中不建议 <%@ page language="java" errorPage="/jsp/common/errorpage.jsp" contentType="text/html;charset=utf-8" %>

 

这句话强烈不建议加,但是在产品交付之前一定要在 HEADER 里面加,因为要是开发过程中加入得话,在调试过程中地位不到错误,会绝对郁闷,还不知道问题出在哪里!!!!

posted @ 2006-04-13 08:44 小小程序程序员混口饭吃 阅读(166) | 评论 (0)编辑 收藏
 

java.io.InputStream is = null;

is = Test.Class.getResourceAsStream("test.template");

BufferedReader reader = new BufferedReader(new InputStreamReader(is));

String line = null;

String content =";

while((line = reader.readLine())!=null){

    content = content +    line;

}

reader.close();

return line;

我人为这样读能够把整个文件都读到,

要是采取以下方式来读,要是文件比较大的情况可能会读不到!

java.io.InputStream is = Test.Class.getResourceAsStream("test.template");

byte[] b = new byte[is.available()];

is. read(b,0,is.available());

String result = new String(b);

return result;

文件如果比较大的情况下可能会读不到!!!!后面出现方框,!!!!!

原因是什么不太清楚

posted @ 2006-04-13 08:43 小小程序程序员混口饭吃 阅读(250) | 评论 (0)编辑 收藏
 

天做被,

地做床,

豪情千万丈

衣不蔽,

饭不香

惆怅独自享

posted @ 2006-04-12 08:47 小小程序程序员混口饭吃 阅读(486) | 评论 (2)编辑 收藏

         Soap 读书笔记

 

1 :参考

Huihoo: http://www.huihoo.com/xml/soap/soap12.html

柴晓路, Fennivel Chai 翻译

 

 

 

  2 1

     Soap 是一个基于 XML 的协议,提供了一个在松散的、分布的环境中使用 XML 对等的交换结构化和类型化的信息简单且轻量级的机制

  2 2

Soap 的组成:

 Soap envelop

 Soap encoding rules

 Soap rpc representation

 Soap binding

 

posted @ 2006-04-12 08:44 小小程序程序员混口饭吃 阅读(172) | 评论 (0)编辑 收藏
ant

    <target name="deploy.selfcare" depends="compile">

       <delete dir="${selfcare.web.dir}/WEB-INF/classes" failonerror="false" />

       <delete dir="${selfcare.web.dir}/WEB-INF/lib" failonerror="false" />

       <mkdir dir="${selfcare.web.dir}/WEB-INF/lib" />

       <mkdir dir="${selfcare.web.dir}/WEB-INF/classes" />

       <copy todir="${selfcare.web.dir}/WEB-INF/classes">

           <fileset dir="${classes.main}" />

       </copy>

       <copy todir="${selfcare.web.dir}/WEB-INF/lib" flatten="true">

           <fileset dir="${libs}" excludes="**/xdoclet*.jar"/>

       </copy>

       <copy todir="${selfcare.web.dir}/WEB-INF/classes">

           <fileset dir="${src.main}" includes="**/*.xml, **/*.properties" />

       </copy>

    </target>

 

<property name="src.main" value="${basedir}/src" />

Property 就是定义常量

<target> 就是一个任务

<delete dir= 删除一个目录

<mkdir dir 家里目录

<copt todir 就是拷贝到哪个目录

  <fileset dir 就是从哪里拷贝

 

<target depends> 就是依赖别的任务

 

 

    <target name="compile" depends="init">

        <mkdir dir="${classes.main}" />

        <javac srcdir="${src.main}" destdir="${classes.main}" debug="${debug}">

        <classpath refid="classpath.lib" />

        </javac>

    <native2ascii src="${src.main}" dest="${classes.main}" includes="**/*.properties" />

    <antcall target="enhance"/>

    </target>

    <target name="init" depends="clean">

          <mkdir dir="${junit.report}"/>

          <mkdir dir="${build.dir}"/>

</target>

 

    <target name="enhance" >

       <copy todir="${classes.main}" >

           <fileset dir="${src.main}" >

              <include name="**/*.jdo"/>

           </fileset>

       </copy>

       <ant antfile="build-jdo.xml" target="enhance"/>

</target>

 

    <path id="classpath.main">

       <pathelement location="${classes.main}" />

    </path>

Path 是类的路径,指定当前编译的类路径

 

<taskdef name="ejbdoclet" classname="xdoclet.modules.ejb.EjbDocletTask" classpathref="xdoclet.jars" />

 

定义任务标签,

posted @ 2006-04-12 08:42 小小程序程序员混口饭吃 阅读(200) | 评论 (0)编辑 收藏
F.I.R的歌不错,以前认为最好得歌手是刀郎和孙燕姿,原来FIR也是不错得,一首我们得爱感觉气势磅礴,将细腻娇小得爱情唱得何等壮观
FIR,you are the best!
posted @ 2006-04-10 09:25 小小程序程序员混口饭吃 阅读(410) | 评论 (2)编辑 收藏

李文,李敖之女
 

  为人之女不易,为人之母不对,为国之心不错。

posted @ 2006-04-07 08:32 小小程序程序员混口饭吃 阅读(289) | 评论 (0)编辑 收藏

将进酒



李白

君不见黄河之水天上来,奔流到海不复回。
君不见高堂明镜悲白发,朝如青丝暮成雪。
人生得意须尽欢,莫使金樽空对月。
天生我材必有用,千金散尽还复来。
烹羊宰牛且为乐,会须一饮三百杯。
岑夫子、丹丘生:将进酒,杯莫停。
与君歌一曲,请君为我侧耳听。
钟鼓馔玉不足贵,但愿长醉不愿醒。
古来圣贤皆寂寞,唯有饮者留其名。
陈王昔时宴平乐,斗酒十千恣欢谑。
主人何为言少钱,径须沽取对君酌。
五花马,千金裘,呼儿将出换美酒,
与尔同销万古愁。
【诗文解释】

  你难道没有看见,汹涌奔腾的黄河之水,有如从天上倾泻而来?它滚滚东去,奔向东海,永远不会回还。你难道没有看见,在高堂上面对明镜,深沉悲叹那一头白发?早晨还是满头青丝,傍晚却变得如雪一般。因此,人生在世每逢得意之时,理应尽情欢乐,切莫让金杯空对皎洁的明月。既然老天造就了我这栋梁之材,就一定会有用武之地,即使散尽了千两黄金,也会重新得到。烹羊宰牛姑且尽情享乐,今日相逢,我们真要干杯三百。岑夫子,丹丘生,请快喝不要停,我为你唱一首歌,请你们侧耳为我细细听。在钟鼓齐鸣中享受丰美食物的豪华生活并不值得珍贵,但愿永远沉醉不愿清醒。自古以来那些圣贤无不感到孤独寂寞,唯有寄情美酒的人才能留下美名。陈王曹植过去曾在平乐观大摆酒宴,即使一斗酒价值十千也在所不惜,恣意畅饮。主人啊,你为什么说钱已经不多,快快去买酒来让我们一起喝个够。牵来名贵的五花马,取出价钱昂贵的千金裘,统统用来换美酒,让我们共同来消融这无穷无尽的万古长愁!
 
【词语解释】

    青丝:指黑发。
    雪:指白发。
    会须:正应当。
    岑夫子:指岑勋,李白之友。
    丹丘生:元丹丘,李白好友。
    钟鼓馔玉:泛指豪门贵族的奢华生活。钟鼓,指富贵人家宴会时用的乐器。馔玉:精美的饭食。
【诗文赏析】

  置酒会友,乃人生快事,又恰值「怀才不遇」之际,于是乎对酒诗情,挥洒个淋漓尽致。诗人的情感与文思在这一刻如同狂风暴雨势不可挡;又如江河入海一泻千里。
  时光流逝,如江河入海一去无回;人生苦短,看朝暮间青丝白雪;生命的渺小似乎是个无法挽救的悲剧,能够解忧的惟有金樽美酒。这便是李白式的悲哀:悲而能壮,哀而不伤,极愤慨而又极豪放。表是在感叹人生易老,里则在感叹怀才不遇。理想的破灭是黑暗的社会造成的,诗人无力改变,于是把冲天的激愤之情化做豪放的行乐之举,发泄不满,排遣忧愁,反抗现实。
  全篇大起大落,诗情忽翕忽张,由悲转喜、转狂放、转激愤、再转狂放,最后归结于「万古愁」,回应篇首,如大河奔流,纵横捭阖,力能扛鼎。全诗五音繁会,句式长短参差,气象不凡。此篇如鬼斧神工,足以惊天地、泣鬼神,是诗仙李白的巅峰之作。
posted @ 2006-04-06 19:24 小小程序程序员混口饭吃 阅读(612) | 评论 (1)编辑 收藏