2017-07-14 27 views
0

スレッド内で実行されているudpサーバに、データグラムを受信するたびにイベントを発生させ、jsonという形式のデータを送信します。実際にイベントを発生させますサーバで実行中のスレッドからCDIイベントを起動するにはどうすればよいですか?

public class StatusChangeObserver { 

     public void statusChanged(@Observes StatusChange sce) { 
      WebsocketEndPoint.sendAll(sce.getJson()); 
     } 
    } 

    @ServerEndpoint(value="/websocket") 
    public class WebsocketEndPoint { 
     private static Set<Session> userSessions = Collections.synchronizedSet(new HashSet<Session>()); 

     @OnOpen 
     public void onOpen(Session userSession) { 
      System.out.println("Opening new connection"); 
      userSessions.add(userSession); 
     } 

     @OnClose 
     public void onClose(Session userSession) { 
      System.out.println("Connection closed. Id: " + userSession.getId()); 
      userSessions.remove(userSession); 
     } 


     public static void sendAll(String message) { 
      for (Session session : userSessions) { 
       if (session.isOpen()) { 
        session.getAsyncRemote().sendText(message); 
       } 
      }  
     } 
    } 

ハンドラ:

public class UDPServer extends Thread { 

     private SocketUDPCommunication comm; 

     @Inject @Notify 
     private StatusChangeHandler sch; 

     public UDPServer() { 
      comm = new SocketUDPCommunication(); 
     } 


     @Override 
     public void run() { 

      DatagramPacket response; 

      comm.setPort(Utils.UDP_SERVER_PORT); 
      comm.createSocket(); 

      while (!Thread.currentThread().isInterrupted()) { 
       System.out.println("Waiting for clients to connect on port:" + comm.getSocket().getLocalPort()); 
       try { 
        response = comm.receiveResponse(); 
       } catch (SocketTimeoutException e) { 
        continue; 
       }       

       byte[] byteSend = comm.discardOffset(response); 

       Status status = frameToJson(byteSend); 

       Genson genson = new Genson(); 
       String json = genson.serialize(status); 

       sch.sendChangedStatus(json); //Raise the cdi event, sch not initialized!! 
      } 

     } 

     @Override 
     public void interrupt() { 
      super.interrupt(); 
      comm.closeConnection(); 
     } 
    } 

が接続されているすべてのクライアントにこのメッセージをブロードキャストするのWebSocketエンドポイントのメソッドを呼び出します。このイベントのリスナーを、そこに定義されます

@Notify 
    public class StatusChangeHandler { 

     @Inject 
     private Event<StatusChange> statusChangedEvent; 

     public void sendChangedStatus(String json) { 
      StatusChange sce = new StatusChange(json); 
      statusChangedEvent.fire(sce); 
     } 
    } 

StatusChangeは、ブロードキャストするメッセージを含む単純なPOJOです。 @Notify修飾子:

@Qualifier 
    @Retention(RUNTIME) 
    @Target({METHOD, FIELD, PARAMETER, TYPE}) 
    public @interface Notify { 
    } 

これらは依存性注入との私の最初のステップですので、私は、私は、スレッド内からイベントを発生する方法、およびschオブジェクトを初期化する方法をかなりよく分かりません。 WeldWeldContainerクラスを使用してCDIを初期化することをお勧めするthis pageが見つかりましたが、このクラスをmavenで見つけることができません。これは正しいアプローチですか?その場合、誰も私のプロジェクトにこれらのクラスを含める方法を知っていますか?

+1

Tomcatにデプロイする場合は、Weld Servletの代わりにWeld Servlet https://docs.jboss.org/weld/reference/latest/en-US/html/environments.html#weld-servletを使用する必要があります。溶接SE。 –

答えて

0

ここには溶接ライブラリがあるパブリックリポジトリがあります。

https://mvnrepository.com/artifact/org.jboss.weld

しかし、あなたは何が必要なのですか?あなたはそれを使用する環境ですか?たとえば、wildflyでは、cdi 1.1またはcdi 1.2が統合されているので、このライブラリを追加する必要はありません。詳細については

、あなたがTomcatの上にあるのでhttp://weld.cdi-spec.org/

+0

私はTomcat8を使用していますが、Weldのドキュメントに示されている依存関係は "pom.xml"に含まれています。 Empty "beans.xml"はWEB-INFにあり、 "context.xml"はMETA-INFにあります。それでも、私は "org.jboss.weld.environment.se.Weld"をインポートできません。 – Juan

0

を使用し、我々はサーブレット環境を話しています。そのために、Weldは自動的にCDIをブートストラップするサーブレットJARを提供します。 Weld/WeldContainerを手動で処理する必要はありません。

ここにはlink to Weld documentationがあり、必要なアーチファクト/依存性とその使い方を説明しています。

これを追加した後で、アプリケーションをTomcatにデプロイするときにCDIをブートストラップするだけです。

関連する問題