Solved

Java mail agent thowing exception

Posted on 2004-08-11
8
297 Views
Last Modified: 2013-11-16
Hi,

I have a problem with a mail agent written in java. It is used for sending mails for pending items.  The agent is scheduled for every 15 minutes. The number of  pending records are between 50-120 per day.  The code was working fine in the production server for 3 months. But one month back it started throwing "lotus.domino.notes exception" and the application hangs every two days. From the log I couldn't get more details of the error.

My code is pasted below, where've I gone wrong? Could anyone help me.?

Thanks in advance


Joj





import lotus.domino.*;

public class JavaAgent extends AgentBase {

      public void NotesMain() {

            try {
                  Session vNotesSession = getSession();
                  AgentContext vNotesAgentContext = vNotesSession.getAgentContext();

                  Document vNotesDocument;
                      DateTime now = null;
                  boolean bSent = false;
                  String sErrorMessage = "";
                  now = vNotesSession.createDateTime("today");
                  now.setNow();
                  Database vNotesDatabase = vNotesAgentContext.getCurrentDatabase();
                  View vNotesView = vNotesDatabase.getView( "ScheduleMailForPending" );
                  View vSettingsView = vNotesDatabase.getView("AppSetting");
                  sleep(1000);
                  vSettingsView.refresh();
                  vNotesView.refresh();
                  
                  Document vSettingDoc = vSettingsView.getFirstDocument();
                  
                  String sSupervisor = null;
                  int sPendingHrs = 0;
                  int sUnattendHr = 0;
                  boolean stopMail = false ;
      
                  String     status = null;
                  String statusFlag = null;
            
                  if (vSettingDoc != null) {
                          sSupervisor = vSettingDoc.getItemValueString("SetupSupervisor");
                          String sUnattendHrs = vSettingDoc.getItemValueString("SetupUnattended");
                          String sPendingHr = vSettingDoc.getItemValueString("SetupPending");
                        if (sPendingHr != null)
                              sPendingHrs = Integer.parseInt(sPendingHr.trim());
                          String stopM = vSettingDoc.getItemValueString("SetupStopMail");
                         boolean sm   =  (stopM != null && stopM.equals("false") );
            
                          if (sm && sPendingHrs != 0 && sSupervisor != null)
                            stopMail = true;
                  } else {
                        stopMail = false;
                  }
                  //loop through all the documents in the All view and mail them and then remove them
                  vNotesDocument = vNotesView.getFirstDocument();
                  Item tempItem = null;
                  int noOfHours = 0;
                  DateTime tempDate = null;
                   String ticketNo = null;
                  int counter = 1;

                  while ( stopMail && vNotesDocument != null) {
                          status = vNotesDocument.getItemValueString("Status");
                          ticketNo = vNotesDocument.getItemValueString("LogCallTicketNo");
                          Document vDominoDocument = null;
                      try {                            
                              tempItem = vNotesDocument.getFirstItem("AttendDate");
                              tempDate = tempItem.getDateTimeValue();
                              noOfHours = now.timeDifference(tempDate);
                              if (noOfHours > 0 && (noOfHours/3600) >= sPendingHrs) {
                                      vDominoDocument = vNotesDatabase.createDocument();
                                      vDominoDocument.replaceItemValue("Subject", "HelpDesk Application : Pending Calls");
                                      vDominoDocument.replaceItemValue("Body", "This mail has been originated by Helpdesk Application. Call is pending for more than " + sPendingHrs + " Hours \n Ticket Numer is " + ticketNo);
                                      vDominoDocument.send(false, sSupervisor);
                                      bSent = true;
                              } else {
                                      bSent = false;
                              }
                      } catch (Exception ex) {
                              bSent = false;
                              System.out.println("Exception " + ex.getMessage());
                      } finally {
                              //Complete fields on the mail document.
                              if ( bSent ) {
                                      vNotesDocument.replaceItemValue("StatusFlag", "Escalated");
                                      vNotesDocument.replaceItemValue("EscalatedStatus", "None");
                                      vNotesDocument.replaceItemValue("MessageStatus", now  + " : Message Sent Ok!");
                                      vNotesDocument.save ( true, false, false );
                              }
                      } //try inside while loop                          
                          ++counter;
                      vNotesDocument = vNotesView.getNthDocument( counter );
                  } //while loop
            } catch(Exception e) {
                  e.printStackTrace();
            }
      }
}
0
Comment
Question by:joj_123
8 Comments
 

Author Comment

by:joj_123
ID: 11771583
If  I change the frequency to 5mins the application hangs every day. Is it because I've missed out "vnotesDocument.recycle()" method after ".save " method in the finally block?

0
 
LVL 46

Expert Comment

by:Sjef Bosman
ID: 11771912
You say several things:
1. the agent used to work (3 months production, no problems)
2. now, the agent comes with errors in the log
3. somehow, you assume it's your code

I think that thinking #3 is jumping to conclusions, but only if you haven't touched the agent in the meantime, of course. Let's do this step by step:
1. what caused the sudden change in the agent's execution, why are there errors?

When you know this, we'll have a clear picture if it has always been your agent or that there might be something else in the environment that caused the problem. It is more than likely that there was an upgrade of the server or some other change in the server's configuration.
0
 
LVL 46

Accepted Solution

by:
Sjef Bosman earned 25 total points
ID: 11771962
By the way, are documents automatically removed from the view ScheduleMailForPending when mail is sent out? I strongly advise you NOT to use GetNthDocument in this case, but do the following:
               vNotesDocument = vNotesView.getFirstDocument();
               while ( stopMail && vNotesDocument != null) {
                   vNextDocument= vNotesView.getNextDocument(vNotesDocument);
... // your processing
                   vNotesDocument= vNextDocument
               }

This way, you'll get the next document BEFORE it is removed from the view.
0
 
LVL 24

Assisted Solution

by:HemanthaKumar
HemanthaKumar earned 50 total points
ID: 11773012
I had similar problem like this (but different error about memory leak) with scheduled java agents.. and soln --- you have to recycle notes objects when done to avoid any memory leaks...

This will improve performance and avoid any errors like this one.

~Hemanth

0
How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

 
LVL 31

Assisted Solution

by:qwaletee
qwaletee earned 50 total points
ID: 11773669
Yes, you do have to recycle, but usually, if you don't, it is the SERVER that will eventually run out of heap, not just your agent.  Recycle tells the underlying core C API program (DLL's) that it no longer needs to hold onto the memory used by the Java program, becaause JNI sucks in managing that.

I've found that you have to be careful of the exact order you recycle.  If you process docs in a loop, and use one doc to get the next doc, then you need to get the second before recylcing teh first, which means you need two variables (current doc, next doc, then recycle current, then get next).
0
 

Author Comment

by:joj_123
ID: 11781115
Thanks a lot everybody. Just after posting the question I came across two useful links which illustrates the importance of the recycle method.(infact we were using the recycle method everywhere in the code, but missed out in this particular agent)

The links are,

http://www-10.lotus.com/ldd/sandbox.nsf/ecc552f1ab6e46e4852568a90055c4cd/afc77a0cb5e49e3a85256a76006b5183/$FILE/JMP106.pdf    (page 20-26)

http://www-1.ibm.com/support/docview.wss?rs=203&uid=swg21097861&loc=en_US&cs=utf-8&lang=en

I've added the recycle method in the agent and awaiting its result.




0
 
LVL 46

Expert Comment

by:Sjef Bosman
ID: 12367477
I'd love to learn what the real solution was to the problem...
0
 

Author Comment

by:joj_123
ID: 12368987
Sorry, I made a mistake while selecting the answers. Assisted answers are supposed to be the accepted ones and vice versa.

The recycle method worked. I had added a method to my controller servlet, which was accessed by everypage, on which I left the session without recycling.

Thanks everybody, for your help.







0

Featured Post

What Security Threats Are You Missing?

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

Join & Write a Comment

Suggested Solutions

For users on the Lotus Notes 8 Standard client, this article provides information on checking the Java Heap size and adjusting it to half of your system RAM in attempt to get the Lotus Notes 8.x Standard client to run faster.  I've had to exercise t…
For beginners of Lotus Notes user this is important to know about the types of files and their location supported by IBM Notes. Mostly users are unaware about how many file types are created and what their usages are. This Article is fully dedicated…
Sending a Secure fax is easy with eFax Corporate (http://www.enterprise.efax.com). First, Just open a new email message.  In the To field, type your recipient's fax number @efaxsend.com. You can even send a secure international fax — just include t…
Internet Business Fax to Email Made Easy - With eFax Corporate (http://www.enterprise.efax.com), you'll receive a dedicated online fax number, which is used the same way as a typical analog fax number. You'll receive secure faxes in your email, fr…

707 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now