From ef73b0e67ad4f5238417a60ec41176c1a6095b8d Mon Sep 17 00:00:00 2001 From: Bryan Duxbury Date: Wed, 17 Jun 2009 16:43:25 +0000 Subject: [PATCH] THRIFT-378. java: Java servers do not turn internal errors into thrift exceptions This patch causes Java servers to log internal server errors and return an INTERNAL_ERROR exception instead of just closing the connection. Author: Jonathan Ellis git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@785713 13f79535-47bb-0310-9956-ffa450edef68 --- compiler/cpp/src/generate/t_java_generator.cc | 18 ++++++++++++++++-- .../apache/thrift/TApplicationException.java | 1 + 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/compiler/cpp/src/generate/t_java_generator.cc b/compiler/cpp/src/generate/t_java_generator.cc index 419053d8..2d1381c4 100644 --- a/compiler/cpp/src/generate/t_java_generator.cc +++ b/compiler/cpp/src/generate/t_java_generator.cc @@ -279,7 +279,8 @@ string t_java_generator::java_type_imports() { "import java.util.HashMap;\n" + "import java.util.Set;\n" + "import java.util.HashSet;\n" + - "import java.util.Collections;\n\n"; + "import java.util.Collections;\n" + + "import org.apache.log4j.Logger;\n\n"; } /** @@ -1940,6 +1941,8 @@ void t_java_generator::generate_service_server(t_service* tservice) { "public static class Processor" << extends_processor << " implements TProcessor {" << endl; indent_up(); + indent(f_service_) << "private static final Logger LOGGER = Logger.getLogger(Processor.class.getName());" << endl; + indent(f_service_) << "public Processor(Iface iface)" << endl; scope_up(f_service_); @@ -2128,7 +2131,18 @@ void t_java_generator::generate_process_function(t_service* tservice, f_service_ << "}"; } } - f_service_ << endl; + f_service_ << " catch (Throwable th) {" << endl; + indent_up(); + f_service_ << + indent() << "LOGGER.error(\"Internal error processing " << tfunction->get_name() << "\", th);" << endl << + indent() << "TApplicationException x = new TApplicationException(TApplicationException.INTERNAL_ERROR, \"Internal error processing " << tfunction->get_name() << "\");" << endl << + indent() << "oprot.writeMessageBegin(new TMessage(\"" << tfunction->get_name() << "\", TMessageType.EXCEPTION, seqid));" << endl << + indent() << "x.write(oprot);" << endl << + indent() << "oprot.writeMessageEnd();" << endl << + indent() << "oprot.getTransport().flush();" << endl << + indent() << "return;" << endl; + indent_down(); + f_service_ << indent() << "}" << endl; } // Shortcut out here for oneway functions diff --git a/lib/java/src/org/apache/thrift/TApplicationException.java b/lib/java/src/org/apache/thrift/TApplicationException.java index a85e3705..f8403923 100644 --- a/lib/java/src/org/apache/thrift/TApplicationException.java +++ b/lib/java/src/org/apache/thrift/TApplicationException.java @@ -43,6 +43,7 @@ public class TApplicationException extends TException { public static final int WRONG_METHOD_NAME = 3; public static final int BAD_SEQUENCE_ID = 4; public static final int MISSING_RESULT = 5; + public static final int INTERNAL_ERROR = 6; protected int type_ = UNKNOWN; -- 2.17.1