2015-06-25 114 views
0

這是SAP PI的要求,如何保存使用Java

  • 源系統數據庫中的線程實例:XY_Client
  • 中間件:PI系統
  • 目標系統:SAP

的將XML文件接收到PI系統,爲每個XML文件生成一個內部文件以跟蹤store_number和xml文件的數量。

工作原理:假設XML_FILE_1達到PI,創建了名爲sequence_gen的內部文件。該文件包含如果XML_FILE_2達到P1,第二時間存在於XML文件和計數店號將被初始化爲1。 所以首次

sequence_gen file contains Store: 1001 Count:1
(一段時間間隔之後),

sequence_gen file contains Store: 1001 Count:2 依此類推。

我的問題是:如果'n'個文件同時到達PI系統,第一個文件將鎖定sequence_gen文件。那麼第二個文件如何將值更新到sequence_gen文件?那麼如何解決這個問題呢?

我想爲每個調用創建一個線程實例並將其存儲在數據庫中。並檢索每個實例,執行函數,將結果返回給xml調用並刪除該實例。是否有可能?如何前進呢?

+0

究竟是什麼問題?據我瞭解,在文件1完成處理之後,系統將簡單地轉向file2(或者同時發生的任何事情)。這是異步處理和鎖定的基礎。 – Buurman

+0

@ Buurman-假設如果100個文件同時出現't0'..所有100個文件將嘗試訪問sequence_gen文件。所以不會移動到鎖定狀態?將更新值保留在sequence_gen文件中? – madhu

+0

我對你使用的具體應用程序一無所知,所以我不能評論他們的行爲,但是: 一般來說,如果你有一些對象/序列/無論什麼是線程安全的,那麼是的,它會鎖定修改和它會在修改成功後解鎖。然後它將包含新狀態,並且下一個文件到來,並可以按照序列的新狀態繼續處理。這是基本的併發性。 你真的試過你的方案,看看它是否正確嗎? – Buurman

回答

0

而不是跟蹤鎖定和解鎖文件的所有線程,您可以有一個負責更改它的線程。讓每個線程發出一個請求,將該文件更改爲併發隊列,然後通知Sequence_Gen線程寫入其自己的文件。從本質上說:

Sequence_Gen螺紋:

@Override 
public synchronized void Run(){ 
    while(true){ //Some condition 
     while(queue.isEmpty()) { 
      this.wait(); 

     } 
     Object obj = queue.pop(); 
     //Open file 
     file.write(obj); 
     //Close file 
    } 
} 

然後,在任何其他線程,只是排隊,並通知有東西可寫。

public synchronized void AddItem(Object item) { 
    queue.put(item); 
    this.notifyAll(); 
}