2

明らかな何かが欠けているだけですか、それとも Liferay のメッセージ ボードのメッセージに有効期限を追加する合理的または中途半端な方法はありませんか?

最初の問題は、メッセージエディタで有効期限をどのように入力するかです。最も明白な解決策はおそらく expando 属性ですが、日付 (日付と時刻のみ) の expando データ型がないようで、expando 属性に計算された既定値を設定する方法が見つかりません (たとえば、今日 + 6 か月)。デフォルト値がなくても、date+time 属性のデフォルトは 1970 年 1 月 1 日 0:00GMT であり、日付ピッカーを使用して実際の有効期限を入力するのはかなり面倒です。有効期限を入力した後、それを検証する明確な方法はなく (たとえば、今日から今日 + 6 か月の日付に制限する)、日付がメッセージ ビューに表示されるとき、現在のロケールは日付の書式設定に使用されず、時間。

どうにかして有効期限を expando 属性に絞り込むことができたとしても、有効期限を評価する明白な方法はこれ以上ありません。

メッセージが永続化されていても、カウントされず、MB ポートレットに表示されなくても問題ありませんでした。ただし、メッセージにアクセスするための MBThreadServiceUtil のメソッドは、追加のフィルタリング基準を提供しないため、すべてのメッセージをロードし、Java コードでカウント/フィルター操作を実行する必要があります (ほとんど非常に賢い解決策ではありません)。サービス スタックを「ボトムアップ」し、フィルタリングをデータベースに転送できる get メソッドまたは search メソッドを追加します。

推奨される解決策は、期限切れのメッセージを定期的に完全に削除するスケジュールされたタスクを用意することです。MB ポートレットはスコープをサポートしており (メッセージはポートレットのスコープに関連しています)、スケジュールされたタスクはポートレット コンテキスト内で実行されないため、何らかの方法でスコープ ID にアクセスする必要があります。このトピックに関するドキュメントと利用可能なディスカッションを理解している場合、デフォルトのスコープは、ページが属するコミュニティである必要があります。一方、「メッセージ ボード ページ」は組織レベルで追加され、メッセージのスコープ ID は組織 ID にも、組織内のコミュニティの ID にも一致しません。この場合、スコープ ID を決定する方法を知っている人はいますか?

4

1 に答える 1

1

スケジュールされたタスクで作成します-ここでの liferay は Quartz に使用します。 http://liferaysnippets.com/how-to-create-cron-job-in-liferay/

DynamicQueries で保持できる期限切れのメッセージ:

    Calendar c = Calendar.getInstance();
    c.add(Calendar.MONTH, -6);
    Date halfYearAgo = c.getTime();
    ClassLoader portalClassLoader = PortalClassLoaderUtil.getClassLoader();
    DynamicQuery query = DynamicQueryFactoryUtil.forClass(MBThread.class, portalClassLoader)
            .add(PropertyFactoryUtil.forName("lastPostDate").le(halfYearAgo)).addOrder(OrderFactoryUtil.asc("lastPostDate"));

    try {
        List dynamicQuery = MBThreadLocalServiceUtil.dynamicQuery(query);
        for (Object object : dynamicQuery) {
            MBThread thread = (MBThread) object;
            MBThreadLocalServiceUtil.deleteMBThread(thread);
        }
    } catch (SystemException e) {
        e.printStackTrace();
    }
于 2012-05-04T01:02:51.863 に答える