2017-02-03 52 views
1

我想要一個客戶端,它將接收WS消息並將其存儲以供進一步分析。Tyrus - 客戶端收到的郵件消息

我創建基於https://dzone.com/articles/sample-java-web-socket-client

不幸的是在每個onMessage方法調用將存儲的值是零,並且不能增加的消息字段的客戶端。

代碼

package com.sample.ws; 

import org.apache.log4j.Logger; 

import javax.websocket.*; 
import java.net.URI; 
import java.util.ArrayList; 
import java.util.List; 

import static java.lang.Thread.sleep; 

@ClientEndpoint 
public class WSClient { 
    private static final Logger LOG = Logger.getLogger(WSClient.class); 

    private List<String> testContext; 

    public static void main(String[] args) { 
     WSClient client = new WSClient(); 

     List testContext = new ArrayList<String>(); 
     client.setTestContext(testContext); 

     client.run(); 

     LOG.info("Final state: " + testContext); 
    } 

    private void run() { 
     LOG.info("Initial state: " + testContext); 

     WebSocketContainer container = null;// 
     Session session = null; 
     try { 
      container = ContainerProvider.getWebSocketContainer(); 
      session = container.connectToServer(com.sample.ws.WSClient.class, URI.create("ws://localhost:8080/wsserver-1.0/ratesrv")); 
      LOG.info("Connected to server"); 
      sleep(10000L); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      if (session != null) { 
       try { 
        session.close(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

    @OnMessage 
    private void onMessage(String message) { 
     //the new USD rate arrives from the websocket server side. 
     LOG.info("Received msg: " + message); 
     testContext.add(message); 
    } 

    private void setTestContext(List<String> testContext) { 
     this.testContext = testContext; 
    } 
} 

登錄

INFO WSClient - Initial state: [] 
INFO WSClient - Connected to server 
INFO WSClient - Received msg: USD Rate: 2.998 
Feb 03, 2017 5:52:22 PM org.glassfish.tyrus.core.AnnotatedEndpoint onError 
INFO: Unhandled exception in endpoint com.sample.ws.WSClient. 
java.lang.NullPointerException 
    at com.sample.ws.WSClient.onMessage(WSClient.java:55) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.glassfish.tyrus.core.AnnotatedEndpoint.callMethod(AnnotatedEndpoint.java:520) 
    at org.glassfish.tyrus.core.AnnotatedEndpoint.access$100(AnnotatedEndpoint.java:87) 
    at org.glassfish.tyrus.core.AnnotatedEndpoint$WholeHandler$1.onMessage(AnnotatedEndpoint.java:619) 
    at org.glassfish.tyrus.core.TyrusSession.notifyMessageHandlers(TyrusSession.java:576) 
    at org.glassfish.tyrus.core.TyrusEndpointWrapper.onMessage(TyrusEndpointWrapper.java:879) 
    at org.glassfish.tyrus.core.TyrusWebSocket.onMessage(TyrusWebSocket.java:216) 
    at org.glassfish.tyrus.core.frame.TextFrame.respond(TextFrame.java:139) 
    at org.glassfish.tyrus.core.ProtocolHandler.process(ProtocolHandler.java:807) 
    at org.glassfish.tyrus.client.TyrusClientEngine$TyrusReadHandler.handle(TyrusClientEngine.java:747) 
    at org.glassfish.tyrus.container.grizzly.client.GrizzlyClientFilter$ProcessTask.execute(GrizzlyClientFilter.java:476) 
    at org.glassfish.tyrus.container.grizzly.client.TaskProcessor.processTask(TaskProcessor.java:114) 
    at org.glassfish.tyrus.container.grizzly.client.TaskProcessor.processTask(TaskProcessor.java:91) 
    at org.glassfish.tyrus.container.grizzly.client.GrizzlyClientFilter.handleRead(GrizzlyClientFilter.java:272) 
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112) 
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) 
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:526) 
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137) 
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591) 
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571) 
    at java.lang.Thread.run(Thread.java:745) 
INFO WSClient - Final state: [] 

回答

1

的WebSocket客戶端創建新實例和 「的TestContext」 字段不填充那裏。

使其成爲靜態並且它將開始工作。此外,您需要使其線程安全。 (即:CopyOnWriteArrayList)。

另一個選項是調用#connectToServer(Object, URI),這將強制WebSocket客戶端使用提供的實例(而不是創建一個新的實例)。同樣,您需要確保您的集合(以及在處理期間訪問的其他字段)以線程安全的方式訪問。

相關問題