intra-mart Accel Platform IM-MessageHub プログラミングガイド 第3版 2021-04-01

6.2. テンプレートの置換処理の拡張

IM-MessageHub が利用するテンプレート機能は、置換処理を拡張することが可能です。
この章では、その拡張方法を説明します。

注意

この章では「 IM-MessageHub を利用してメッセージを配信する 」で作成したサンプルを利用します。

6.2.1. 置換処理の拡張とは

IM-MessageHub が利用するテンプレート機能では、置換処理時にプログラムによる独自の処理を追加することができます。
例えば、メッセージの属性に格納された「商品コード」を元に、「商品名」をマスタより取得し出力するといった拡張が可能です。

ここでは、メッセージの配信日時「 ${sendDate} 」を、宛先ユーザのタイムゾーンに合わせて変換する方法について説明します。

6.2.2. 置換処理を拡張するための実装クラスを作成する

置換処理を拡張するには、 ReplaceEventHandler インタフェースを実装します。
  • jp.co.intra_mart.foundation.template.handler.ReplaceEventHandler
置換処理を拡張した実装クラスのサンプルは以下のとおりです。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package sample.template.handler;

import java.util.TimeZone;

import jp.co.intra_mart.foundation.i18n.datetime.DateTime;
import jp.co.intra_mart.foundation.message_hub.delivery.model.AccountSource;
import jp.co.intra_mart.foundation.message_hub.delivery.model.DeliveryMessage;
import jp.co.intra_mart.foundation.message_hub.template.TemplateSearchCondition;
import jp.co.intra_mart.foundation.template.TemplateContext;
import jp.co.intra_mart.foundation.template.handler.ReplaceEventHandler;
import sample.message_hub.event.SampleMessageEvent;

public class SampleReplaceEventHandler implements ReplaceEventHandler {

    // このサンプル拡張で取り扱うプレースホルダのキー
    private static final String PLACEHOLDER_SEND_DATE= "sendDate";
    
    @Override
    public boolean isSupported(Object templateSearchCondition) {
        // IM-MessageHub が利用する場合のみ置換処理は有効
        if (!TemplateSearchCondition.class.isInstance(templateSearchCondition)) {
            return false;
        }
        
        TemplateSearchCondition condition = TemplateSearchCondition.class.cast(templateSearchCondition);
        
        // 今回サンプルで作成した SampleMessageEvent でのみこの置換処理は有効
        if (!SampleMessageEvent.class.isInstance(condition.getEvent())) {
            return false;
        }
        
        return true;
    }

    @Override
    public Object onReplace(TemplateContext context, String key, Object value, String... args) {
        final Object returnValue = value;
        
        // このサンプルで扱うプレースホルダの場合のみ置換処理を行う
        if (!PLACEHOLDER_SEND_DATE.equals(key)) {
            return returnValue;
        }
        
        if (!DateTime.class.isInstance(value)) {
            return returnValue;
        }
        
        // TemplateContext に格納されている配信メッセージを取得
        final DeliveryMessage message = context.get(DeliveryMessage.class.getName());
        
        // (先頭の)宛先ユーザのタイムゾーンを取得
        final AccountSource accountSource = message.getTo().get(0).getExtension(AccountSource.class);
        if (accountSource == null || accountSource.getTimeZone() == null) {
            return returnValue;
        }
        
        // メッセージにセットされた DateTime を、宛先ユーザのタイムゾーンに変換
        DateTime original = DateTime.class.cast(value);
        DateTime converted = original.withTimeZone(accountSource.getTimeZone());
        
        return converted;
    }

}
表:実装の詳細
行番号 説明
16
拡張する置換処理に紐づくプレースホルダのキーです。
今回のサンプルでは、テンプレートに ${sendDate} というプレースホルダがあった場合に置換処理を行います。
19
ReplaceEventHandlerisSupported メソッドを実装します。
メソッドの引数(templateSearchCondition)として渡ってくる値は、テンプレートを特定するための情報を表すオブジェクトです。
IM-MessageHub では TemplateSearchCondition クラスのインスタンスが渡されます。
TemplateSearchCondition クラスについては、APIドキュメント「 TemplateSearchCondition 」を参照してください。
今回のサンプルでは、以下の条件をすべて満たす場合にのみ置換処理を実行します。
  • IM-MessageHub によるテンプレートの利用である。
  • 今回のサンプルで作成したイベントによる配信である。
21
この置換処理を、 IM-MessageHub が利用する場合のみ有効とする判定処理です。
具体的には、引数が TemplateSearchCondition クラスのインスタンスであるかをチェックしています。
28
今回のサンプルで作成したイベントによる配信であるかをチェックしています。
36
ReplaceEventHandleronReplace メソッドを実装します。
このメソッドは、テンプレートファイル内のプレースホルダ置換処理が実行される際に呼び出されます。
詳しくは、APIドキュメント「 ReplaceEventHandler 」を参照してください。
40
変換対象のプレースホルダのキー名が、サンプルで扱うキー名と同じであるかを判定しています。
49
TemplateContext から配信メッセージを取得しています。
  • jp.co.intra_mart.foundation.template.TemplateContext
配信メッセージ( DeliveryMessage )に設定されている属性は、テンプレートコンテキスト( TemplateContext )にKey-Valueのペアでコピーされています。
また、配信メッセージ自体も、DeliveryMessage のクラス名をキーとしてテンプレートコンテキストに格納されています。
テンプレートコンテキストの詳細はAPIドキュメント「 TemplateContext 」を参照してください。

今回のサンプルでは、後者の方法を用いて、宛先ユーザのタイムゾーンを取得しています。
52-55, 58-59
メッセージの配信日時を、宛先ユーザのタイムゾーンの日時に変換しています。

なお、IM-MessageHub では、宛先ユーザの「ロケール」と「タイムゾーン」が同一の宛先ごとに配信メッセージが分割されています。この仕様により、今回のサンプルで利用するタイムゾーンは、先頭の宛先ユーザに設定されているタイムゾーンを利用しています。

注意

テンプレートコンテキストから取得できる宛先情報を利用する場合の注意点

テンプレートコンテキストから取得した配信メッセージに設定されている宛先は、 IM-MessageHub によって配信メッセージの分割処理が行われた後のものになります。
そのため、テンプレートコンテキストから取得できる宛先情報は、メッセージ配信アプリケーションが指定した宛先の一部となる場合があります。
(メッセージの分割についての詳細は「 配信メッセージの分割 」を参照してください)
実装したクラスを有効にするためにプロバイダ構成ファイルを作成し、実装クラスの FQCN(完全修飾クラス名)を指定します。
  • META-INF/services/jp.co.intra_mart.foundation.template.handler.ReplaceEventHandler

    sample.template.handler.SampleReplaceEventHandler
    

6.2.3. 置換処理を拡張した結果を確認する

作成した資材を intra-mart Accel Platform 上にデプロイし、拡張した置換処理が正常に動作しているかを確認します。
確認する手順は以下の通りです。
  1. サンプルユーザ(ここでは ueda )のタイムゾーンを「GMT-04:00」に変更します。
    • 今回のサンプルでは、通知処理日時を「 Asia/Tokyo(GMT+09:00) 」で設定しているため、それ以外のタイムゾーンに変更してください。
  2. タイムゾーンを変更した上で、配信処理を実行します。
  3. IMBox の ApplicationBox を表示し、配信された内容を確認します。
正しく配信が行われている場合、以下のメッセージが IMBox の ApplicationBox に表示されます。
../../_images/ueda-extend.png
図:拡張した置換処理が適用されたメッセージ結果