Jeg har lavet en application til at modtager og sender SMS-er. Den kan køre i ca. 24 tmer og senere hen få jeg fejlen. Denne application kan modtage en SMS behendler den og sender den til afsenderen. Den kan håndtere tingene med databasen og sender de updaterede SMS-er til afsenderen. Applicationen fungerer som det skal men problemet er at den kan ikke kører i lang tid.
Det hjælper selvfølgelig men i det her tilfælde lækker vi hukommelse så det ville bare skubbe tiden indtil fejlen. Tak for forslaget. Hvis nogen eventuelt kender en applikation til nemt at kigge på memory inden i JVM-en kunne det være interessant.
Ja , den bruges. Har en klasse som implementere en interfaces. En klasse som skal læse en SMS ud fra en modem, hvis den er ankomt skal implementeres en -IInboundMessageNotification-. Når der er en message så skal den håndteres og sendes tilbage til afsenderen. Der bruges kun en Gateway(en port). Skal ikke bruges flere ports. (NBS. Jeg er en nyuddannet Data Matiker og er lige startet på en arbejde).
Grundet jeg siger at jeg er en nyuddanet er at jeg kommer måske ikke til at fastår helt en avanceret løsning eller en spørgsmol som går dybere ind i systemet. Har brug for forklaring i forvejen.
Den har ikke lengere problemmer med memoryError eller programet kan ikke køre i så lang tid. Fejlen er ved -DeadLock-. Her er error message: Found one Java-level deadlock: ============================= "Thread-13": waiting to lock monitor 0x02aa13bc (object 0x22eb9330, a java.util.ArrayList), which is held by "Thread-0" "Thread-0": waiting to lock monitor 0x02eead7c (object 0x22eb9468, a java.lang.Object), which is held by "Thread-13"
Java stack information for the threads listed above: =================================================== "Thread-13": at org.smslib.Service.readMessages(Service.java:290) - waiting to lock <0x22eb9330> (a java.util.ArrayList) at com.ioc.ReadSmsApp$InboundNotification.process(ReadSmsApp.java:153) at org.smslib.modem.AModemDriver$AsyncNotifier.run(AModemDriver.java:686) - locked <0x22eb9468> (a java.lang.Object) "Thread-0": at org.smslib.modem.AModemDriver.disconnect(AModemDriver.java:162) - waiting to lock <0x22eb9468> (a java.lang.Object) at org.smslib.modem.ModemGateway.stopGateway(ModemGateway.java:88) at org.smslib.Service$WatchDog.run(Service.java:972) - locked <0x22eb9330> (a java.util.ArrayList)
Found 1 deadlock. Herfra er koden som jeg er i gang med: READ MESSAGE:
import java.util.*; import org.smslib.*; import org.smslib.modem.*; /** * ReadSmsApp reads messages that has been notified and reads with help of Inner classes * and save them to the msgList * @author SD * */
public class ReadSmsApp { List<Object> msgList; Service srv; SerialModemGateway gateway; SendSmsApp sSmsApp = new SendSmsApp(srv, gateway);
SMS messageFromCustomer = new SMS(); SMS updatedMessage; DBConnection dbCon = new DBConnection(); DbHandler dbHandler = new DbHandler(dbCon); /** * Constructor for SMS reading which have an Service and SerialModemGateway as parameters * @param srv * @param gateway */ public ReadSmsApp(Service srv, SerialModemGateway gateway) { this.srv = srv; this.gateway = gateway; }
public void readSms() throws Exception {
try { msgList = new ArrayList<Object>(); srv.readMessages(msgList, MessageClasses.ALL); if(!msgList.isEmpty()) { for(int i = 0; i < msgList.size(); i++) { InboundMessage msg = (InboundMessage) msgList.get(i); srv.deleteMessage(msg); String commandoAndGroup = msg.getText(); StringTokenizer tok = new StringTokenizer(commandoAndGroup, " "); String commando = ""; String group = ""; String originator = msg.getOriginator(); if(originator.length() == 11 && originator.substring(0, 3).equals("+45")) { System.out.println("SMS received from : " + originator); String tlfNr = originator.substring(3); boolean isMobail = dbHandler.mobailIsNotInDB(tlfNr); System.out.println("Phone in database = " + isMobail);
if(isMobail) { while(tok.hasMoreTokens()) { Date date = msg.getDate(); commando = tok.nextToken();
if(commando.equalsIgnoreCase("Tænd") || commando.equalsIgnoreCase("Sluk")) { group = tok.nextToken(); if(!group.equalsIgnoreCase("AIRCON")||!group.equalsIgnoreCase("ELVARME")|| !group.equalsIgnoreCase("INDELYS")||!group.equalsIgnoreCase("STROM")|| !group.equalsIgnoreCase("VANDVARMER")||!group.equalsIgnoreCase("UDELYS")|| !group.equalsIgnoreCase("TYVERIALARM")||!group.equalsIgnoreCase("BRANDALARM")) { System.out.println("Unknown group in SMS: " + msg.toString()); // srv.deleteMessage(msg); break; } else { messageFromCustomer.setMobailNr(tlfNr); messageFromCustomer.setTimeStamp(date); messageFromCustomer.setCommand(commando); messageFromCustomer.setGroup(group); updatedMessage = dbHandler.smsUpdateCommandInfo(messageFromCustomer); System.out.println("UPDATED MESSAGE FOR TÆND ELLER SLUK: \r\n" + updatedMessage); sSmsApp.sendSms(updatedMessage); }
public SerialModemGateway getGateway() { return this.gateway; } /** * Inner class that notify the unread messages read it and save it to the msgList * @author SD */ public class InboundNotification implements IInboundMessageNotification { public void process(String gatewayId, MessageTypes msgType, String memLoc, int memIndex) { List msgList; if (msgType == MessageTypes.INBOUND) { System.out.println(">>> New Inbound message detected from Gateway: " + gatewayId + " : " + memLoc + " @ " + memIndex); try {
// Read... msgList = new ArrayList<Object>(); srv.readMessages(msgList, MessageClasses.ALL, gatewayId); for (int i = 0; i < msgList.size(); i++) System.out.println(msgList.get(i)); // ...and reply. //for (int i = 0; i < msgList.size(); i ++) //{ // InboundMessage msg = (InboundMessage) msgList.get(i); // srv.sendMessage(new OutboundMessage(msg.getOriginator(), "Got it!"), gatewayId); //} } catch (Exception e) { System.out.println("Oops, some bad happened..."); e.printStackTrace(); } } else if (msgType == MessageTypes.STATUSREPORT) { System.out.println(">>> New Status Report message detected from Gateway: " + gatewayId + " : " + memLoc + " @ " + memIndex); }
} } /** * This method returns a list of inbounds messages * @return msgList */ public List<Object> getMessageList() { return this.msgList; } }
SEND MESSAGE package com.ioc;
/** *This class is responsible for sending the messages to customers. */
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.