Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

This is SAP PI requirement,

  • Source System: XY_Client
  • Middleware: PI System
  • Target system : SAP

The XML files are received to the PI system, for each XML file an internal file is generated to keep track of store_number, and count of xml files.

How it works: suppose if XML_FILE_1 reaches PI, internal file called sequence_gen is created. the file contains the store number present in XML file and count will be initialized to 1. so first time,

sequence_gen file contains Store: 1001 Count:1
(after some time interval)If XML_FILE_2 reaches PI, second time,

sequence_gen file contains Store: 1001 Count:2 and so on..

My question is : If 'n' number of files come at the same time to PI system, the 1st file will lock the sequence_gen file. so how will the 2nd file update the value to the sequence_gen file? So how to tackle this problem?

I thought of creating a thread instance for every call and storing it in a database. and retrieving each instance, performing function, returning result to the xml call and deleting that instance.. Is it possible? How to go forward on this?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
190 views
Welcome To Ask or Share your Answers For Others

1 Answer

Rather than keep track of all of the threads that are locking and unlocking the file, you could have a single thread that is in charge of changing it. Have each thread place a request to change the file into a Concurrent Queue, which then notifies the Sequence_Gen thread to write to its own file. In essence:

Sequence_Gen thread:

@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
    }
}

Then, in any other thread, just queue and notify that there is something to write.

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share

548k questions

547k answers

4 comments

86.3k users

...