java,webservice,SOAP,thread和websocket

时间:2015-08-05 23:03:17

标签: java web-services soap websocket glassfish

我有一个java客户端调用部署在glassfish服务器4.1上的java SOAP webservice,同样的java客户端也有一个websocket连接到部署在同一服务器上的服务器。 基本上我的架构就是这个我有一个java客户端调用SOAP Web服务,并连接到java websocket服务器端点。为什么?您可以将此类似于银行,客户端调用SOAP Web服务以检查帐户余额,然后websocket用于在帐户上进行贷记/借记时通知客户端。 问题:在我的main方法中,我启动了与websocket的连接,之后我调用了webservice来获取资源。现在问题是我必须在调用webservice之前多次尝试。这是一个非常奇怪的错误。我尝试在不同的线程上初始化websocket但我仍然遇到同样的问题。请参阅以下代码

银行网络服务:

//relevant import statements
@WebService(serviceName = "BankService")
public class BankService {
private static final Map<Integer, AccountHolder> accountHolders = new ConcurrentHashMap<Integer, AccountHolder>();
private static AccountHolder customer, merchant;

public BankService(){
    customer = new AccountHolder("Customer 1", 1234, 4321, 4000, null, null);
    merchant = new AccountHolder("Merchant", 5678, 8765, 1000, null, null);
    accountHolders.put(1234, customer);
    accountHolders.put(5678, merchant);
}

@WebMethod(operationName = "getBalance")
public String getBalance(@WebParam(name = "acctNum") int acctNum) {
    AccountHolder client;
    synchronized(accountHolders){
        client = accountHolders.get(acctNum);            
    }
    return client.toString(); //returns a string containing balance
    }
}

银行通知websocket:

@ServerEndpoint(value="/n")
public class NotificationServer {
    private Logger logger = Logger.getLogger(this.getClass().getName());

    @OnOpen
    public void onOpen(Session session) throws InterruptedException, IOException {
        logger.info("Connected ... " + session.getId());        
    }

    @OnMessage
    public void notifyCustomer(String message, Session session) throws InterruptedException, IOException {
        session.getBasicRemote().sendText(message);
    }
    @OnClose....
}

客户端

public class Client {
    static Client client;
    private String getBalance(int acctNum) {
        BankService_Service service = new BankWebService.BankService_Service();
        BankService port = service.getBankServicePort();
        return port.getBalance(acctNum);
    }

    private void wsc() throws InterruptedException {
        BankNotificationClient bnc = new BankNotificationClient();
        Thread thread = new Thread(bnc);
        thread.start();
    }

    public static void main(String[] args) throws InterruptedException {
        client = new Client();
        client.wsc();
        Scanner scanner = new Scanner(System.in);
        while(!"quit".equals(scanner.next())){
            if(scanner.next().equals("check")){
                System.out.println(client.getBalance(1234));
            }
        }
    }
}

银行通知客户:

//necessary import statements
import javax.*;
import org.glassfish.tyrus.client.ClientManager;

@ClientEndpoint
public class BankNotificationClient implements Runnable {
    private static Session clientSession;    
    private Logger logger = Logger.getLogger(this.getClass().getName());
    ClientManager clientws;

    @OnOpen
    public void onOpen(Session session) throws InterruptedException {
        logger.info("Connected ... " + session.getId());
        clientSession = session;
    }

    @OnMessage
    public void onMessage(String message, Session session) {
        ....
    }

    @OnClose
    public void onClose(Session session, CloseReason closeReason) {
        logger.info(String.format("Session %s has closed because %s", session.getId(), closeReason));
    }

    public void run() {
        try {
                client = ClientManager.createClient();
                client.connectToServer(BankNotificationClient.class, new URI("ws://localhost:8080/BankService/n"));
                System.out.println("working" + client.getClass());
            } catch (DeploymentException | URISyntaxException e) {
                logger.info("Something has gone wrong initializing the socket");
            } 
    }
}

我使用netbeans 8.0.2作为我的开发IDE。已将webservice和websocket部署到glassfish服务器4.1。运行此将提供以下输出 的输出:

Aug 05, 2015 11:31:18 PM BankNotificationHandler.BankNotificationClient     onOpen
INFO: Connected ... 981de7b4-91b9-43b6-beaf-c219500ee77a
check
check
Dear Customer Customer 1, your account balance is 4000.
check
check
Dear Customer Customer 1, your account balance is 4000.
check
check
Dear Customer Customer 1, your account balance is 4000.

正如您从输出中看到的那样,我必须输入并在从Web服务获得结果之前输入“check”两次。在第一个检查条目上使用调试器,代码突然停止在while循环中的if语句,然后我必须再次输入“check”。在输入检查时,它将从if语句行停止的位置继续,并继续给我所需的结果。

如果我遗漏了任何其他信息,请告诉我。 欢呼声。

0 个答案:

没有答案