0

通信にJava zeromqフレームワークを使用するネットワーククライアント/サーバーアプリケーションがあります。メインサーバーと、サーバーをポーリングする N 個のクライアントがあります。サーバーがオンラインになったとき。クライアントは彼を接続し、クライアント間でいくつかの短いマッサージが行われ、今まで単一のクライアントで完了しましたが、うまくいきました。しかし、別のクライアントを追加するとき(それは 2 です)、返されたメッセージとしてリクエストnullを取得します:request = socket.recv(0); この例に基づいて: http://zguide.zeromq.org/java:mtserver

私のコード(その一部は非常に長い)すべてのコンテキストとZeroMq設定が設定されており、nullではなく、常にこの例外が発生します:

Exception in thread "Thread-1" org.zeromq.ZMQException: Operation cannot be accomplished in current state(0x9523dfb)
        at org.zeromq.ZMQ$Socket.recv(Native Method)
        at com.controller.core.Daemon$1.run(Daemon.java:127)



for(int thread_nbr = 0; thread_nbr < m_iThreadPoolCount; thread_nbr++) {
                Thread worker_routine = new Thread() {

                   @Override
                   public void run() {
                     //synchronized(OBJ_LOCK) {
                      ZMQ.Socket socket = m_pNetworkManager.getContext().socket(ZMQ.REP);//context.socket(ZMQ.REP);                    
                      socket.connect ("inproc://workers");

                      while (true) {

                        /** Wait for next request from client (C string) */
                        byte[] request = null;
                        try{  
                            if(m_pNetworkManager.getContext()!=null) // its never null
                            {
                                request = socket.recv (0);

                            }

                        }catch (Exception e)
                        {

                    // it allays gets null exception            
                        }

                        boolean bFoundInList = false;

                        if(request!=null)
                        {

                                        // multi frame sending 
                                        socket.send(m_UT.getbyteArray(
                                                    m_UT.getReplayStructure(aStateMap_replay)
                                        ),ZMQ.SNDMORE);                                      
                                        socket.send(new byte[0], ZMQ.SNDMORE);
                                        byte[] byteFileStruct =  null;                                      
                                        byteFileStruct =  m_UT.serialize(stateFilesStruct);
                                        boolean send = socket.send(byteFileStruct,0);



                      } // socket.recv end

                     }
                  // }// synchronized block 
                }
                }; //Thread worker_routine

                worker_routine.start();
             }
             //  Connect work threads to client threads via a queue
             ZMQQueue zMQQueue = new ZMQQueue( m_pNetworkManager.getContext(),
                                               m_pNetworkManager.getClients(),
                                               m_pNetworkManager.getWorkers());
             zMQQueue.run();

             //  We never get here but clean up anyhow
             m_pNetworkManager.getClients().close();
             m_pNetworkManager.getWorkers().close();
             m_pNetworkManager.getContext().term();
    }

また、NetworkManager クラスを追加しました

public class NetworkManager {

    /** ZeroMQ context  */ 
    private ZMQ.Context m_context = null;
    /** ZeroMQ socket */
    private ZMQ.Socket m_socket = null;
    /** representation of the clients */
    ZMQ.Socket m_clients = null;
    /** representation of the workers threads */
    ZMQ.Socket m_workers = null;
    /**
    * NetworkManager constructor.
    */   
    public NetworkManager()
    {
        ;
    }

    /**
     * Setup the network ZeroMQ network layer 
     * @param sControllerDomain the Controller domain name and port 
     */
    public void Init(String sControllerDomain)
    {
         /**  Prepare our context and socket */
         m_context = ZMQ.context(1);

         m_clients = m_context.socket(ZMQ.ROUTER);
        // m_clients = m_context.socket(ZMQ.REP);
         m_clients.bind (sControllerDomain);

         m_workers = m_context.socket(ZMQ.DEALER);
         m_workers.bind ("inproc://workers");
    }

    /**
     * Get ZeroMQ context 
     * @return ZMQ.Context
     */
    public ZMQ.Context getContext() {
        return m_context;
    }

    /**
     * get ZeroMQ Socket
     * @return ZMQ.Socket
     */
    public ZMQ.Socket getSocket() {
        return m_socket;
    }
    /**
     * get the workers as ZMQ.Socket
     * @return ZMQ.Socket
     */
    public ZMQ.Socket getWorkers() {
        return m_workers;
    }
    /**
     * get the Clients as ZMQ.Socket
     * @return ZMQ.Socket
     */
    public ZMQ.Socket getClients() {
        return m_clients;
    }

}
4

1 に答える 1

0

あなたのOSシステムは何ですか?Windows を使用している場合、次を使用した操作m_workers.bind ("inproc://workers")はサポートされていません。ちゃんと覚えたら。

于 2014-01-17T19:09:50.557 に答える