2007年5月17日
利用免费的
英语角把英语练好
北京 也乐英语为了满足广大英语爱好者的需要特推出周末免费英语角服务,
北京英语角的组织形式如下:
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 小小程序程序员混口饭吃 阅读(2118) |
评论 (0) |
编辑 收藏
我认为最大的冲击莫过于 惠普,oracle跟惠普的直接竞争会加大,从合作变为竞争,我认为惠普如果不收购redhat来对抗,未来肯定落下风!
posted @
2009-04-22 09:56 小小程序程序员混口饭吃 阅读(631) |
评论 (0) |
编辑 收藏
摘要: 上篇文章讲述了jacorb 的配置,本章讲叙其应用,随后的几篇文章会重点讲述corba的开发
JACORB开发以及corba的请求方式:
JacORB的应用开发一般分为以下五步:
1.写IDL接口定义
2.编译IDL接口定义生成Java类
3.实现步骤2中生成的接口
4.写服务器启动类,并注册到ORB
5.写客户端去获取服务对象引用
&nb...
阅读全文
posted @
2007-11-22 10:41 小小程序程序员混口饭吃 阅读(8288) |
评论 (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 小小程序程序员混口饭吃 阅读(4234) |
评论 (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 小小程序程序员混口饭吃 阅读(50024) |
评论 (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 小小程序程序员混口饭吃 阅读(1163) |
评论 (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 小小程序程序员混口饭吃 阅读(613) |
评论 (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 小小程序程序员混口饭吃 阅读(932) |
评论 (0) |
编辑 收藏
分辨率设置高了X起来后花屏,无法通过X界面恢复回去,只能用普通用户进来后,su 到root上来找到XORG.CONF 文件
修改/etc/X11/xorg.conf
screen里面的设置最大的那个去掉就好了,重启就可以了
posted @
2007-07-24 09:19 小小程序程序员混口饭吃 阅读(2592) |
评论 (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 小小程序程序员混口饭吃 阅读(16090) |
评论 (0) |
编辑 收藏
最近测试OMADM1.2的时候,039,040两个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.
所以这2个case基本上测试一个就足够了。
另外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 小小程序程序员混口饭吃 阅读(1977) |
评论 (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 小小程序程序员混口饭吃 阅读(959) |
评论 (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 小小程序程序员混口饭吃 阅读(1971) |
评论 (0) |
编辑 收藏