Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた
-
Upload
tasuku-otani -
Category
Technology
-
view
2.863 -
download
0
Transcript of Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた
第 33 回 Alfresco 勉強会Alfresco 5.1 でコンテンツ自動削除を実装してみた( & Alfresco SDK を使った話も少々)
2016/05/25@_tasky
自己紹介 私は…
◦ @_tasky 日頃は…
◦ 株式会社イージフで Alfresco や Liferay をいじってます◦ 2 児 (5 歳♀ , 2 歳♀ ) の父親業やってます◦ Ingress エージェント業も少々
Contents
有効期限の過ぎたコンテンツのアーカイブ コンテンツ自動削除機能の概要 コンテンツ自動削除機能の実装
◦ Alfresco SDK◦ スケジュールジョブ
デモ
有効期限の切れたコンテンツのアーカイブ よくある要件
◦ コンテンツの属性に有効期限を持たせる◦ 有効期限を過ぎたコンテンツを自動的にアーカイブ( or 削除)する
Effectivity (有効性)アスペクトの利用◦ Effective From (有効期限開始日)属性◦ Effective To (有効期限終了日)属性
が、 Effectivity アスペクトを付けたところで、有効期限終了日を考慮して何がしかの処理を行う機能は実装されていない ⇒ これを実装します
コンテンツ自動削除機能の概要 コンテンツの属性に有効期限を持たせる
◦ 前述の Effectivity (有効性)アスペクトを使い、コンテンツにEffective From (有効期限開始日)と Effective To (有効期限終了日)を設定する ⇒ Alfresco のルール機能を使うと自動的に Effectivity アスペクトを付与することができる
有効期限を過ぎたコンテンツを自動的に削除する◦ 日次バッチ等を想定し、スケジュールジョブとして実装する◦ “Effectivity アスペクトを持つ && Effective To の値 < 今日”なコンテンツを削除する
⇒ Alfresco の一般的な Scheduled Job と同じ形で実装する
コンテンツ自動削除機能の実装 Alfresco SDK (昔の Maven Alfresco SDK )を使って開発
◦ Alfresco Repository (Platform) のみのカスタマイズ プロジェクトの作成方法は以下の記事を参照
http://www.slideshare.net/terajun/alfresco26-alfresco-sdk
主要なポイントは以下のとおり◦ アーキタイプ : org.alfresco.maven.archetype:alfresco-amp-
archetype 2.2.0 (Alfresco Repository AMP アーキタイプ )◦ 生成された pom.xml の修正
<alfresco.version>5.1.f</alfresco.version>◦ Eclipse の Maven build Configuration
Goals : install Profiles : amp-to-war JRE : JavaSE-1.8 VM arguments : -Xms1G -Xmx2G -noverify
コンテンツ自動削除機能の実装 config/alfresco/module/content-archive-sample/content/
service-context.xml◦ Spring bean 定義ファイル◦ ジョブ実装、ジョブ実体、トリガを定義
config/alfresco/module/content-archive-sample/alfresco-global.properties◦ bean 定義が参照するジョブ実行タイミング等を設定
IneffectiveContentArchiver.java◦ ジョブ処理内容の実装クラス
IneffectiveContentArchiveJob.java◦ ジョブ実体を表すクラス◦ bean 定義で指定された処理を実行する
service-context.xml
ineffectiveContentArchiver : ジョブ処理内容の実装定義 ineffectiveContentArchiverJobDetail : ジョブ実体定義 ineffectiveContentArchiverTrigger : ジョブのスケジュール実行定義
<bean id="ineffectiveContentArchiver" class="jp.aegif.alfresco.repo.content.archive.IneffectiveContentArchiver"> <property name="searchService" ref="searchService" /> <property name="nodeService" ref="nodeService" /> <property name="transactionService" ref="transactionService" /></bean><bean id="ineffectiveContentArchiverJobDetail" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass" value="jp.aegif.alfresco.repo.content.archive.IneffectiveContentArchiveJob" /> <property name="jobDataAsMap"> <map> <entry key="ineffectiveContentArchiver"> <ref bean="ineffectiveContentArchiver" /> </entry> <entry key="jobLockService"> <ref bean="jobLockService" /> </entry> </map> </property></bean><bean id="ineffectiveContentArchiverTrigger" class="org.alfresco.util.CronTriggerBean"> <property name="jobDetail" ref="ineffectiveContentArchiverJobDetail" /> <property name="scheduler" ref="schedulerFactory" /> <property name="cronExpression" value="${ineffective.content.archive.cronExpression}" /> <property name="startDelay" value="${ineffective.content.archive.cronStartDelay}" /></bean>
alfresco-global.properties
ジョブ実行タイミング等を設定 bean 定義から参照される ineffective.content.archive.cronExpression :
◦ ジョブ実行タイミングの cron 表記◦ Quartz の cron フォーマットに従うので ”秒 分 時 日 月 曜日”
ineffective.content.archive.cronStartDelay : ◦ サーバ起動時の実行遅延(ミリ秒)
ineffective.content.archive.cronExpression=0 * * * * ?ineffective.content.archive.cronStartDelay=60000
IneffectiveContentArchiver.java
Effectivity アスペクトを持ち、かつ Effectivity To (cm:to) 属性が今日より古いコンテンツを検索する ヒットしたコンテンツを削除する
◦ 正確には、ゴミ箱に入りますpublic void execute() { transactionService.getRetryingTransactionHelper().doInTransaction( new RetryingTransactionCallback<Object>() { @Override public Object execute() throws Throwable { String query = "+ASPECT:\"cm:effectivity\" +@cm\\:to:[MIN TO NOW]"; ResultSet rs = null; SearchParameters sp = new SearchParameters(); sp.setLanguage(SearchService.LANGUAGE_LUCENE); sp.addStore(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE); sp.setQuery(query); rs = searchService.query(sp); for (NodeRef nodeRef : rs.getNodeRefs()) { nodeService.deleteNode(nodeRef); } logger.debug("Archive " + rs.length() + " nodes"); return null; } });}
IneffectiveContentArchiveJob.java
AbstractScheduledLockedJob を継承すると cluster aware なJob になる
bean 定義の jobDataAsMap で指定されたジョブ実装を読み込んで実行するpublic class IneffectiveContentArchiveJob extends AbstractScheduledLockedJob implements StatefulJob { @Override public void executeJob(JobExecutionContext context) throws JobExecutionException { JobDataMap jobDataMap = context.getJobDetail().getJobDataMap(); Object ineffectiveContentArchiverObject = jobDataMap.get("ineffectiveContentArchiver"); if (ineffectiveContentArchiverObject == null || !(ineffectiveContentArchiverObject instanceof IneffectiveContentArchiver)) { throw new AlfrescoRuntimeException("Invalid JobData for IneffectiveContentArchiveJob"); }
final IneffectiveContentArchiver ineffectiveContentArchiver = (IneffectiveContentArchiver)ineffectiveContentArchiverObject; AuthenticationUtil.runAsSystem(new RunAsWork<Object>() { @Override public Object doWork() throws Exception { ineffectiveContentArchiver.execute(); return null; } }); }}
テスト用 Alfresco Share の準備 Alfresco Repository AMP アーキタイプを使うと、テスト用 Tomcatの起動ができる ただし、 Alfresco Repository (Platform) しか起動しないので、別途
Alfresco Share を起動する必要がある ⇒ Alfresco Share AMP アーキタイプを使って Maven Project を作成し、テスト用 Alfresco Share を起動する
主要なポイントは以下のとおり◦ アーキタイプ : org.alfresco.maven.archetype:share-amp-archetype 2.2.0◦ 生成された pom.xml の修正
<alfresco.version>5.1.f</alfresco.version> spring-surf-api dependency の記述変更
◦ Eclipse の Maven build Configuration Goals : install Profiles : amp-to-war Parameter : dependency.surf.version=6.3 JRE : JavaSE-1.8
<dependency> <groupId>org.alfresco.surf</groupId> <artifactId>spring-surf-api</artifactId> <version>${dependency.surf.version}</version> <scope>provided</scope></dependency>
デモ 環境
◦ Windows 10◦ Alfresco Community Edition 5.1.f◦ Alfresco SDK 2.2.0
URL◦ Alfresco Repository : http://localhost:8080/alfresco/◦ Alfresco Share : http://localhost:8081/share/
サンプルコードhttps://bitbucket.org/tasuku_otani/content-archive-sample
まとめ 有効期間を過ぎたコンテンツを自動削除するスケジュールジョブを作った 課題
◦ 有効期限終了日当日のコンテンツも削除しちゃってる◦ 削除じゃなくてアーカイブしたい
おまけ aegif Labo blog やってます
http://aegif-labo.blogspot.jp/
2016/05/17 に Alfresco Community Edition 5.1.g がリリースされました◦ 5.1.f との差分は ImageMagick 脆弱性 (ImageTragick) 対応のみhttps://wiki.alfresco.com/wiki/Community_file_list_201605-GA