code: public void onTimerEvent(TimerEvent event, ActivityContextInterface aci) {
  
  		if (getFinalReplySent())
  		{
  			aci.detach(sbbContext.getSbbLocalObject());
  			final DialogActivity dialog = (DialogActivity) aci.getActivity();
  			try {
  				dialog.sendRequest(dialog.createRequest(Request.BYE));
  			} catch (Exception e) {
  				getTracer().severe("failure while processing timer event", e);
  			}
  		}
  		else
  		{
  			// detach from the server tx activity
  			aci.detach(sbbContext.getSbbLocalObject());
  			
  			final ServerTransaction serverTransaction = (ServerTransaction) aci.getActivity();
  			try
  			{
  				// create dialog activity and attach to it
  				final DialogActivity dialog = (DialogActivity) sleeSipProvider
  					.getNewDialog(serverTransaction);
  				final ActivityContextInterfaceExt dialogAci = (ActivityContextInterfaceExt) sipActivityContextInterfaceFactory
  					.getActivityContextInterface(dialog);
  				
  				dialogAci.attach(sbbContext.getSbbLocalObject());
  			
  				// send 200 ok
  				Response response = messageFactory.createResponse(Response.OK,serverTransaction.getRequest());
  				response.addHeader(getContactHeader());
  				serverTransaction.sendResponse(response);
  					
  				setFinalReplySent(true);
  				// set timer of 30 secs on the dialog aci to send bye
  				timerFacility.setTimer(dialogAci, null, System.currentTimeMillis() + 60000L, getTimerOptions());						
  			}
  			catch (Exception e) {
  					getTracer().severe("failure while sending 200 OK response", e);
  			}			
  		}
  	}
docs: Event handler method for the timer event.
  
  @param event
  @param aci