This has nothing to with Android, or anything techie but I thouoght it was a quite funny..
My sister took this photo this back in our home town of Colwyn Bay in Poundland shop. Apparently 2 pregnancy kits were a pound - Now that's value for money!
Eurig Jones is a developer based in Chester, UK. As well as being a software engineer with Tyco Electronics he's currently working on chesspresso.net - Correspondence Chess for the Android platform. This is a technical blog about Android, App Engine, Wicket, Java in general and whatever else...
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
// Where ClientConfig.P_DEFAULT_CONN_TIMEOUT = 15 seconds
HttpConnectionParams.setConnectionTimeout(params, ClientConfig.P_DEFAULT_CONN_TIMEOUT);
HttpConnectionParams.setSoTimeout(params, ClientConfig.P_DEFAULT_CONN_TIMEOUT);
ConnManagerParams.setTimeout(params, ClientConfig.P_DEFAULT_CONN_TIMEOUT);
httpClient = new DefaultHttpClient(new ThreadSafeClientConnManager(params, schemeRegistry), params);...
ConnManagerParams.setMaxConnectionsPerRoute(params, new ConnPerRoute() {
@Override
public int getMaxForRoute(HttpRoute httproute)
{
return 10;
}
});
...fetch() sending failed to url http://192.168.0.45/blah
org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection
at org.apache.http.impl.conn.tsccm.ConnPoolByRoute.getEntryBlocking(ConnPoolByRoute.java:353)
at org.apache.http.impl.conn.tsccm.ConnPoolByRoute$1.getPoolEntry(ConnPoolByRoute.java:238)
at org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager$1.getConnection(ThreadSafeClientConnManager.java:175)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:325)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
at chesspresso.client.android.net.HttpCall.fetch(HttpCall.java:114)
at chesspresso.client.android.net.HttpCall.fetch(HttpCall.java:134)
at chesspresso.client.android.net.HttpCall.post(HttpCall.java:107)
at chesspresso.client.android.net.ServerCallGoogle.loginGoogle(ServerCallGoogle.java:30)
at chesspresso.client.android.activity.support.ActivityProcessesGoogle$LoginGoogleTask.doInBackground(ActivityProcessesGoogle.java:72)
at chesspresso.client.android.activity.support.ActivityProcessesGoogle$LoginGoogleTask.doInBackground(ActivityProcessesGoogle.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:185)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
at java.lang.Thread.run(Thread.java:1096)/**
*
* @author Eurig Jones
*/
public class GAELogAppender extends AppenderSkeleton
{
private static final Logger L = Logger.getLogger("log4j");
@Override
protected void append(LoggingEvent event)
{
StringBuilder b = new StringBuilder();
Level level = event.getLevel();
String s[] = event.getThrowableStrRep();
b.append(event.getMessage().toString());
if (s != null)
for (String line : s)
b.append(line).append('\n');
if (level.equals(Level.FATAL))
FATAL(b.toString());
if (level.equals(Level.ERROR))
ERROR(b.toString());
if (level.equals(Level.WARN))
WARN(b.toString());
if (level.equals(Level.INFO))
INFO(b.toString());
if (level.equals(Level.DEBUG))
DEBUG(b.toString());
if (level.equals(Level.TRACE))
TRACE(b.toString());
}
private void FATAL(String msg)
{
L.severe(msg);
}
private void ERROR(String msg)
{
L.severe(msg);
}
private void WARN(String msg)
{
L.warning(msg);
}
private void INFO(String msg)
{
L.info(msg);
}
private void DEBUG(String msg)
{
L.fine(msg);
}
private void TRACE(String msg)
{
L.finest(msg);
}
@Override
public boolean requiresLayout()
{
return false;
}
@Override
public void close()
{
}
}Now all we need to do is setup the log4j.properties and logging.properties configurations correctly to make it work. Here is a snippet of my log4j.properties:#log4j.appender.A1=org.apache.log4j.ConsoleAppender #log4j.appender.A1.layout=org.apache.log4j.PatternLayout #log4j.appender.A1.layout.ConversionPattern=%d ... #log4j.appender.A1=org.apache.log4j.jul.JULAppender log4j.appender.A1=chesspresso.server.log.GAELogAppender log4j.logger=ERROR, A1 ... log4j.logger.org.apache.wicket=WARN, A1 ...Above shows that I've replaced the original ConsoleAppender - the default appender which GAE uses, with the new GAELogAppender. This allowing all Log4j statements to go through this instead of the console.
.level = INFO chesspresso.server.log.GAELogAppender=FINEST ...As you can see, I've added the GAELogAppender here to allow all severities to be filtered through. This means that anything that hits our new appender will reach the GAE logging system, as long as our log4j.properties will allow it to filter through.
@java -cp "%~dp0\..\lib\appengine-tools-api.jar" ^
com.google.appengine.tools.KickStart ^
--jvm_flag=-javaagent:%REBEL_HOME%\jrebel.jar --jvm_flag=-noverify ^
com.google.appengine.tools.development.DevAppServerMain %*
-javaagent:/opt/jrebel/jrebel.jar -noverifyAgain, make sure this points to your jrebel.jar location.
public class RequestWicketFilter extends WicketFilter
{
private static boolean requestMade = false;
private static boolean initialized = false;
private static FilterConfig fConf;
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException
{
if (!requestMade)
requestMade = true;
init(fConf);
super.doFilter(req, res, chain);
}
@Override
public void init(FilterConfig fC) throws ServletException
{
if (fConf == null)
fConf = fC;
if (requestMade && !initialized)
{
super.init(fConf);
initialized = true;
}
}
}
Copyright © 2010 Android Island