2014-11-28 6 views
0

스레드에서 각각 4 개의 webservices를 호출하는 멀티 스레드 웹 서비스를 작성하려고합니다. 웹 서비스를 직접 호출하려고하면 작동합니다. 하지만 스레드에서 호출하려고하면 NullPointerException이 발생합니다. 이것에 대한 아이디어가 있습니까?Null 포인터 스레드에서 웹 서비스를 호출 할 때 예외가 발생했습니다.

@WebService(serviceName = "Negotiator") 
public class Negotiator implements Runnable{ 
@WebServiceRef(wsdlLocation = "WEB-INF/wsdl/localhost_8080/Negotiate4/Negotiate4.wsdl") 
private Negotiate4_Service service_3; 
@WebServiceRef(wsdlLocation = "WEB-INF/wsdl/localhost_8080/Negotiate3/Negotiate3.wsdl") 
private Negotiate3_Service service_2; 
@WebServiceRef(wsdlLocation = "WEB-INF/wsdl/localhost_8080/Negotiate2/Negotiate2.wsdl") 
private Negotiate2_Service service_1; 
@WebServiceRef(wsdlLocation = "WEB-INF/wsdl/localhost_8080/Negotiate1/Negotiate1.wsdl") 
private Negotiate1_Service service; 

private String ret[] = new String[10]; 
private Thread t[] = new Thread[10]; 

/** 
* This is a sample web service operation 
*/ 
@WebMethod(operationName = "hello") 
public String hello(@WebParam(name = "name") String txt) { 
    try { 
    Thread t1 = new Thread(new Negotiator(),"prov1"); 
    Thread t2 = new Thread(new Negotiator(),"prov2"); 
    Thread t3 = new Thread(new Negotiator(),"prov3"); 
    Thread t4 = new Thread(new Negotiator(),"prov4"); 
    t1.start(); 
    t2.start(); 
    t3.start(); 
    t4.start(); 

    t1.join(); 
    t2.join(); 
    t3.join(); 
    t4.join(); 
    } 
    catch(java.lang.InterruptedException e) 
    { 
     System.out.println("Exception: "+e); 
    } 
    String retString = ""; 
    for(int i=0;i<4;i++) { 
     retString = retString + ret[i]; 
    } 
    return "Hello " + retString + " !"; 
} 

@Override 
public void run() 
{ 
    Thread th = Thread.currentThread(); 
    System.out.println("Inside run "+ th.getName()); 
    switch (th.getName()) { 
     case "prov1": 
      ret[0] = negotiate("Hi1"); 
      break; 
     case "prov2": 
      ret[1] = negotiate_1("Hi2"); 
      break; 
     case "prov3": 
      ret[2] = negotiate_2("Hi3"); 
      break; 
     default: 
      ret[3] = negotiate_3("Hi4"); 
      break; 
    } 
} 

private String negotiate(java.lang.String name) { 

    org.prov1.Negotiate1 port1 = service.getNegotiate1Port(); 
    return port1.negotiate(name); 
} 

private String negotiate_1(java.lang.String name) { 

    org.prov2.Negotiate2 port2 = service_1.getNegotiate2Port(); 
    return port2.negotiate(name); 
} 

private String negotiate_2(java.lang.String name) { 

    org.prov3.Negotiate3 port3 = service_2.getNegotiate3Port(); 
    return port3.negotiate(name); 
} 

private String negotiate_3(java.lang.String name) { 

    org.prov4.Negotiate4 port4 = service_3.getNegotiate4Port(); 
    return port4.negotiate(name); 
} 
} 

hello 메소드 내부에서 협상 작업을 호출하려고하면 작동합니다. 하지만 내부 run()에서 협상이 호출되면 NullPointerException이 발생합니다. 도와주세요.

+0

NPE가 던져지는 줄을 확인하면 네 개의 negotiate_x가 모두 호출됩니까? – laune

+0

service, service_1, ...은 어디에 있습니까? – laune

+0

@laune 예. 예외는 run 메소드에서 각 case의 첫 번째 줄인 negotiate, negotiate_1 등을 호출 할 때마다 발생합니다. 그 코드의 대부분이 NetBeans에 의해 생성 되었기 때문에 service_x가 어디에 설정되어 있는지 알 수 없습니다. 하지만 어쨌든 나는 외부 run() 메소드를 호출 할 때 작동한다. 그렇다면 내부에서 작동하지 않는 이유는 무엇입니까? –

답변

0

문제는 @WebServiceRef이 현재 스레드에서 처리되고 대부분 컨테이너가 프록시를 통해 스레드 로컬 참조를 유지한다는 것입니다. Java EE7 컨테이너를 사용하는 경우 ManagedExecutorService을 사용하여 메소드를 호출 할 수 있지만 작동 여부는 확실하지 않습니다. 모든 것은 서비스 클래스가 초기화되는 방법과 대상에 따라 다릅니다. 설정에 대한 자세한 내용을 제공하십시오.

+0

감사합니다. ManagedExecutorService, Callable 및 Future가 해결했습니다. 나는 우리가 쓰레드에 매개 변수를 "전달"해야한다는 것을 결코 알지 못했고 그 쓰레드는 "반환 된"값을 스레드했다. –

관련 문제