tRFC-Aufruf
Wenn das ABAP statement
CALL FUNCTION 'STFC_CONNECTION'
DESTINATION RFCDEST
IN BACKGROUND TASK
aufgerufen wird, findet eine tRFC-Verarbeitung statt. Dies bedeutet, dass die folgende Aufruf-Sequenz angestoßen wird:
1. protected boolean onCheckTID(String tid)

An dieser Stelle muss die Anwendung benachrichtigt werden, dass der nächste Call mit dieser TID abgearbeitet werden soll. Die Anwendung muss den Wert true zurückgeben, um zu signalisieren, dass die Ausführung möglich ist.
2. ruft den Funktionsbaustein auf.
3. die protected void-Methode onCommit(String tid) oder onRollback(String
tid)hängt ab vom Ergebnis der Funktions-Verteilung. Falls handleRequest keine Ausnahmen ausgegeben hat, wird onCommitaufgerufen.
4. protected void-Methode onConfirmTID(String tid).

An dieser Stelle wird die Anwendung benachrichtigt, dass die Ausführung von dem Call mit der gegeben TID beendet wird. Dieser Call kann unter Umständen in einem anderen Listener ankommen, bzw. kommt möglicherweise im Falle von Problemen nicht im ABAP Backend-System an.
tRFC-Aufruf
static class MyTIDHandler implements JCoServerTIDHandler {
Map<String, TIDState> availableTIDs = new Hashtable<String, TIDState>();
public boolean checkTID(JCoServerContext serverCtx, String tid) { System.out.println("TID Handler: checkTID for " + tid); if(availableTIDs.containsKey(tid)) return false;
//notify other instances about the starting of an tRFC call, if necessary availableTIDs.put(tid, TIDState.STARTED); return true; }
public void commit(JCoServerContext serverCtx, String tid) { System.out.println("TID Handler: commit for " + tid);
//react on commit e.g. commit on the database //if necessary throw a RuntimeException if the commit was not possible availableTIDs.put(tid, TIDState.FINISHED); }
public void rollback(JCoServerContext serverCtx, String tid) { System.out.println("TID Handler: rollback for " + tid);
//react on rollback e.g. rollback on the database availableTIDs.put(tid, TIDState.FINISHED); }
public void confirmTID(JCoServerContext serverCtx, String tid) { System.out.println("TID Handler: confirmTID for " + tid);
try { //clean up the resources } //catch(Throwable t) {} //partner wont react on an exception at this point finally { availableTIDs.remove(tid); } }
private enum TIDState { STARTED, FINISHED; } }
static void step3SimpleTRfcServer() { JCoServer server; try { server = JCoServerFactory.getServer(SERVER_NAME1); } catch(JCoException ex) { throw new RuntimeException("Unable to create the server " + SERVER_NAME1 + ", because of " + ex.getMessage(), ex); }
JCoServerFunctionHandler stfcConnectionHandler = new StfcConnectionHandler(); DefaultServerHandlerFactory.FunctionHandlerFactory factory = new DefaultServerHandlerFactory.FunctionHandlerFactory(); factory.registerHandler("STFC_CONNECTION", stfcConnectionHandler); server.setCallHandlerFactory(factory);
//additionally to step 1 MyTIDHandler myTIDHandler = new MyTIDHandler(); server.setTIDHandler(myTIDHandler);
server.start(); System.out.println("The program can be stopped using <ctrl>+<c>"); }
public static void main(String[] a) { step1SimpleServer(); //step2SimpleServer(); //step3SimpleTRfcServer(); } }
|