Hi Martin,
Unfortunately, I simply can't reproduce the problem. The chat client
and server are running more than 30 minutes now... :-(
Thanks anyway!
Trustin
On 10/30/07, Martin Alderson <[EMAIL PROTECTED]> wrote:
> Hi Trustin,
>
> I've only just noticed you replied!
>
> Thanks for getting back to me on this. I put some effort into creating
> a reproducible example of this problem today. I couldn't find any
> existing tests that could be used for this so I just hijacked the chat
> example. I managed to get this example to give some
> WriteTimeoutExceptions with just the following code added to the login
> method of the ChatClientSupport class:
>
> final int PERIOD_SECONDS = 3;
> session.getConfig().setWriteTimeout(PERIOD_SECONDS);
> Timer timer = new Timer();
> timer.scheduleAtFixedRate(new TimerTask() {
> public void run () {
> session.write("BROADCAST testJob");
> }
> }, 0, PERIOD_SECONDS * 1000);
>
> I've attached the full modified copy of the ChatClientSupport class
> (originally from trunk). I hope that's OK - it's only 4K.
>
> To reproduce the problem just start up the server and client with this
> modification, press the connect button and wait for a
> WriteTimeoutException to show up. I've not had to wait more than a
> minute for it on my machine.
>
> The log output shows that all previous messages were sent and received.
>
> Thanks,
>
> Martin
>
>
>
> Trustin Lee wrote:
> > Hi Martin,
> >
> > Apologies for the late response....
> >
> > On 9/18/07, Martin Alderson <[EMAIL PROTECTED]> wrote:
> >> Hi all,
> >>
> >> I don't know too much about Mina so forgive me if I say anything stupid!
> >>
> >> I have hit a problem with my own hacked about version of ApacheDS.
> >> ApacheDS is an LDAP server which uses Mina 1.1.2 for its replication
> >> service.
> >>
> >> The problem I am experiencing is that I have a replication (write)
> >> scheduled to occur every 60 seconds, and occasionally when this occurs I
> >> will immediately get a WriteTimeoutException. I understand the default
> >> write timeout is also 60 seconds. The strange thing is the two servers
> >> are running on the same machine and looking at the logs it seems that all
> >> previous messages were sent.
> >>
> >> I am wondering if it is possible that when my new write is attempted the
> >> timeout is checked at the same time - so Mina thinks there is a write
> >> pending and sees that the last message was sent more than 60 seconds ago
> >> (which would be possible depending on the thread timing!)
> >>
> >> Has anyone experienced something like this before? Does this sound like a
> >> possible scenario?
> >
> > I think it can happen, but it shouldn't happen. Whenever something is
> > written, lastWriteTime is updated automatically, and
> > WriteTimeoutException is raised only when lastWriteTime has not been
> > updated for a certain amount of time. Looking into
> > SocketIoProcessor.java, it attempts to write first (i.e. doFlush())
> > and then check timeout (i.e. notifyIdleness()). Are you sure the
> > caught WriteTimeoutException is for the successfully written message?
> > Any simplified test case would be appreciated.
> >
> > Thanks,
> > Trustin
>
>
> /*
> * Licensed to the Apache Software Foundation (ASF) under one
> * or more contributor license agreements. See the NOTICE file
> * distributed with this work for additional information
> * regarding copyright ownership. The ASF licenses this file
> * to you under the Apache License, Version 2.0 (the
> * "License"); you may not use this file except in compliance
> * with the License. You may obtain a copy of the License at
> *
> * http://www.apache.org/licenses/LICENSE-2.0
> *
> * Unless required by applicable law or agreed to in writing,
> * software distributed under the License is distributed on an
> * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> * KIND, either express or implied. See the License for the
> * specific language governing permissions and limitations
> * under the License.
> *
> */
> package org.apache.mina.example.chat.client;
>
> import java.net.SocketAddress;
> import java.util.Timer;
> import java.util.TimerTask;
>
> import javax.net.ssl.SSLContext;
>
> import org.apache.mina.common.ConnectFuture;
> import org.apache.mina.common.IoHandler;
> import org.apache.mina.common.IoSession;
> import org.apache.mina.example.echoserver.ssl.BogusSslContextFactory;
> import org.apache.mina.filter.ssl.SslFilter;
> import org.apache.mina.transport.socket.nio.NioSocketConnector;
>
> /**
> * A simple chat client for a given user.
> *
> * @author The Apache MINA Project ([email protected])
> * @version $Rev$, $Date$
> */
> public class ChatClientSupport {
> private final IoHandler handler;
>
> private final String name;
>
> private IoSession session;
>
> public ChatClientSupport(String name, IoHandler handler) {
> if (name == null) {
> throw new IllegalArgumentException("Name can not be null");
> }
> this.name = name;
> this.handler = handler;
> }
>
> public boolean connect(NioSocketConnector connector, SocketAddress
> address,
> boolean useSsl) {
> if (session != null && session.isConnected()) {
> throw new IllegalStateException(
> "Already connected. Disconnect first.");
> }
>
> try {
>
> if (useSsl) {
> SSLContext sslContext = BogusSslContextFactory
> .getInstance(false);
> SslFilter sslFilter = new SslFilter(sslContext);
> sslFilter.setUseClientMode(true);
> connector.getFilterChain().addLast("sslFilter", sslFilter);
> }
>
> connector.setHandler(handler);
> ConnectFuture future1 = connector.connect(address);
> future1.awaitUninterruptibly();
> if (!future1.isConnected()) {
> return false;
> }
> session = future1.getSession();
> login();
>
> return true;
> } catch (Exception e) {
> return false;
> }
> }
>
> public void login() {
> session.write("LOGIN " + name);
>
> //MGA// Test write timeout problem.
> final int PERIOD_SECONDS = 3;
> session.getConfig().setWriteTimeout(PERIOD_SECONDS);
> Timer timer = new Timer();
> timer.scheduleAtFixedRate(new TimerTask() {
> public void run () {
> session.write("BROADCAST testJob");
> }
> }, 0, PERIOD_SECONDS * 1000);
> }
>
> public void broadcast(String message) {
> session.write("BROADCAST " + message);
> }
>
> public void quit() {
> if (session != null) {
> if (session.isConnected()) {
> session.write("QUIT");
> // Wait until the chat ends.
> session.getCloseFuture().awaitUninterruptibly();
> }
> session.close();
> }
> }
>
> }
>
>
--
what we call human nature is actually human habit
--
http://gleamynode.net/
--
PGP Key ID: 0x0255ECA6