찾다

 >  Q&A  >  본문

java - linux执行jar访问axis接口错误

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.&lt;init&gt;(SOAPPart.java:164)
    at org.apache.axis.Message.setup(Message.java:377)
    at org.apache.axis.Message.&lt;init&gt;(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
PHP中文网PHP中文网2810일 전422

모든 응답(1)나는 대답할 것이다

  • ringa_lee

    ringa_lee2017-04-17 17:40:46

    java.security.SecureRandom은 Linux에서 /dev/random을 사용하므로(Linux 난수 생성 메커니즘은 여기 참조) 문제가 발생한 서버에서 테스트 프로그램을 실행한 후 테스트 스크립트를 실행하면 다음과 같습니다. 다음:
    [ java] 일반 사본 보기

    1. haitao-yao@haitaoyao-laptop:/data/develop/java/jre/lib/security$ jps && lsof /dev/random

    2. 7399Jps

    3. 7382 테스트랜덤

    4. 명령 PID 사용자 FD 유형 장치 크기/OFF 노드 이름

    5. java 7382 haitao-yao 4r CHR 1,8 0t0 4402 /dev/random

    그래서 난수 생성 전략에 문제가 있기 때문이라는 결론이 나옵니다.

    Google은 jetty에서 이 버그를 발견했습니다(Jetty HashSessionIdManager가 시작 시 중단됨). 일부 사람들은 jdk 버그 데이터베이스에서도 이 문제를 제기했습니다(여기 참조). 간략한 소개는 다음과 같습니다.
    java.security.SecureRandom은 다음에 따라 다릅니다. /dev/random은 난수를 생성하므로 /dev/random을 사용할 때 시스템 인터럽트가 충분하지 않아 jdk가 정지될 수 있습니다. Jetty를 시작할 수 없어 결국 시작 시 전체 네임노드가 정지됩니다.

    sun의 버그 데이터베이스에도 해결책이 제공되어 있습니다. Java 프로그램 시작 매개변수에 -Djava.security.egd=file:/dev/urandom을 추가하고 /dev/urandom을 사용하여 난수를 생성하는 것입니다.

    /dev/random과 /dev/urandom의 차이점 분석은 여기를 참조하세요. 자세한 내용은 없습니다.

    요약:
    Hadoop은 http 프로토콜을 통해 HTML 페이지를 제공하여 시스템의 내부 상태를 노출시킵니다. 이는 분산 시스템 설계에서 매우 좋은 기능이지만 부두 통합으로 인해 통합 부두는 hadoop에서 구성 가능했습니다. 그는 강하지 않았기 때문에 이 문제가 노출되었습니다. Hadoop이 내부 부두를 시작하기 위해 별도의 스레드를 사용하지 않는 이유가 정말 이해가 되지 않습니다. 왜냐하면 이러한 보조 기능이 시스템의 핵심 기능에 영향을 미치기 때문에 이는 가치가 없기 때문입니다. 이득.

    회신하다
    0
  • 취소회신하다