Weblogic Integration JPD运行问题

环境Weblogic 8.1 + JDK 1.4

 

业务:从数据库中取出需要发送邮件的数据(sendFlag = 'N'),逐条发送邮件,发送完毕后,更新数据库中的标志(sendFlag = 'Y'),大概代码如下:

  1. package processes.YYYYYMail; 
  2. import com.bea.jpd.JpdContext;
  3. import com.bea.data.RawData;
  4. import com.bea.xml.XmlObject;
  5. import java.text.SimpleDateFormat;
  6. import java.util.ArrayList;
  7. import java.util.Date;
  8. import java.util.HashMap;
  9. import processes.EPSendErrorMail;
  10. /**
  11.  * @jpd:process process::
  12.  * <process name="YYYYYMail">
  13.  *   <onException name="OnException">
  14.  *     <perform name="onException" method="onException"/>
  15.  *   </onException>
  16.  *   <clientRequest name="Subscription" method="subscription"/>
  17.  *   <perform name="perform" method="perform"/>
  18.  * </process>::
  19.  * @jpd:xquery prologue::
  20.  */
  21. public class YYYYYMail implements com.bea.jpd.ProcessDefinition
  22. {
  23.     static final long serialVersionUID = 1L;
  24.     
  25.     public Callback callback;
  26.     
  27.     /*
  28.      * The area above this comment contains Variable Declarations created from the Design View.
  29.      * The area below this comment contains Control Declarations created from the Design View.
  30.      * 
  31.      * Code in these areas is generated automatically.
  32.      * 
  33.      * 2-Way editing is fully supported in these areas of code.
  34.      * Warning: changing Process Variables and Control Declarations already in use by your application
  35.      * may generate errors in your application if you do not update these declarations
  36.      * in all locations where they are used.
  37.      */
  38.     /**
  39.      * @common:control
  40.      */
  41.     private processes.YYYYYMail.DBControl dbControl;
  42.     
  43.     /**
  44.      * @common:control
  45.      */
  46.     private processes.YYYYYMail.MailControl mailCrontrol;
  47.     /**
  48.      * @common:context
  49.      */
  50.     JpdContext context; //(..control insertion marker - do not modify this line) 
  51.     
  52.     /*
  53.      * The area below this comment contains java methods referenced by communication nodes in the Process Language.
  54.      *
  55.      * Code in this area is generated automatically.
  56.      *
  57.      * 2-Way editing is partially supported in this area of code.
  58.      * Warning: you can safely add code inside a method body but it must be outside of any PROTECTED SECTION
  59.      * block comments. Modifications to code within these comments will prevent you from viewing information
  60.      * in the Design View builder that generated this code.
  61.      */
  62.     
  63.     /**
  64.      * @jpd:mb-static-subscription message-body="{x0}" channel-name="/XXXX/YYYYYMailTimerChannel"
  65.      */
  66.     public void subscription(java.lang.String x0)
  67.     {
  68.         //#START: CODE GENERATED - PROTECTED SECTION - you can safely add code above this comment in this method. #// 
  69.         // input transform 
  70.         // parameter assignment 
  71.         //#END  : CODE GENERATED - PROTECTED SECTION - you can safely add code below this comment in this method. #// 
  72.     }
  73.     public interface Callback //(..region end marker - do not modify this line) 
  74.     {
  75.     }
  76.     
  77.     /*
  78.      * Code inserted below this comment is for methods corresponding to Perform or Condition nodes
  79.      * created in the Design View.
  80.      *
  81.      * Feel free to make modifications or add new code here.
  82.      */
  83.     
  84.     public void perform() throws Exception
  85.     {      
  86.         HashMap[] hmMailList = this.dbControl.getMailData();
  87.         
  88.         if(hmMailList == null || hmMailList.length == 0){
  89.             return;
  90.         }     
  91.         this.log("Mail count", hmMailList.length + "");
  92.         
  93.         String YYYYYMailTo = dbControl.getParaValue(); 
  94.         ArrayList mailTo = new ArrayList();
  95.         mailTo.add(YYYYYMailTo);
  96.         
  97.         Mail mail = new Mail();
  98.         
  99.         for(int i = 0; i < hmMailList.length; i ++){
  100.             
  101.             String mailSubject = formatObject(hmMailList[i].get("CREATE_DATETIME")) + "";
  102.             StringBuffer mailBody = new StringBuffer();
  103.                         //........................... 
  104.             mailBody.append("建立人员:" + formatObject(hmMailList[i].get("CREATE_USER")));
  105.             this.log((i + 1) + " mailSubject", mailSubject);        
  106.             this.log((i + 1) + " mailBody", mailBody.toString());
  107.             
  108.             mail.sendMultiMail(mailTo, mailSubject,  mailBody.toString());
  109.           
  110.             dbControl.updateSendFlag(formatObject(hmMailList[i].get("SEQ_NO")));
  111.         }       
  112.     }
  113.     
  114.     private void log(String item, String value){
  115.         SimpleDateFormat sdf = new SimpleDateFormat("[yyyy-MM-dd HH:mm:ss]");
  116.         StringBuffer sb = new StringBuffer();
  117.         sb.append(sdf.format(new Date()))
  118.         .append("[XXXX][" + item + "=" + value + "]");
  119.         System.out.println(sb.toString()); 
  120.     }
  121.     
  122.     private String formatObject(Object o){
  123.         if(o == null){
  124.             return "";
  125.         }
  126.         return ((String)o).trim();
  127.     }
  128.     public void onException() throws Exception
  129.     {
  130.         //出错时,则发送Email 
  131.         new EPSendErrorMail().sendErrorMail(context);
  132.     }

打包后发布到 Weblogic Integration上,配置该JPD每2 second运行一次;

在数据库中准备好两条记录(即需要发送两封Mail)

 

问题现象:

发送发出了三封邮件,其中要两封是一样的。

 

问题分析:

调试发现,因该JPD每2s运行一次,在上一次运行还没有结束的时候,下一次已经开始运行,结果导致后面一次运行取到的数据是上一次运行准备处理的数据,于是就出现了重复的邮件;

 

简单解决方法:

将运行时间间隔加长,确保每次运行时,上一次已经结束。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值