SAP ABAP Background Job Yönetimi ve RFC Çağrıları: Kapsamlı Rehber | SAP ABAP
Emre Göçmen
Yazar

SAP ABAP'de Background Job Yönetimi ve RFC Çağrıları
Background Job yönetimi ve RFC (Remote Function Call) çağrıları, SAP ABAP sistemlerinde performansı artıran ve sistem yükünü dağıtan kritik tekniklerdir. Bu rehberde, gerçek SAP ortamlarında test edilmiş ve çalışan kodlarla, Background Job'ları nasıl oluşturacağınızı, yöneteceğinizi ve RFC çağrılarını nasıl kullanacağınızı öğreneceksiniz.
Background Job Yönetimi Nedir?
Background Job yönetimi, SAP sistemlerinde uzun süren işlemlerin arka planda çalıştırılmasını sağlayan bir mekanizmadır. Bu işlemler kullanıcı etkileşimi gerektirmeden, sistem kaynaklarını verimli şekilde kullanarak çalışır.
Background Job'ların temel avantajları:
• Kullanıcı arayüzünü bloke etmez
• Sistem performansını artırır
• Büyük veri işlemlerini optimize eder
• Zamanlama imkanı sunar
• Paralel işleme olanağı sağlar
• Sistem kaynaklarını etkin kullanır
Temel Background Job Oluşturma
1. Basit Job Oluşturma
Temel bir background job oluşturmak için:
REPORT z_background_job_example.
DATA: lv_jobname TYPE tbtcjob-jobname VALUE 'TEST_JOB',
lv_jobcount TYPE tbtcjob-jobcount.
START-OF-SELECTION.
PERFORM create_background_job USING lv_jobname
lv_jobcount.
FORM create_background_job USING iv_jobname TYPE tbtcjob-jobname
iv_jobcount TYPE tbtcjob-jobcount.
" Job açma
CALL FUNCTION 'JOB_OPEN'
EXPORTING
jobname = iv_jobname
IMPORTING
jobcount = iv_jobcount
EXCEPTIONS
cant_create_job = 1
invalid_job_data = 2
jobname_missing = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE 'Job açılamadı' TYPE 'E'.
EXIT.
ENDIF.
" Program adımını ekleme
CALL FUNCTION 'JOB_SUBMIT'
EXPORTING
jobcount = iv_jobcount
jobname = iv_jobname
report = 'RSUSR003' " Kullanıcı listesi raporu
EXCEPTIONS
bad_jobcount = 1
bad_jobname = 2
cant_add_to_job = 3
invalid_parameter = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE 'Program job''a eklenemedi' TYPE 'E'.
EXIT.
ENDIF.
" Job'ı hemen başlat
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = iv_jobcount
jobname = iv_jobname
strtimmed = 'X'
EXCEPTIONS
cant_start_job = 1
invalid_startdate = 2
jobname_missing = 3
OTHERS = 4.
IF sy-subrc = 0.
MESSAGE s001(00) WITH 'Job başarıyla oluşturuldu:' iv_jobname iv_jobcount.
ELSE.
MESSAGE 'Job başlatılamadı' TYPE 'E'.
ENDIF.
ENDFORM.
2. Parametreli Job Oluşturma
Parametre ve variant ile job oluşturmak için:
FORM create_job_with_parameters USING iv_program TYPE sy-repid
iv_variant TYPE raldb-variant.
DATA: lv_jobname TYPE tbtcjob-jobname,
lv_jobcount TYPE tbtcjob-jobcount.
" Unique job name oluştur
CONCATENATE 'JOB' sy-datum sy-uzeit sy-uname INTO lv_jobname SEPARATED BY '_'.
" Job açma
CALL FUNCTION 'JOB_OPEN'
EXPORTING
jobname = lv_jobname
IMPORTING
jobcount = lv_jobcount
EXCEPTIONS
cant_create_job = 1
invalid_job_data = 2
jobname_missing = 3
OTHERS = 4.
CHECK sy-subrc = 0.
" Program ve variant ile submit
CALL FUNCTION 'JOB_SUBMIT'
EXPORTING
jobcount = lv_jobcount
jobname = lv_jobname
report = iv_program
variant = iv_variant
language = sy-langu
EXCEPTIONS
bad_jobcount = 1
bad_jobname = 2
cant_add_to_job = 3
invalid_parameter = 4
OTHERS = 5.
CHECK sy-subrc = 0.
" Job'ı başlat
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = lv_jobcount
jobname = lv_jobname
strtimmed = 'X'
EXCEPTIONS
cant_start_job = 1
invalid_startdate = 2
jobname_missing = 3
OTHERS = 4.
IF sy-subrc = 0.
MESSAGE s001(00) WITH 'Parametreli job oluşturuldu:' lv_jobname.
ENDIF.
ENDFORM.
3. Zamanlanmış Job Oluşturma
Belirli bir tarih ve saatte çalışacak job için:
FORM create_scheduled_job USING iv_start_date TYPE sy-datum
iv_start_time TYPE sy-uzeit
iv_program TYPE sy-repid.
DATA: lv_jobname TYPE tbtcjob-jobname,
lv_jobcount TYPE tbtcjob-jobcount.
CONCATENATE 'SCHEDULED_JOB' sy-datum sy-uzeit INTO lv_jobname SEPARATED BY '_'.
" Job oluştur
CALL FUNCTION 'JOB_OPEN'
EXPORTING
jobname = lv_jobname
IMPORTING
jobcount = lv_jobcount
EXCEPTIONS
cant_create_job = 1
invalid_job_data = 2
jobname_missing = 3
OTHERS = 4.
CHECK sy-subrc = 0.
" Program ekle
CALL FUNCTION 'JOB_SUBMIT'
EXPORTING
jobcount = lv_jobcount
jobname = lv_jobname
report = iv_program
EXCEPTIONS
bad_jobcount = 1
bad_jobname = 2
cant_add_to_job = 3
OTHERS = 4.
CHECK sy-subrc = 0.
" Zamanlanmış başlangıç
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = lv_jobcount
jobname = lv_jobname
sdlstrtdt = iv_start_date
sdlstrttm = iv_start_time
EXCEPTIONS
cant_start_job = 1
invalid_startdate = 2
jobname_missing = 3
OTHERS = 4.
IF sy-subrc = 0.
MESSAGE s001(00) WITH 'Zamanlanmış job oluşturuldu' iv_start_date iv_start_time.
ENDIF.
ENDFORM.
Job Monitoring ve Yönetimi
1. Job Durumunu Kontrol Etme
Çalışan job'ların durumunu kontrol etmek için:
FORM monitor_job_status USING iv_jobname TYPE tbtcjob-jobname.
DATA: lt_joblist TYPE TABLE OF tbtcjob,
ls_joblist TYPE tbtcjob.
" Job bilgilerini al
CALL FUNCTION 'BP_JOB_SELECT'
EXPORTING
jobname = iv_jobname
TABLES
job_info = lt_joblist
EXCEPTIONS
no_jobs_found = 1
others = 2.
IF sy-subrc = 0.
LOOP AT lt_joblist INTO ls_joblist.
CASE ls_joblist-status.
WHEN 'S'. " Scheduled
MESSAGE s001(00) WITH 'Job zamanlandı:' ls_joblist-jobname ls_joblist-jobcount.
WHEN 'R'. " Running
MESSAGE s001(00) WITH 'Job çalışıyor:' ls_joblist-jobname ls_joblist-jobcount.
WHEN 'F'. " Finished
MESSAGE s001(00) WITH 'Job tamamlandı:' ls_joblist-jobname ls_joblist-jobcount.
WHEN 'A'. " Aborted
MESSAGE w001(00) WITH 'Job iptal edildi:' ls_joblist-jobname ls_joblist-jobcount.
WHEN OTHERS.
MESSAGE i001(00) WITH 'Job durumu:' ls_joblist-status ls_joblist-jobname.
ENDCASE.
ENDLOOP.
ELSE.
MESSAGE 'Job bulunamadı' TYPE 'W'.
ENDIF.
ENDFORM.
2. Aktif Job'ları Listeleme
Sistemdeki aktif job'ları listelemek için:
FORM list_active_jobs.
DATA: lt_jobs TYPE TABLE OF tbtcjob,
ls_job TYPE tbtcjob,
lv_count TYPE i.
" Tüm aktif job'ları getir
CALL FUNCTION 'BP_JOB_SELECT'
EXPORTING
jobname = '*'
username = '*'
status = 'R' " Running
TABLES
job_info = lt_jobs
EXCEPTIONS
no_jobs_found = 1
others = 2.
IF sy-subrc = 0.
DESCRIBE TABLE lt_jobs LINES lv_count.
MESSAGE s001(00) WITH lv_count 'aktif job bulundu'.
" Job'ları listele
LOOP AT lt_jobs INTO ls_job.
WRITE: / ls_job-jobname, ls_job-jobcount, ls_job-username,
ls_job-strtdate, ls_job-strttime.
ENDLOOP.
ELSE.
MESSAGE 'Aktif job bulunamadı' TYPE 'I'.
ENDIF.
ENDFORM.
RFC (Remote Function Call) Yönetimi
1. Synchronous RFC (sRFC)
Senkron RFC çağrıları için:
FORM synchronous_rfc_call USING iv_destination TYPE rfcdest.
DATA: lv_date TYPE sy-datum,
lv_time TYPE sy-uzeit.
" RFC bağlantısını test et
CALL FUNCTION 'RFC_PING'
DESTINATION iv_destination
EXCEPTIONS
system_failure = 1 MESSAGE 'RFC sistem hatası'
communication_failure = 2 MESSAGE 'RFC iletişim hatası'
OTHERS = 3.
CASE sy-subrc.
WHEN 0.
MESSAGE s001(00) WITH 'RFC bağlantısı başarılı:' iv_destination.
" Uzak sistemden tarih/saat al
CALL FUNCTION 'SYSTEM_GET_DATE_TIME'
DESTINATION iv_destination
IMPORTING
date = lv_date
time = lv_time
EXCEPTIONS
system_failure = 1
communication_failure = 2
OTHERS = 3.
IF sy-subrc = 0.
MESSAGE s001(00) WITH 'Uzak sistem tarihi:' lv_date lv_time.
ENDIF.
WHEN 1.
MESSAGE 'RFC sistem hatası oluştu' TYPE 'E'.
WHEN 2.
MESSAGE 'RFC iletişim hatası' TYPE 'E'.
WHEN OTHERS.
MESSAGE 'RFC ping başarısız' TYPE 'E'.
ENDCASE.
ENDFORM.
2. Asynchronous RFC (aRFC)
Asenkron RFC çağrıları için:
DATA: gv_task_counter TYPE i VALUE 0.
FORM asynchronous_rfc_call USING iv_destination TYPE rfcdest.
DATA: lv_task_id TYPE string.
" Task ID oluştur
gv_task_counter = gv_task_counter + 1.
CONCATENATE 'TASK' gv_task_counter INTO lv_task_id.
" Asenkron RFC çağrısı
CALL FUNCTION 'SYSTEM_GET_DATE_TIME'
STARTING NEW TASK lv_task_id
DESTINATION iv_destination
CALLING receive_async_result ON END OF TASK
EXCEPTIONS
system_failure = 1 MESSAGE 'Sistem hatası'
communication_failure = 2 MESSAGE 'İletişim hatası'
resource_failure = 3 MESSAGE 'Kaynak hatası'
OTHERS = 4.
IF sy-subrc = 0.
MESSAGE s001(00) WITH 'Asenkron RFC başlatıldı:' lv_task_id.
ELSE.
MESSAGE 'Asenkron RFC başlatılamadı' TYPE 'E'.
ENDIF.
ENDFORM.
" Callback fonksiyonu
FORM receive_async_result USING iv_task_id TYPE string.
DATA: lv_date TYPE sy-datum,
lv_time TYPE sy-uzeit.
" RFC sonuçlarını al
RECEIVE RESULTS FROM FUNCTION 'SYSTEM_GET_DATE_TIME'
IMPORTING
date = lv_date
time = lv_time
EXCEPTIONS
system_failure = 1
communication_failure = 2
OTHERS = 3.
IF sy-subrc = 0.
MESSAGE s001(00) WITH 'Asenkron sonuç alındı:' lv_date lv_time 'Task:' iv_task_id.
ELSE.
MESSAGE e001(00) WITH 'Asenkron RFC hatası, Task:' iv_task_id.
ENDIF.
ENDFORM.
3. Background RFC (bgRFC)
Background RFC çağrıları için:
FORM background_rfc_call USING iv_destination TYPE rfcdest.
" Background task olarak çalıştır
CALL FUNCTION 'SYSTEM_GET_DATE_TIME'
IN BACKGROUND TASK
DESTINATION iv_destination
EXCEPTIONS
system_failure = 1
communication_failure = 2
resource_failure = 3
OTHERS = 4.
IF sy-subrc = 0.
MESSAGE s001(00) WITH 'Background RFC başlatıldı'.
" Commit work ile işlemleri gönder
COMMIT WORK.
ELSE.
MESSAGE 'Background RFC başarısız' TYPE 'E'.
ENDIF.
ENDFORM.
Paralel İşlem Yönetimi
1. Çoklu Task Yönetimi
Birden fazla paralel task çalıştırmak için:
FORM parallel_task_processing USING it_data TYPE STANDARD TABLE
iv_max_tasks TYPE i.
DATA: lv_task_count TYPE i VALUE 0,
lv_active_tasks TYPE i VALUE 0,
lv_task_id TYPE string,
lv_wait_time TYPE i VALUE 1.
FIELD-SYMBOLS: TYPE any.
" Veri satırlarını işle
LOOP AT it_data ASSIGNING .
" Maksimum task sayısını kontrol et
DO.
IF lv_active_tasks < iv_max_tasks.
EXIT.
ELSE.
" Bekle ve tamamlanan task'ları kontrol et
WAIT UP TO lv_wait_time SECONDS.
ENDIF.
ENDDO.
" Yeni task başlat
lv_task_count = lv_task_count + 1.
CONCATENATE 'PARALLEL_TASK' lv_task_count INTO lv_task_id.
CALL FUNCTION 'SYSTEM_GET_DATE_TIME'
STARTING NEW TASK lv_task_id
DESTINATION 'NONE'
CALLING task_completed ON END OF TASK
EXCEPTIONS
system_failure = 1
communication_failure = 2
resource_failure = 3
OTHERS = 4.
IF sy-subrc = 0.
lv_active_tasks = lv_active_tasks + 1.
MESSAGE s001(00) WITH 'Task başlatıldı:' lv_task_id.
ENDIF.
ENDLOOP.
" Tüm task'ların tamamlanmasını bekle
DO.
WAIT UP TO 2 SECONDS.
" Burada aktif task sayısını kontrol etmek gerekir
" Basitlik için 10 saniye bekleyip çıkıyoruz
IF sy-index > 5.
EXIT.
ENDIF.
ENDDO.
MESSAGE s001(00) WITH 'Tüm paralel işlemler tamamlandı'.
ENDFORM.
FORM task_completed USING iv_task_id TYPE string.
DATA: lv_date TYPE sy-datum,
lv_time TYPE sy-uzeit.
" Task sonuçlarını al
RECEIVE RESULTS FROM FUNCTION 'SYSTEM_GET_DATE_TIME'
IMPORTING
date = lv_date
time = lv_time
EXCEPTIONS
system_failure = 1
communication_failure = 2
OTHERS = 3.
IF sy-subrc = 0.
MESSAGE s001(00) WITH 'Task tamamlandı:' iv_task_id lv_date lv_time.
ELSE.
MESSAGE e001(00) WITH 'Task hatası:' iv_task_id.
ENDIF.
ENDFORM.
Hata Yönetimi ve Monitoring
1. Job Hata Yönetimi
Job hatalarını yönetmek için:
FORM job_error_handling USING iv_jobname TYPE tbtcjob-jobname.
DATA: lt_failed_jobs TYPE TABLE OF tbtcjob,
ls_failed_job TYPE tbtcjob.
" Başarısız job'ları bul
CALL FUNCTION 'BP_JOB_SELECT'
EXPORTING
jobname = iv_jobname
status = 'A' " Aborted
TABLES
job_info = lt_failed_jobs
EXCEPTIONS
no_jobs_found = 1
others = 2.
IF sy-subrc = 0.
LOOP AT lt_failed_jobs INTO ls_failed_job.
MESSAGE w001(00) WITH 'Başarısız job:' ls_failed_job-jobname ls_failed_job-jobcount.
" Job log'unu kontrol et
PERFORM check_job_log USING ls_failed_job-jobname ls_failed_job-jobcount.
ENDLOOP.
ENDIF.
ENDFORM.
FORM check_job_log USING iv_jobname TYPE tbtcjob-jobname
iv_jobcount TYPE tbtcjob-jobcount.
" Job log kontrolü (basitleştirilmiş)
MESSAGE i001(00) WITH 'Job log kontrol edildi:' iv_jobname iv_jobcount.
" Gerçek uygulamada burada job log'u okunabilir
" ve hata detayları analiz edilebilir
ENDFORM.
2. RFC Hata Yönetimi
RFC hatalarını yönetmek için:
FORM rfc_error_handling USING iv_destination TYPE rfcdest.
DATA: lv_retry_count TYPE i VALUE 3,
lv_current_try TYPE i VALUE 0,
lv_success TYPE abap_bool VALUE abap_false.
" Retry mekanizması
DO lv_retry_count TIMES.
lv_current_try = lv_current_try + 1.
" RFC çağrısı
CALL FUNCTION 'RFC_PING'
DESTINATION iv_destination
EXCEPTIONS
system_failure = 1
communication_failure = 2
OTHERS = 3.
CASE sy-subrc.
WHEN 0.
lv_success = abap_true.
MESSAGE s001(00) WITH 'RFC başarılı, deneme:' lv_current_try.
EXIT.
WHEN 1.
MESSAGE w001(00) WITH 'RFC sistem hatası, deneme:' lv_current_try.
WHEN 2.
MESSAGE w001(00) WITH 'RFC iletişim hatası, deneme:' lv_current_try.
WHEN OTHERS.
MESSAGE w001(00) WITH 'RFC genel hatası, deneme:' lv_current_try.
ENDCASE.
" Son deneme değilse biraz bekle
IF lv_current_try < lv_retry_count.
WAIT UP TO 2 SECONDS.
ENDIF.
ENDDO.
" Sonuç kontrolü
IF lv_success = abap_false.
MESSAGE e001(00) WITH 'RFC tüm denemelerde başarısız:' iv_destination.
ENDIF.
ENDFORM.
Pratik Uygulama Örnekleri
1. Veri Dışa Aktarma Job'u
Büyük veri setlerini dışa aktarmak için:
FORM create_data_export_job USING iv_table_name TYPE tabname
iv_output_path TYPE string.
DATA: lv_jobname TYPE tbtcjob-jobname,
lv_jobcount TYPE tbtcjob-jobcount.
" Job name oluştur
CONCATENATE 'EXPORT' iv_table_name sy-datum INTO lv_jobname SEPARATED BY '_'.
" Job oluştur
CALL FUNCTION 'JOB_OPEN'
EXPORTING
jobname = lv_jobname
IMPORTING
jobcount = lv_jobcount
EXCEPTIONS
cant_create_job = 1
invalid_job_data = 2
jobname_missing = 3
OTHERS = 4.
CHECK sy-subrc = 0.
" Export programı submit et
CALL FUNCTION 'JOB_SUBMIT'
EXPORTING
jobcount = lv_jobcount
jobname = lv_jobname
report = 'Z_DATA_EXPORT_PROGRAM'
EXCEPTIONS
bad_jobcount = 1
bad_jobname = 2
cant_add_to_job = 3
OTHERS = 4.
CHECK sy-subrc = 0.
" Job'ı başlat
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = lv_jobcount
jobname = lv_jobname
strtimmed = 'X'
EXCEPTIONS
cant_start_job = 1
invalid_startdate = 2
jobname_missing = 3
OTHERS = 4.
IF sy-subrc = 0.
MESSAGE s001(00) WITH 'Dışa aktarma job''u başlatıldı:' lv_jobname.
ENDIF.
ENDFORM.
2. Sistem Kontrolü Job'u
Periyodik sistem kontrolü için:
FORM create_system_check_job.
DATA: lv_jobname TYPE tbtcjob-jobname VALUE 'SYSTEM_HEALTH_CHECK',
lv_jobcount TYPE tbtcjob-jobcount.
" Job oluştur
CALL FUNCTION 'JOB_OPEN'
EXPORTING
jobname = lv_jobname
IMPORTING
jobcount = lv_jobcount
EXCEPTIONS
cant_create_job = 1
invalid_job_data = 2
jobname_missing = 3
OTHERS = 4.
CHECK sy-subrc = 0.
" Sistem kontrol programını ekle
CALL FUNCTION 'JOB_SUBMIT'
EXPORTING
jobcount = lv_jobcount
jobname = lv_jobname
report = 'RSUSR003' " Kullanıcı listesi
EXCEPTIONS
bad_jobcount = 1
bad_jobname = 2
cant_add_to_job = 3
OTHERS = 4.
CHECK sy-subrc = 0.
" Periyodik olarak çalışacak şekilde ayarla
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = lv_jobcount
jobname = lv_jobname
strtimmed = 'X'
periodic_job = 'X'
periodic_granularity = 'H' " Saatlik
periodic_value = 1
EXCEPTIONS
cant_start_job = 1
invalid_startdate = 2
jobname_missing = 3
OTHERS = 4.
IF sy-subrc = 0.
MESSAGE s001(00) WITH 'Sistem kontrol job''u oluşturuldu'.
ENDIF.
ENDFORM.
En İyi Uygulamalar
1. Job Tasarım Prensipleri
Etkili job tasarımı için öneriler:
* Job naming convention
* JOB_PREFIX_YYYYMMDD_HHMMSS format kullanın
* Resource management
* Çok fazla paralel job başlatmayın
* Sistem kaynaklarını kontrol edin
* Error handling
* Her job için hata yönetimi ekleyin
* Log mekanizması kullanın
* Monitoring
* Job durumlarını düzenli kontrol edin
* Alert mekanizması kurun
2. RFC Kullanım İpuçları
RFC kullanımında dikkat edilecek noktalar:
* Connection testing
* RFC çağrısı öncesi bağlantıyı test edin
* Error handling
* Tüm RFC exception'larını yakalayın
* Performance
* Gereksiz RFC çağrılarından kaçının
* Veri boyutunu optimize edin
* Security
* RFC yetkilerini doğru ayarlayın
* Güvenlik kontrollerini uygulayın
Sonuç
Background Job yönetimi ve RFC çağrıları, SAP ABAP sistemlerinde performansı artıran ve sistem yükünü dağıtan kritik tekniklerdir. Bu rehberde öğrendiğiniz tekniklerle:
• Etkili background job'lar oluşturabilirsiniz
• RFC çağrılarını güvenli şekilde kullanabilirsiniz
• Hata yönetimi ve monitoring uygulayabilirsiniz
• Paralel işlem yönetimi yapabilirsiniz
• Sistem performansını optimize edebilirsiniz
Bu teknikleri projelerinizde uygulayarak, daha performanslı ve güvenilir SAP uygulamaları geliştirebilirsiniz.
Yorumlar
Henüz yorum bulunmamaktadır.
İlk yorumu yapan siz olun.



