作者sthermit ( )
看板java
標題[問題] 請問關於多thread共用session
時間Wed Mar 18 17:02:45 2015
小弟在公司接了一個前輩寫的code(前輩已經離職)
功能是利用Jsmpp的libery實做發送SMS功能
因為對Thread算是半懂,沒有真正去深究過
就這樣接著之前的寫法用下去
最近發生一些問題,不過因為沒有找到真的可以確定的答案,上來求助各位高手
問題:在程式執行的過程,發現這個程式會建立多個session連線
程式內容:
宣告全域變數
SMPPSession smppSession = new SMPPSession();
private ArrayList<msgStatus> qryMsg= new ArrayList<msgStatus>();
使用 ExecutorService
對每個簡訊建立發送的thread,放至pool中,去發送並且將資料寫入List
在內部寫 private class extends Thread 去追蹤發出去的簡訊之後的狀態
整個結構是
public class A {
SMPPSession smppSession = new SMPPSession();
private ArrayList<msgStatus> qryMsg= new ArrayList<msgStatus>();
public static void main(){
Thread t = new
t.start
for(......){
execService.execute(newSendTask(tmm));
}
}
public class B extends Thread{
查詢在qryMsg中簡訊的狀態
}
private Runnable newSendTask(final msgStatus msg) {
return new Runnable() {.....發送簡訊並且將資料放至qryMsg中};
}
}
所有的過程都使用同樣smppsession
不清楚為什麼會有多個連線的問題
有在猜是不是在new SendTask的時候,會自己獨立一個連線的session?
這樣的話是不是把smppsession設為 static靜態變數就可以避免多個session連線的問題?
麻煩各位版友解惑
非常感謝
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 211.22.92.217
※ 文章網址: https://www.ptt.cc/bbs/java/M.1426669368.A.F01.html
→ cyclone350: 我想... 如果你只是把 class A 的 smppsession 設為 03/18 19:25
→ cyclone350: static 靜態變數,應該是不能解決問題的。 03/18 19:25
推 haha02: 所以症狀是會重複發送簡訊嗎還?你看起來是多條Thread共 03/18 21:49
→ haha02: 用ArrayList 他不是Thread-safe 03/18 21:49
Array List 共用沒錯,運行中一放一取的過程沒有問題
現在是發送與查詢會與一個服務中心作連線
這個連線預計是設定成全部都透過smppSession 去進行
如果是這樣應該是會只有1個Session的連接
可是最近發現到的是說,會建立2個,甚至3個以上連線
因為服務中心的連線數有限制,超過連線數會因為無法連線
產生無法送出的Exception
這是不太正常的狀況
※ 編輯: sthermit (211.22.92.217), 03/19/2015 09:42:20
→ ssccg: 如果你確定每次用smppSession都是用同一個物件 03/19 09:47
→ ssccg: 那就是SMPPSession裡面其實會自己生多個connection了吧 03/19 09:48