Date: Fri, 24 Jun 2005 16:51:41 +0300 (EEST) From: Achilleus Mantzios <achill@matrix.gatewaynet.com> To: freebsd-java@freebsd.org Subject: Re: Wierd problem in linux 2.4.18-bf2.4, Java Blackdown-1.4.2-rc1 Message-ID: <Pine.LNX.4.44.0506241648130.12712-100000@matrix.gatewaynet.com> In-Reply-To: <Pine.LNX.4.44.0506241323320.12515-100000@matrix.gatewaynet.com>
next in thread | previous in thread | raw e-mail | index | archive | help
O Achilleus Mantzios έγραψε στις Jun 24, 2005 : > Ok its linux a problem, but i think it would be interesting to you. > > 1st off, this problem does not occur in FreeBSD 5.4-STABLE, > with java 1.4.2p7. (Kudos to FreeBSD java team!!!) > > The situation is as follows: > > >From a jsp i call > > java.lang.Process proc = > Runtime.getRuntime().exec("/usr/local/sbin/uucico_command"); > proc.waitFor(); > > /usr/local/sbin/uucico_command has as follows: > ------------------------------------------------------------ > #!/bin/sh > /bin/rm -f /var/lock/LCK..ttyS* > /usr/local/var/lib/pgsql/dbmirror/AsyncMirrorWithSpecialTables.pl > /usr/local/var/lib/pgsql/dbmirror/OFFICE.conf > /usr/local/sbin/gpsavg > epochsecs=`date +'%s'` > pushd /usr/local/var/XML_TO_OFFICE/ > tar cfj As_AND_Ds_$epochsecs.tar.bz2 A*.xml D*.xml > \rm -f A*.xml D*.xml > popd > /usr/bin/bzip2 /usr/local/var/XML_TO_OFFICE/* > export PGUSER=postgres > export PGPASSWORD="" > vessel_name=`/usr/local/pgsql/bin/psql -A -q -t -h localhost dynacom -c > "select replace(lower(name),' ','_') from vessels limit 1"` > VESSEL_NAME=`/usr/local/pgsql/bin/psql -A -q -t -h localhost dynacom -c > "select replace(name,' ','_') from vessels limit 1"` > uucp -r /usr/local/var/XML_TO_OFFICE/*.bz2 > uucphub\!/usr/local/var/XML_FROM_VESSELS/$VESSEL_NAME/. > /bin/rm -fr /usr/local/var/XML_TO_OFFICE/* > /bin/rm -fr /var/spool/uucppublic/outbound > /dev/null 2>&1 > /bin/rm -fr /var/spool/uucppublic/inbound > /dev/null 2>&1 > outbound=`/usr/bin/wc -c /var/spool/uucp/uucphub/D./* 2>/dev/null | tail > -1 | awk '{print $1}'` > outbound=${outbound:=0} > echo $outbound > /var/spool/uucppublic/outbound 2>/dev/null > uucp -r -g 0 /var/spool/uucppublic/outbound > uucphub\!/var/spool/uucppublic/$vessel_name.inbound > \rm -fr /var/spool/uucp/.Status/uucphub > uucp_acct_id=`/usr/local/sbin/dyna_psql $outbound 2>/dev/null` > /usr/local/sbin/dyna_log_uucp_acct_update $uucp_acct_id > uucico -x 4 -f -s uucphub > uucpsc=`/bin/cat /var/spool/uucp/.Status/uucphub | /usr/bin/awk '{print > $1}'` > uucpsc=${uucpsc:=99} > #logger -p uucp.info "NOTICE!!! acctid="$uucp_acct_id "uucpsc="$uucpsc > /usr/local/j2sdk1.4.2/bin/java -cp > "/usr/local/jboss-3.0.3/server/default/SMA_UUCP.jar:/usr/local/pgsql/share/java/postgresql.jar:/usr/local/jboss-3.0.3/client/log4j.jar" > com.gatewaynet.uucp.LogUUCPAcct $uucp_acct_id $uucpsc > /usr/local/j2sdk1.4.2/bin/java -cp > "/usr/local/jboss-3.0.3/server/default/SMA_UUCP.jar:/usr/local/pgsql/share/java/postgresql.jar:/usr/local/jboss-3.0.3/client/log4j.jar:/usr/local/jboss-3.0.3/server/default/lib/activation.jar:/usr/local/jboss-3.0.3/server/default/lib/mail.jar" > com.gatewaynet.uucp.SendCollected > pushd /usr/local/var/XML_FROM_OFFICE/ > for ASDS in As_AND_Ds*.tar.bz2; do tar xfj $ASDS; rm -f $ASDS; done > popd > /usr/bin/bunzip2 /usr/local/var/XML_FROM_OFFICE/*.bz2 > ############################################ > ### The command below is the problematic one > ############################################ > /usr/local/jboss-3.0.3/server/default/readoff > /etc/cron.daily/compstatus & > ------------------------------------------------------------ > > now the problematic /usr/local/jboss-3.0.3/server/default/readoff has as > follows > ------------------------------------------------------------ > #!/bin/sh > export > CLASSPATH="/usr/local/jboss-3.0.3/server/default/SMA_PER.jar:/usr/local/jboss-3.0.3/server/default/xerces.jar:/usr/local/jboss-3.0.3/client/jbossall-client.jar:/usr/local/jboss-3.0.3/client/log4j.jar:/usr/local/pgsql/share/java/postgresql.jar" > > /usr/local/j2sdk1.4.2/bin/java > -Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl > com.gatewaynet.periodic.ReadXmlFromOffice > ------------------------------------------------------------ > > whereas ReadXmlFromOffice.java has as follows: > ------------------------------------------------------------ > /* > * Created on 19 Μαρ 2004, 11:55:47 πμ > * > */ > package com.gatewaynet.periodic; > > import java.io.File; > import java.io.FileOutputStream; > import java.io.PrintStream; > import java.sql.PreparedStatement; > import java.util.Arrays; > import java.util.Comparator; > > import org.w3c.dom.Node; > > > /** > * @author achill4 > * > * To change the template for this generated type comment go to > * Window>Preferences>Java>Code Generation>Code and Comments > */ > > public class ReadXmlFromOffice { > > private static String XMLFROMDIR = > "/usr/local/var/XML_FROM_OFFICE"; > private static String XMLTODIR = "/usr/local/var/XML_TO_OFFICE"; > > private static String FILEDIR = > "/usr/local/var/FILES_FROM_OFFICE"; > > static private org.apache.log4j.Logger logger = > org.apache.log4j.Logger.getLogger("dynacom.RXML"); > > /** > * > */ > public ReadXmlFromOffice() { > super(); > // TODO Auto-generated constructor stub > } > > public static void main(String[] args) { > java.sql.Connection con=null; > try { > javax.naming.InitialContext ic = new > javax.naming.InitialContext(); > Class.forName("org.postgresql.Driver"); > con = > java.sql.DriverManager.getConnection("jdbc:postgresql://localhost/dynacom","postgres",""); > con.setAutoCommit(false); > > PreparedStatement vslidst = > con.prepareStatement("select id from vessels limit 1"); > java.sql.ResultSet vslidrs = > vslidst.executeQuery(); > if (!vslidrs.next()) throw new Exception("No > vessel in database. Contact IT DEPT."); > int thisvesselvslid = vslidrs.getInt(1); > vslidrs.close(); > vslidst.close(); > con.commit(); > > javax.xml.parsers.DocumentBuilderFactory > builderFactory =javax.xml.parsers.DocumentBuilderFactory.newInstance(); > builderFactory.setValidating(false); > > javax.xml.parsers.DocumentBuilder builder > =builderFactory.newDocumentBuilder(); > builder.setErrorHandler(new > com.gatewaynet.web.util.xml.MyErrorHandler()); > > File xmldir = new File(XMLFROMDIR); > File[] xmlfiles = xmldir.listFiles(); > Arrays.sort(xmlfiles,new DirComparator()); > String[] xerrors = new String[xmlfiles.length]; > String lastdone=null; > int numxerrors=0; > int xmli; > for (xmli = 0; xmli < xmlfiles.length; xmli++) { > File xmlfile = xmlfiles[xmli]; > try { > String xmlfilename > =xmlfile.getName(); > if (!xmlfilename.endsWith(".xml") > && !xmlfilename.endsWith(".XML")) continue; > org.w3c.dom.Document document = > builder.parse(xmlfile); > org.w3c.dom.Element rootel = > document.getDocumentElement(); > org.w3c.dom.NamedNodeMap attrs = > rootel.getAttributes(); > String xidstr=null; > String vslidstr=null; > org.w3c.dom.Attr attr; > attr = (org.w3c.dom.Attr) > attrs.getNamedItem("xid"); > xidstr = attr.getValue(); > attr = (org.w3c.dom.Attr) > attrs.getNamedItem("vslid"); > vslidstr = attr.getValue(); > > org.w3c.dom.Node curnd; > > org.w3c.dom.NodeList nodes = > rootel.getChildNodes(); > > String appname=null; > String apptbl_tmp=null; > String gao=null; > String idstr=null; > String SQL=null; > String comment=null; > > String filename=null; > String file_base64=null; > > String unixcommand=null; > > for (int i = 0; i < > nodes.getLength(); i++) { > curnd = nodes.item(i); > if (curnd.getNodeType() == > org.w3c.dom.Node.ELEMENT_NODE) { > if > (((org.w3c.dom.Element) curnd).getTagName().equals("appname")) > appname = > ((org.w3c.dom.Text) curnd.getFirstChild()).getData(); > > if > (((org.w3c.dom.Element) curnd).getTagName().equals("apptbl_tmp")) > apptbl_tmp > = ((org.w3c.dom.Text) curnd.getFirstChild()).getData(); > > if > (((org.w3c.dom.Element) curnd).getTagName().equals("id")) > idstr = > ((org.w3c.dom.Text) curnd.getFirstChild()).getData(); > > if > (((org.w3c.dom.Element) curnd).getTagName().equals("gao")) > gao = > ((org.w3c.dom.Text) curnd.getFirstChild()).getData(); > > if > (((org.w3c.dom.Element) curnd).getTagName().equals("sql")) { > Node > sqlnode = curnd.getFirstChild(); > if > (sqlnode != null) SQL = ((org.w3c.dom.CDATASection) > curnd.getFirstChild()).getData(); > } > > if > (((org.w3c.dom.Element) curnd).getTagName().equals("comment")) { > Node > commentnode = curnd.getFirstChild(); > if > (commentnode != null) comment = ((org.w3c.dom.Text) > curnd.getFirstChild()).getData(); > } > /** > * file transfer > kai unix commands > */ > if > (((org.w3c.dom.Element) curnd).getTagName().equals("filename")) { > Node > filenamenode = curnd.getFirstChild(); > if > (filenamenode != null) filename = ((org.w3c.dom.Text) > curnd.getFirstChild()).getData(); > } > > if > (((org.w3c.dom.Element) curnd).getTagName().equals("filecontent")) { > Node > filecontentnode = curnd.getFirstChild(); > if > (filecontentnode != null) file_base64 = ((org.w3c.dom.CDATASection) > curnd.getFirstChild()).getData(); > } > > if > (((org.w3c.dom.Element) curnd).getTagName().equals("unixcommand")) { > Node > unixcommandnode = curnd.getFirstChild(); > if > (unixcommandnode != null) unixcommand = ((org.w3c.dom.CDATASection) > curnd.getFirstChild()).getData(); > } > > > } > } > > if (xidstr == null) throw new > Exception("xid is null"); > int xid = > Integer.parseInt(xidstr); > if (vslidstr == null) throw new > Exception("vslid is null"); > int vslid = > Integer.parseInt(vslidstr); > > if (gao == null) throw new > Exception("gao is null"); > if (vslid != thisvesselvslid && > !gao.equals("FLTRAN") && !gao.equals("UNXCOM")) throw new Exception("This > Transaction is for Another Vessel. Contact IT DEPT."); > > logger.info("Processing file > "+xmlfilename); > > if (gao.equals("ACKNOW")) { > PreparedStatement st = > con.prepareStatement("update xadmin set state='ARC' where xid=?"); > st.setInt(1,xid); > int rc = > st.executeUpdate(); > if (rc != 1) throw new > Exception("Error updating xadmin to ARC."); > st.close(); > } > else if (gao.equals("CANCEL")) { > PreparedStatement st = > con.prepareStatement("update xadmin set state='CAN',comment=? where > xid=?"); > st.setString(1,comment); > st.setInt(2,xid); > int rc = > st.executeUpdate(); > if (rc != 1) throw new > Exception("Error updating xadmin to ARC."); > st.close(); > } > else if (gao.equals("REPLIC")) { > logger.info("IN REPLIC for > file "+xmlfilename); > // EDW MAS ENDIAFEREI MONO > TO SQL. > java.sql.Statement st2 = > con.createStatement(); > logger.info("IN REPLIC > after createStatement for file "+xmlfilename); > if (SQL != null) > st2.execute(SQL); > logger.info("IN REPLIC > after execute for file "+xmlfilename); > st2.close(); > } > else if (gao.equals("FLTRAN")) { > if (filename == null) > throw new Exception("File name in file transfer cannot be null. Contact IT > DEPT."); > if (file_base64 == null) > throw new Exception("File content in file transfer cannot be null. Contact > IT DEPT."); > byte[] filecontent = > Base64.decode(file_base64.toCharArray()); > File outfile = new > File(FILEDIR+"/"+filename); > FileOutputStream fout = > new FileOutputStream(outfile); > fout.write(filecontent); > fout.close(); > } > else if (gao.equals("UNXCOM")) { > if (unixcommand == null) > throw new Exception("Command in unix command cannot be null. Contact IT > DEPT."); > // PROSOXH SE > size(unixcommands)/1024 > (getconf ARG_MAX) > Process proc = > Runtime.getRuntime().exec(new String[] {"sh","-c",unixcommand}); > > FileOutputStream fout = > new FileOutputStream(new > File(XMLTODIR+"/"+xmlfile.getName().replaceAll(".xml","")+".out")); > > PrintStream out = new > PrintStream(fout); > > java.io.InputStream > procout = proc.getInputStream(); > > > out.println("=============="); > out.println("Output (if > any)"); > > out.println("=============="); > > int c; > while ((c=procout.read()) > >=0) { > out.write(c); > > //System.out.write(c); > > //System.out.flush(); > } > > java.io.InputStream > procerr = proc.getErrorStream(); > > > out.println("=============="); > out.println("Error (if > any)"); > > out.println("==============="); > > while ((c=procerr.read()) > >=0) { > out.write(c); > > //System.out.write(c); > > //System.out.flush(); > } > > } > else throw new Exception("GAO > "+gao+" not supported. CONTACT IT DEPT."); > > con.commit(); > boolean isdeled = > xmlfile.delete(); > if (!isdeled) throw new > Exception("Error deleting file. Xaction Aborted."); > System.out.println("OK with file > "+xmlfile.getName()); > > lastdone=xmlfile.getName(); > > } > catch (Exception xmle) { > System.out.println("Error : > "+xmle.getMessage()+": with file "+xmlfile.getName()); > logger.error("Error : > "+xmle.getMessage()+": with file "+xmlfile.getName()); > //xmle.printStackTrace(); > con.rollback(); > > > xerrors[numxerrors++]="--------------------------"+"Error with > "+xmlfile.getName()+"--------------------------\n"+ > > xmle.getMessage()+"\n"+"---------------------------------------------------------------------"; > xmlfile.delete(); > } > } // end for > if (lastdone != null) { > FileOutputStream fout = new > FileOutputStream(new File(XMLTODIR+"/lastdone.mon")); > PrintStream out = new PrintStream(fout); > out.println("Last XML was "+lastdone); > } > if (numxerrors!=0) { > FileOutputStream fout = new > FileOutputStream(new File(XMLTODIR+"/xerror.mon")); > PrintStream out = new PrintStream(fout); > int run; > for (run=0;run<numxerrors;run++) { > out.println(xerrors[run]); > } > > } > } > catch (Exception pce) { > System.out.println("A General XML Error Occured: > "+pce.getMessage()); > logger.error("A General XML Error Occured: > "+pce.getMessage()); > } > finally { > if (con != null) try {con.close();} > catch(Exception fe){} > } > } > > } > > class DirComparator implements Comparator { > public DirComparator () { > } > > public int compare(Object obj, Object obj1) { > File f = (File) obj; > File f1 = (File) obj1; > String str = f.getName(); > String str1 = f1.getName(); > int i,i1; > //System.out.println("str="+str); > //System.out.println("str1="+str1); > if (str.charAt(0) < str1.charAt(0)) return -1; > else if (str.charAt(0) > str1.charAt(0)) return 1; > try { > i = Integer.parseInt(str.substring(1,str.indexOf('.'))); > //System.out.println("i="+i); > } > catch (Exception e) { > return 1; > } > try { > i1 = > Integer.parseInt(str1.substring(1,str1.indexOf('.'))); > //System.out.println("i1="+i1); > } > catch (Exception e) { > return -1; > } > if (i < i1 ) return -1; > else if (i==i1) return 0; > else return 1; > } > > public boolean equals(Object obj) { > return false; > } > } > > ------------------------------------------------------------ > > > Now the really wierd problem. > > When the /usr/local/jboss-3.0.3/server/default/readoff is run from > the shell it has never stalled, behaved strange or failed. > > Also when the /usr/local/sbin/uucico_command is run from the shell > it has never failed, or *caused* > /usr/local/jboss-3.0.3/server/default/readoff to stall. > > BUT, when i run /usr/local/sbin/uucico_command from the JSP, > then i experience a stall of the > /usr/local/jboss-3.0.3/server/default/readoff script, > and only if there are many (where many varies from > run to run, but generally more than lets say 10) xml files > to be processed in /usr/local/var/XML_FROM_OFFICE/. > > The java program in readoff processes *some* XML files, and then stalls > for no apparent reason. > > The solution was to replace > the last 2 lines > > /usr/local/jboss-3.0.3/server/default/readoff > /etc/cron.daily/compstatus & > > with > > echo /usr/local/bin/afteruucico | at now > > where /usr/local/bin/afteruucico is just > > #!/bin/sh > /usr/local/jboss-3.0.3/server/default/readoff > /etc/cron.daily/compstatus > > In other words, > i have a JSP calling a script, which calls another script which > executes a java program. > > The java programm does some processing and then sleeps for > no reason without finishing, without spitting out any Exceptions. > > When i magically "jump out" of the initial java environment (jboss/JSP), > with the *at* command, then the readoff script and its ReadXmlFromOffice > java programm all work fine. > > Any thoughts would be great. > > I checked ulimit,etc, with no apparent clue. > > This problem kinda haunted me last night, and i just > wanna kill it, instead of pretending i found a workaround. > > The only "excuse" i can think of, is that it runs in Linux, > which i am not extremely familiar with. > > If you need more feedback, or if any ambitious volunteer > wants to hunt this down, i am happy to help. > > P.S. > > The jboss dir in FreeBSD, is a morningly tbz from the linux > machine, so no tricks there. > > Problem track, the same happens if instead of /usr/local/jboss-3.0.3/server/default/readoff command ANY command produces fairly enuf large ammount of stdout,stderr. For instance if the bunzip command just before readoff produces large stderr (of the type "bunzip2: Output file foo already exists."), then bunzip2 stalls as well. -- -Achilleus
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.LNX.4.44.0506241648130.12712-100000>