package test;
import java.rmi.RemoteException;
import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
public class TstCall {
public static void main(String[] args) throws ServiceException, RemoteException {
//初始化参数
String chgKind = "1"; // 1:增加;2:变更
String workNo = "CY_yy" ;
String workNAme = "白莉";
String mobile = "15133333333";
String dealerId = "920301832";
String chgDate = "20160302";
String YGZurl = null ;
//创建服务
Service YGZservice = new Service();
//创建调用句柄
Call YGZcall = (Call) YGZservice.createCall();
//设置请求地址
YGZcall.setTargetEndpointAddress(YGZurl);
YGZcall.setOperationName(new QName(null, "IfService"));
try
{
Object o =YGZcall.invoke(new Object[] { "","123","Service","",
"<request><userlist><user><systemtype note=\"sour\">1</systemtype><kind note=\"chg\">"+chgKind+"</kind>"
+"<id note=\"num\">"+workNo+"</id><name note=\"numname\">"+workNAme+"</name><limit note=\"pp\">1</limit>"
+"<tel note=\"tel\">"+mobile+"</tel><belongfkid note=\"dealerID\">"+dealerId+"</belongfkid><starttime note=\"chgtime\">"+chgDate+"</starttime>"
+"</user></userlist></request>" });
}catch(Exception e) {
e.printStackTrace();
}
}
}
在window下执行都正常,但是在linux下执行报错:
执行语句:
java -jar -Djava.ext.dirs=/home/oracle/xf_everyday_check_p/javajar/lib/ test.jar
报错日志:
AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope...}Server.userException
faultSubcode:
faultString: java.lang.NullPointerException
faultActor:
faultNode:
faultDetail:
{http://xml.apache.org/axis/}stackTrace:java.lang.NullPointerException
at java.security.SecureRandom.nextBytes(SecureRandom.java:292)
at org.apache.axis.utils.SessionUtils.generateSessionId(SessionUtils.java:62)
at org.apache.axis.SOAPPart.<init>(SOAPPart.java:164)
at org.apache.axis.Message.setup(Message.java:377)
at org.apache.axis.Message.<init>(Message.java:246)
at org.apache.axis.client.Call.invoke(Call.java:2425)
at org.apache.axis.client.Call.invoke(Call.java:2366)
at org.apache.axis.client.Call.invoke(Call.java:1812)
at test.TstLinux.main(TstLinux.java:56)
{http://xml.apache.org/axis/}hostname:LN-CRM-APP
java.lang.NullPointerException
at org.apache.axis.AxisFault.makeFault(AxisFault.java:101)
at org.apache.axis.client.Call.invoke(Call.java:1828)
at test.TstLinux.main(TstLinux.java:56)
Caused by: java.lang.NullPointerException
at java.security.SecureRandom.nextBytes(SecureRandom.java:292)
at org.apache.axis.utils.SessionUtils.generateSessionId(SessionUtils.java:62)
at org.apache.axis.SOAPPart.<init>(SOAPPart.java:164)
at org.apache.axis.Message.setup(Message.java:377)
at org.apache.axis.Message.<init>(Message.java:246)
at org.apache.axis.client.Call.invoke(Call.java:2425)
at org.apache.axis.client.Call.invoke(Call.java:2366)
at org.apache.axis.client.Call.invoke(Call.java:1812)
... 1 more
Étant donné que java.security.SecureRandom s'appuie sur /dev/random sous Linux (voir ici pour le mécanisme de génération de nombres aléatoires Linux), exécutez le script de test après avoir exécuté le programme de test sur le serveur sur lequel le problème s'est produit. suit :
[ java] afficher la copie brute
haitao-yao@haitaoyao-laptop:/data/develop/java/jre/lib/security$ jps && lsof /dev/random
7399 Jps
7382 TestAléatoire
COMMANDE PID UTILISATEUR TYPE FD TAILLE DE L'APPAREIL/NOM DU NŒUD
java 7382 haitao-yao 4r CHR 1,8 0t0 4402 /dev/random
On en conclut donc que cela est dû à un problème avec la stratégie de génération de nombres aléatoires.
Google a trouvé ce bug dans Jetty (Jetty HashSessionIdManager se bloque au démarrage). Quelqu'un a également soulevé ce problème dans la base de données de bugs jdk (voir ici) :
java.security.SecureRandom dépend de /. dev/random génère des nombres aléatoires, ce qui peut provoquer le blocage de jdk lors de l'utilisation de /dev/random en raison d'une interruption système insuffisante. Jetty ne peut pas être démarré, ce qui finit par geler l'ensemble du nœud de nom au démarrage.
La solution a également été donnée dans la base de données de bugs de Sun, qui consiste à ajouter : -Djava.security.egd=file:/dev/urandom aux paramètres de démarrage du programme java et à utiliser /dev/urandom pour générer des nombres aléatoires.
Pour l'analyse des différences entre /dev/random et /dev/urandom, veuillez voir ici, pas plus de détails.
Résumé :
Hadoop fournit des pages HTML via le protocole http pour exposer l'état interne du système. Il s'agit d'une très bonne fonctionnalité dans la conception de systèmes distribués, mais en raison de l'intégration de Jetty, la jetée intégrée est. configurable dans hadoop. Il n'était pas fort, donc ce problème a été exposé. Je ne comprends vraiment pas pourquoi Hadoop n'utilise pas de thread séparé pour démarrer la jetée interne. Après tout, ce n'est pas la fonction principale du namenode, car de telles fonctions auxiliaires affectent les fonctions principales du système, ce qui n'en vaut pas la peine. le gain.