DeleteJobUseTemplate

Kurzbeschreibung

Der Service DeleteJobUseTemplate ist zur Löschung von Werten aus Tabellen gedacht, welche eine Spalte MessageId haben. Das Löschverhalten wird durch Extensions bestimmt. Die Extension B3P_DELETE_TEMPLATE dient hierbei der Definition des Löschalgorithmus. Die Auswahl, was gelöscht werden soll, wird in beliebig vielen Extension gemacht, welche durch die Service Property B3P_CONFIGURATION_EXTENSION_NAMES gegeben sind. Falls für jede Tabelle, in welcher gelöscht wird, nur ein Löschverhalten nötig ist, reicht hier eine Extension. Mehrere Extensions können durch ; getrennt angegeben werden. Der Service zum Löschen ist ein Scheduler Service. Der Ausführungszeitpunkt lässt sich also wie gewohnt konfigurieren. Um sicher zu stellen, das die Konfiguration des Jobs nicht ausversehen verändert wird, verfügt dieser Job über die Property B3P_EXTENSIONS_HASH_CODE_CHECK. Falls eine Extension angepasst wird, muss auch der Hash Code angepasst werden, sonst wird der Job nicht ausgeführt. Diese Funktion ist optional.

Einrichtung

Service anlegen

Einen neuen Scheduler-Service anlegen. Siehe Einrichtung von Scheduler Services.

Service Properties

In den Service Properties folgende Einträge anlegen

B3P_SCHEDULER_REGISTER_CLASSNAME

org.b2bbp.service.inbound.scheduled.DeleteJobUseTemplate

B3P_CRON_HOURS

Stunde zu welcher gelöscht wird z.B. 1

B3P_CRON_MINUTES

Minute zu welcher gelöscht wird z.B. 15

B3P_SCHEDULER_TYPE

CRON

B3P_SCHEDULER_NAME (optional)

Name des Jobs im Monitoring der B2B z.B. DeleteJobTemplate

B3P_CONFIGURATION_EXTENSION_NAMES

Name der Extensions welche definieren was gelöscht werden soll.

z.B. DeleteExtension1;DeleteExtension2

B3P_EXTENSIONS_HASH_CODE_CHECK

(optional)

HashCode aller Extensions zusammengesetzt. Z.B. 1149343718-18143706671791172459

Dient der Sicherheit. Job wird nur ausgeführt wenn der zusammengesetzte HashCode der Extensions diesem Wert entspricht.

B3P_STORE_PROCEDURE

Wenn false werden die Proceduren nicht mehr neun in die DB geschrieben.

Extension B3P_DELETE_TEMPLATE

Extension zur Definition des lösch Algorithmus (hier sollte meistens nichts geändert werden).

z.B. folgendes bei einer Oracel Datenbank:

create or replace PROCEDURE #functionDeleteTable#
AS
  type obj_rowid is table of ROWID INDEX BY PLS_INTEGER;
  lr_rowid obj_rowid;
  cursor deleteCursor IS select row_id from #rowidtable# order by row_id desc;
BEGIN
  dbms_output.put_line(to_char(systimestamp,'DD.MM.YYYY HH24:MI:SS.FF') || ' Delete #deleteTable# started');
  open deleteCursor;
  loop
    fetch deleteCursor BULK COLLECT INTO lr_rowid LIMIT 10000;
    forall i in lr_rowid.FIRST .. lr_rowid.LAST
      DELETE from #deleteTable# where rowid in (lr_rowid(i));
  commit;
  dbms_output.put_line(to_char(systimestamp,'DD.MM.YYYY HH24:MI:SS.FF') || ' Delete #deleteTable# ended');
  dbms_output.put_line(lr_rowid.LAST ||' rows in table #deleteTable# are deleted!');
  exit when deleteCursor%NOTFOUND;
  end loop;
  CLOSE deleteCursor;
END;

Kurze Beschreibung

#functionDeleteTable# = Name der Procedure wird automatisch vom Programm ersetzt.

#deleteTable# = Tabelle in welcher gelöscht wird.

#rowidtable# = Tabelle mit den RowIds welche gelöscht werden sollen.

Extension Beispiel für die bei B3P_CONFIGURATION_EXTENSION_NAMES angegebenen Extensions.

Bei B3P_CONFIGURATION_EXTENSION_NAMES können beliebig viele Extensions angegeben werden, welche das genaue Löschverhalten bestimmen. Mehrere Extensions sind nur nötig, wenn für eine Tabelle verschiedene Löschverhalten benötigt werden.

z.B. folgendes (für Oracle-DB):

<td>#Tabellen in welchen gelöscht wird
tables=B2BBP_DATA_ATTRIBUTE_ARCHIVE;B2BBP_DATA_ATTRIBUTE;B2BBP_DATA_ERROR;B2BBP_DATA_ACTION;B2BBP_DATA_MESSAGE
#Einschränkung der MessageIds mit beliebigen Ausdrücken welche sich auf die Spalten der Tabelle b2bbp_data_message beziehen.
messageIds_where= and b2bbp_data_message.state='ARC'
# Wie alt die zu löschenden Nachrichten maximal sind
# Alle nachrichten, welche älter sind als der angegebene Wert in Tagen, werden nicht gelöscht. (Sie sollten schon in vorherigen Löschdurchgängen gelöscht worden sein.)
from_B2BBP_DATA_ATTRIBUTE_ARCHIVE=150
from_B2BBP_DATA_ATTRIBUTE=150
from_B2BBP_DATA_ERROR=150
from_B2BBP_DATA_ACTION=150
from_B2BBP_DATA_MESSAGE=150
# Alle Nachrichten, welche älter sind als der angegebene Wert in Tagen, werden gelöscht.
to_B2BBP_DATA_ATTRIBUTE_ARCHIVE=100
to_B2BBP_DATA_ATTRIBUTE=100
to_B2BBP_DATA_ERROR=100
to_B2BBP_DATA_ACTION=100
to_B2BBP_DATA_MESSAGE=100
# Zusätzliche Einschränkung der zu löschenden Nachrichten.
rowIds_where_B2BBP_DATA_ATTRIBUTE_ARCHIVE= and B2BBP_DATA_ATTRIBUTE_ARCHIVE.type='T'
rowIds_where_B2BBP_DATA_ATTRIBUTE= and B2BBP_DATA_ATTRIBUTE.type='T'
rowIds_where_B2BBP_DATA_ERROR=
rowIds_where_B2BBP_DATA_ACTION= and B2BBP_DATA_ACTION.type <> 'Service'
rowIds_where_B2BBP_DATA_MESSAGE=
#Nicht ändern
messageIds_template=insert into messageIds_to_delete Select b2bbp_data_message.messageid From b2bbp_data_message Where b2bbp_data_message.STARTED between to_timestamp('#from#', 'YYYY-MM-DD HH24:MI:SS') and to_timestamp('#to#', 'YYYY-MM-DD HH24:MI:SS') AND rownum <= 100000
messageIds_delete=messageIds_to_delete
rowIds_template=insert into #rowidtable# SELECT #deleteTable#.rowid FROM #deleteTable# WHERE #deleteTable#.messageid IN (Select messageid From messageIds_to_delete)

Die zusätzliche Einschränkung der zu löschenden Nachrichten sollten individuell geprüft werden und so eingestellt werden, wie gewünscht (die where-Bedingungen können entsprechend konfiguriert werden). In der obigen Konfiguration bleiben zum Beispiel technische Attribute, sowie Services in den technischen Details erhalten. Nimmt man diese Einschränkungen weg, werden also mehr Daten gelöscht.

Achtung!! Hinweis:

Die Tabelle B2BBP_DATA_MESSAGE sollte immer als letztes gelöscht werden(also am Ende bei tables=). Da Sie zum Löschen der anderen Tabellen benötigt wird. Wenn Werte in der Tabelle B2BBP_DATA_MESSAGE gelöscht werden kann dies dazu führen das Werte welche mit dieser Tabelle verknüpft sind auch gelöscht werden.

Analoges gilt für die Tabelle B2BBP_DATA_ACTION diese wird allerdings nicht zum Löschen der anderen Tabellen benötigt.

HashCode ermitteln

Zum ermitteln des HashCode den Service einmal laufen lassen dazu bei B3P_EXTENSIONS_HASH_CODE_CHECK einfach eine 1 eintragen:

Der HashCode welcher hier eingetragen werden muss wird bei den fachlichen belegen im Monitoring angezeigt.

Rückmeldung des Service über die gelöschten Tabellen

Bei den Fachlichen belegen kann nachgeschaut werden wie viel gelöscht wurde und wie lange es gedauert hat.

Prüfung des Status des Jobs

Da der Job sehr lange Laufzeiten haben kann, ist es unter Umständen nötig, zu prüfen, ob der Job tatsächlich noch arbeitet. Dies kann auf der Datenbank getan werden.

Mit folgendem SQL-Statement kann der Rest der noch zu löschenden Daten angezeigt werden. Je nach Datenbanktabelle, an welcher der Job gerade arbeitet, sollte eine der Zahlen regelmäßig kleiner werden (im Standard in 10.000er Schritten).

WITH ARANGE as (select messageId from B2BBP_DATA_MESSAGE where STARTED <= to_timestamp('07-06-2013 01:59:59', 'dd-mm-yyyy hh24:mi:ss') AND STATE = 'ARC')
select 'B2BBP_DATA_ATTRIBUTE_ARCHIVE',count(*) from B2BBP_DATA_ATTRIBUTE_ARCHIVE where messageId IN (select * from ARANGE)
UNION ALL
select 'B2BBP_DATA_ATTRIBUTE',count(*) from B2BBP_DATA_ATTRIBUTE where messageId IN (select * from ARANGE)
UNION ALL
select 'B2BBP_DATA_ERROR',count(*) from B2BBP_DATA_ERROR where messageId IN (select * from ARANGE)
UNION ALL
select 'B2BBP_DATA_ACTION',count(*) from B2BBP_DATA_ACTION where messageId IN (select * from ARANGE) AND TYPE <> 'Service'
UNION ALL
select 'B2BBP_DATA_MESSAGE',count(*) from ARANGE;

In jedem Select-Statement müssen sich die where-Bedingungen aus den Einschränkungen in der Löschkonfiguration wieder finden um ein möglichst passendes Ergebnis zu liefern.

Anhang

Extension B3P_DELETE_TEMPLATE für Mysql Datenbank

CREATE PROCEDURE #functionDeleteTable#()

BEGIN
      DELETE from #deleteTable# where messageid in (Select messageid From #rowidtable#);
END;

Extension B3P_DELETE_TEMPLATE bulk delete für Mysql Datenbank

CREATE PROCEDURE #functionDeleteTable#()  
BEGIN  
DECLARE run INT;  
DECLARE bulksize INT;  
Set run = 1;  
Set bulksize = 500;  
Select count(*) From #rowidtable# INTO run;  
        while run > 0 do  
        CREATE TABLE idstodelete LIKE #rowidtable#;  
        INSERT INTO idstodelete SELECT messageid FROM #rowidtable# limit 0 , bulksize;  
        DELETE from #deleteTable# where messageid in (Select messageid From idstodelete);  
        DELETE from #rowidtable# where messageid in (Select messageid From idstodelete);  
        drop table idstodelete;  
        Select count(*) From #rowidtable# INTO run;  
        End while;  
END;

Löschverhalten-Extension fü Mysql Datenbank

#Tabellen in welchen gelöscht wird

tables=B2BBP_DATA_MESSAGE

#Einschränkung der MessageIds mit beliebigen Ausdrücken welche sich auf
die Spalten der Tabelle b2bbp_data_message beziehen.

messageIds_where=

# Wie alt die zu löschenden Nachrichten maximal sind

from_B2BBP_DATA_ATTRIBUTE_ARCHIVE=150

from_B2BBP_DATA_ATTRIBUTE=150

from_B2BBP_DATA_ERROR=150

from_B2BBP_DATA_ACTION=150

from_B2BBP_DATA_MESSAGE=150

# Alle Nachrichten welche älter sind als der Angegebnen Wert werden
gelöscht.

to_B2BBP_DATA_ATTRIBUTE_ARCHIVE=60

to_B2BBP_DATA_ATTRIBUTE=100

to_B2BBP_DATA_ERROR=100

to_B2BBP_DATA_ACTION=100

to_B2BBP_DATA_MESSAGE=10

# Zusätzliche Einschränckung der zu löschenden Nachrichten.

rowIds_where_B2BBP_DATA_ATTRIBUTE_ARCHIVE= and
B2BBP_DATA_ATTRIBUTE_ARCHIVE.type='T'

rowIds_where_B2BBP_DATA_ATTRIBUTE= and
B2BBP_DATA_ATTRIBUTE.type='T'

rowIds_where_B2BBP_DATA_ERROR=

rowIds_where_B2BBP_DATA_ACTION= and B2BBP_DATA_ACTION.type <>
'Service'

rowIds_where_B2BBP_DATA_MESSAGE=

#Nicht ändern

messageIds_template=create table messageIds_to_delete as Select
b2bbp_data_message.messageid From b2bbp_data_message Where
b2bbp_data_message.STARTED between DATE('#from#') and DATE('#to#')

messageIds_drop=messageIds_to_delete

rowIds_template=create table #rowidtable# as Select messageid From
messageIds_to_delete
View Me   Edit Me