Error: While working on Web Dynpro Application, when the application is not accessed (left inactive) for a longer duration, when we come back to or Screen, it shows an error, Session Time out. To resolve this kind of error we can use following process.

Here we need to make some node and UI element for the same.

Let’s start with:

Component Controller:

Create a node with the name Time_out and one attribute init named as Time with Type INT4 with Cardinality 1:1 and Selection 0:1.

Methods:

Create a method in the component controller itself.

METHOD calculate_server_timeout


DATA:  

  lv_name              TYPE pfeparname,
  lv_value             
TYPE pfepvalue,
  lv_icf_timeout       
TYPE icftime,
  lv_timeout           
TYPE int4,
  lv_tmp_timeout       
TYPE int4,
  lv_time_deduct_sec   
TYPE int4.


DATA: minutes TYPE i.


*Reading of Timeout node..
DATA lo_nd_time_out TYPE REF TO if_wd_context_node.
DATA lo_el_time_out TYPE REF TO if_wd_context_element.
DATA ls_time_out TYPE wd_this->element_time_out.
DATA lv_time TYPE wd_this->element_time_out-TIME.


lo_nd_time_out
= wd_context->get_child_node( name = wd_this->wdctx_time_out ).
lo_el_time_out
= lo_nd_time_out->get_element( ).

****Get the App Server Timeout
lv_name
= ‘rdisp/plugin_auto_logout’.
CALL ‘C_SAPGPARAM’ ID ‘NAME’  FIELD lv_name
ID ‘VALUE’ FIELD lv_value.

****Is there a specific Timeout set
IF wdr_task=>server IS BOUND.
IF wdr_task=>server->session_timeout IS INITIAL.
lv_timeout
= lv_value.
ELSE.
****We got a specific timeout – now convert it to a number of seconds.
lv_icf_timeout
wdr_task=>server->session_timeout.
minutes
= lv_icf_timeout+0(2) * 60.
minutes
= minutes + lv_icf_timeout+2(2).
lv_timeout
= ( minutes * 60 ) + lv_icf_timeout+4(2).


****If a specified timeout is larger than the default, it is ignored.
****Use the default instead.
IF lv_timeout > lv_value.
lv_timeout
= lv_value.
ENDIF.
ENDIF.
ELSE.
lv_timeout
= lv_value.
ENDIF.

* Default the timeout deduction to 2 min
lv_time_deduct_sec 
= 120.

lv_tmp_timeout  = lv_timeout  lv_time_deduct_sec.


* Here we are setting value in the time_out Attribute
lo_el_time_out
->set_attribute(
name
=  `TIME`
value = lv_tmp_timeout ).
ENDMETHOD.

METHOD wddoinit . (Component controller)
* Calling method created by us, because it will triggered when the application gets load.
wd_this-> calculate_server_timeout ( ). 

View…

Open the view where you want to save session time out. IF you want to do in your whole application follow below step in all views.


1.Create a New UI Element (TimedTrigger)Timer.

2.USE component controller node by using context mapping form Component controller to view and bind delay with the attribute TIME

3. Create a new method in the view.


method ONACTIONTIME_ACTION .

***Simply Reading a Context Node to Activate this Action

DATA lo_nd_time_out TYPE REF TO if_wd_context_node.
DATA lo_el_time_out TYPE REF TO if_wd_context_element.
DATA ls_time_out TYPE wd_this->element_time_out.
DATA lv_time TYPE wd_this->element_time_out-TIME.


lo_nd_time_out
= wd_context->get_child_node( name = wd_this->wdctx_time_out ).
lo_el_time_out
= lo_nd_time_out->get_element( ).


lo_el_time_out
->get_attribute(
EXPORTING
name
=  `TIME`
IMPORTING
VALUE = lv_time ).

endmethod.


To report this post you need to login first.

32 Comments

You must be Logged on to comment or reply to a post.

      1. VR V

        Hi Chandra Sekhar,

        Can we not increase the time out session without doing this like doing some settings in SICF transaction.

        By default the system is having certain amount of time for time out, so my question is can we not increase the default time set by SAP for the web dynpro Applications

        (0) 
        1. Chandra Shekhar Agarwal Post author

          Hello VR V,

          Yeah, we can increase the time out for the web dynpro application. There will be two limitation will come in picture.

          1. Extended timeout will be applicable for all the application, and there can be a case that we don’t want all the application alive all the time, so i will increase load on system.

          2. It is important one, we can extend session time till a certain limit, lets say 20 mins. but after that our application will move to suspended mode, so we can’t keep it alive all the time. As you can check in the code also first we are calculating system alive time and then we are doing our operations.

          here..

          lv_name = ‘rdisp/plugin_auto_logout’.
          CALL ‘C_SAPGPARAM’ ID ‘NAME’  FIELD lv_name
          ID ‘VALUE’ FIELD lv_value.

          (0) 
          1. VR V

            So we need to implement this ontime_action in every view of the WD Application.

            Is there way can we do it once instead of doing in all views

            (0) 
  1. Sai Balaji Nukala

    Nice Blog, though I have a question.

    What’s the use of maintaining this at the application when we modify the default timeout parameter in the instance profile? Also, this seems to be at a application level.

    -Balajii

    P.S: Just wanted to understand the use case, I appreciate your efforts.

    (0) 
    1. Chandra Shekhar Agarwal Post author

      I think by configuration level we can set maximum time out till 30 minutes.. Here we are reading the system’s time out and reducing it by 2 minutes and calling a method, with the help of timer, after “actual timeout –  2 min ”  to keep alive our application.

      (0) 
      1. Nageswara Katta

        Chandra,

        In my webdynpro application i’m using suspend/resume plugs to navigate to Payment Gateway(PG), if PG does not return to SAP application before set time I’m having session timeout. Is there any way to avoid timeout in my scenario. Any help is much appreciated. Thanks

        (0) 
  2. Samuli Kaski

    Maybe you meant to write TimedTrigger instead of Timer since there is no UI element called Timer in WDA. Maybe it is also worth noticing that TimedTrigger works only if the view having the UI element is visible.

    (0) 

Leave a Reply