스레드에서 각각 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이 발생합니다. 도와주세요.
NPE가 던져지는 줄을 확인하면 네 개의 negotiate_x가 모두 호출됩니까? – laune
service, service_1, ...은 어디에 있습니까? – laune
@laune 예. 예외는 run 메소드에서 각 case의 첫 번째 줄인 negotiate, negotiate_1 등을 호출 할 때마다 발생합니다. 그 코드의 대부분이 NetBeans에 의해 생성 되었기 때문에 service_x가 어디에 설정되어 있는지 알 수 없습니다. 하지만 어쨌든 나는 외부 run() 메소드를 호출 할 때 작동한다. 그렇다면 내부에서 작동하지 않는 이유는 무엇입니까? –