On 11/3/06, Hieu Phan Thanh <[EMAIL PROTECTED]> wrote:

Hello,

You could not check by the code:
while(!IoSession.containsAttribute("result"));
Because the IoSession instances are different between Server side and
Client side (2 different processes).


No.  you misunderstand my meaning.
I use this way because there are the same IoSession.

More details. I hope now i explain my idea more clearly, :)

Client:

public class ResultMessageHandler implements MessageHandler {

   public void messageReceived(IoSession session, Object message) throws
Exception {
       // TODO Auto-generated method stub
       ResultMessage result = (ResultMessage)message;
       session.setAttribute("result", result);
   }
}

ResultMessage is decoded by the class ResultMessageDecoder, which is
implemented in another class of mine.

public class ClientSessionHandler extends DemuxingIoHandler {
    public ClientSessionHandler() {
       super.addMessageHandler(ResultMessage.class, new
ResultMessageHandler());
       super.addMessageHandler(ErrorMessage.class, new
ErrorMessageHandler());
   }
}

public class Client {
       IoSession session;
       ConnectFuture future = connector.connect(new InetSocketAddress(host,
port), handler, cfg);
       future.join();
       session = future.getSession();

       while (!session.containsAttribute("result")
             ;
}

I can ensure that i can read the attribute from the same IoSession.

But i don't prefer the way i use in the class "ResultMessageHandler". I want
a more flexible way than setAttribute().
Because using containsAttribute to judge whether i have received
ResultMessage may block the whole application
unexpectedly, i'm afraid.



You should modify the protocol: server will send the acknowledge (ACK)
back to client whenever the message is received completely via the
messageReceived() of MINA framework. How do you think?

I have been working around this protocol for month in my current
project.

Thanks & best regards,
Hieu Phan.

> -----Original Message-----
> From: sishen [mailto:[EMAIL PROTECTED]
> Sent: Thursday, November 02, 2006 3:05 PM
> To: mina-dev@directory.apache.org
> Subject: Re: How to get the received message object?
>
> On 11/1/06, Hieu Phan Thanh <[EMAIL PROTECTED]> wrote:
> >
> > Hi,
> >
> > > But i don't know when the result message is done. I use
> > I don't know what you meant when saying "when the result message is
> > done"? MINA just helps us to transfer the message. And you have to
> > customize and handle the processing logic of the system yourself.
> > Please give me more detail or something related. Hope I could help
you
> > guy.
>
>
> That's  when the  message is received by client totally.
> for (::) {
> try {
>      ConnectFuture future = connector.connect(new
InetSocketAddress(host,
> port), handler, cfg);
>      future.join();
>     session = future.getSession();
>     break;
> } catch ... {
> }
> }
>
> When i connect to the server, i send a query message. And
furture.join()
> is
> return just when the connection is established.
>
> I want to ensure that i have received the request message which is
sent by
> the server. My question is how can i do this?
>
> Now i use
>
> when received message,
> I set an attribute in the IoSession.  IoSession.setAttribute("result",
> object);
>
> and in the client's process flow,  i use while statement to ensure the
> message is received totally.
>
> while ( !IoSession.containsAttribute("result") )
>      ;
>
> I'm seeking a better way.  Thx for advice, :)
>
> > Thanks & best regards,
> > Hieu Phan.
> >
> > > -----Original Message-----
> > > From: sishen [mailto:[EMAIL PROTECTED]
> > > Sent: Wednesday, November 01, 2006 4:26 PM
> > > To: mina-dev@directory.apache.org
> > > Subject: How to get the received message object?
> > >
> > > public class ResultMessageHandler implements MessageHandler {
> > >     public void messageReceived(IoSession session, Object message)
> > throws
> > > Exception {
> > >         ResultMessage result = (ResultMessage)message;
> > >         System.out.println("Message Received: ResultMessage");
> > >     }
> > > }
> > >
> > > when i received the ResultMessage, i need to save it.
> > >
> > > Now i use
> > > session.setAttribute("result", result);
> > > And in the client,
> > > ResultMessage result =
(ResultMessage)session.getAttribute("result");
> > >
> > > But i don't know when the result message is done. I use
> > > while (!session.containsAttribute("result"))
> > >      ;
> > > ResultMessage result =
(ResultMessage)session.getAttribute("result");
> > >
> > > But this has an problem, which is that when the server met an
mistake,
> > it
> > > will block forever. I do not prefer this way.
> > >
> > >
> > > I want to know whether there is a way to solve this problem.  I
want
> > to
> > > return the message the server sent to me.
> > >
> > > thx~
> >
> >


Reply via email to