intra-mart Accel Platform IM-MessageHub プログラミングガイド 第2版 2015-12-01

5.3. 配信クラスを作成する

次に、 IM-MessageHub が配信するメッセージを受け取り、配信先メディアへ展開する配信クラスを作成します。
今回は、 IM-MessageHub から渡されるメッセージを標準出力に配信(出力)するサンプルを作成します。

5.3.1. 配信クラスの実装

AbstractMessageDeliverer クラスを継承し、メッセージ配信処理を実装してください。
  • jp.co.intra_mart.foundation.message_hub.delivery.AbstractMessageDeliverer
配信クラスの作成例は以下の通りです。
  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
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
package sample.message_hub.delivery;

import jp.co.intra_mart.foundation.message_hub.delivery.AbstractMessageDeliverer;
import jp.co.intra_mart.foundation.message_hub.delivery.MessageHubDeliverException;
import jp.co.intra_mart.foundation.message_hub.delivery.model.DeliveryMessage;
import jp.co.intra_mart.foundation.template.TemplateResult;

public class SampleMessageDeliverer extends AbstractMessageDeliverer<TemplateResult> {

    private final String HEADER_SUBJECT = "subject";
    
    private final String HEADER_URL = "url";
    
    @Override
    protected void deliver(TemplateResult templateResult, DeliveryMessage message) throws MessageHubDeliverException {
        // メッセージのヘッダー情報を取得
        String headerSubject = templateResult.getHeader(HEADER_SUBJECT);
        String headerUrl = templateResult.getHeader(HEADER_URL);
        
        // 配信エラーログの出力(ヘッダー情報が正しく取れなかった場合)
        if (headerSubject == null || headerUrl == null) {
            writeErrorLog(message, message.getTo());
            return; // 処理中断
        }
        
        // メッセージの本文を取得
        String body = templateResult.getBody();

        // 配信エラーログの出力(メッセージ本文が正しく取れなかった場合)
        if (body == null){
            writeErrorLog(message, message.getTo());
            return; // 処理中断
        }
        
        // 配信処理
        stdoutBodyMessage(body);

        // 配信成功ログの出力
        writeSuccessLog(message, message.getTo());
        
        /**
         * [参考]
         * 以下の処理は、引数の値がどの様な値として渡され、取得/利用可能かを表す補足となります。
         */
        
        // 引数の値の表示(Header)
        stdoutHeaderInfo(headerSubject, headerUrl);
        
        // 引数の値の表示(message)
        stdoutMessageDetail(message);
    }
    
    /**
     * 本文を標準出力へ配信(出力)します。
     * 
     * @param body 本文情報
     */
    private void stdoutBodyMessage(String body) {
        StringBuilder logBuilder = new StringBuilder();

        logBuilder.append("\n===== [BODY] =====\n");
        logBuilder.append(body);
        logBuilder.append("===== [BODY-END] =====\n");
        
        System.out.println(logBuilder.toString());
    }
    
    /**
     * [参考]
     * ヘッダー情報を標準出力へ出力します。
     * 
     * @param subject サブジェクト
     * @param url URL
     */
    private void stdoutHeaderInfo(String subject, String url) {
        StringBuilder logBuilder = new StringBuilder();
        
        logBuilder.append("\n===== [HEADER] =====\n");
        
        logBuilder.append("[SUBJECT] ").append(subject); // サブジェクト
        logBuilder.append("\n[URL] ").  append(url); // URL
        
        logBuilder.append("\n===== [HEADER-END] =====\n");
        
        System.out.println(logBuilder.toString());
    }
    
    /**
     * [参考]
     * 配信予定のメッセージ詳細を標準出力へ出力します。
     * 
     * @param message 配信用メッセージ
     */
    private void stdoutMessageDetail(DeliveryMessage message) {
        StringBuilder logBuilder = new StringBuilder();
        
        logBuilder.append("\n===== [MESSAGE-DETAIL] =====\n");
        logBuilder.append("[EVENT] ").          append(message.getEvent().getId()); // イベントID
        logBuilder.append("\n[FIRST_TO_NAME] ").append(message.getTo().get(0).getName()); // 最初の宛先ユーザ名
        logBuilder.append("\n[FROM_NAME] ").    append(message.getFrom().getName()); // 送信者ユーザ名
        logBuilder.append("\n===== [MESSAGE-DETAIL-END] =====\n");
        
        System.out.println(logBuilder.toString());
    }
}
表:実装の詳細
行番号 説明
15
AbstractMessageDeliverer#deliver をオーバーライドし、配信先メディアへの配信処理を実装します。
メソッドの引数として渡ってくる値の詳細は以下の通りです
  • templateResult(TemplateResult)

    テンプレートの変換後の処理結果を反映したクラスです。
    このクラスには、プレースホルダを置換済みのヘッダー情報や、本文情報が含まれています。


  • message(DeliveryMessage)

    配信用のメッセージモデルクラスです。
    このクラスには、ユーザレベルに解決済みの差出人情報や宛先情報、配信の契機となったイベント情報などが含まれています。
    なお、ここで取得できる宛先情報は分割済みの宛先情報となります。
    メッセージの分割についての詳細は「 配信メッセージの分割 」を参照してください。
17-18 テンプレートのヘッダー情報を、 TemplateResult クラスから取得します。
27 テンプレートの本文情報を、 TemplateResult クラスから取得します。
22, 31
メッセージ配信に必要な情報が正常に取得出来なかった場合、配信エラーログを出力し処理を中断します。
ログの種類については「 ログの種類と出力方法 」を参照してください。
36
テンプレートの本文を、標準出力に配信(出力)します。
この処理が、サンプルの実際の「配信処理」となります。
39
メッセージ配信が正常に行われた場合、配信成功ログを出力します。
ログの種類については「 ログの種類と出力方法 」を参照してください。
47
テンプレートのヘッダーに設定された情報を出力します。
50
配信メッセージから取得可能な情報のいくつかを出力します。

5.3.1.1. ログの種類と出力方法

AbstractMessageDeliverer には、メッセージ配信に関するログを出力するためのメソッドが用意されています。
AbstractMessageDeliverer に用意されているログ出力用のメソッドは以下の通りです。
(各メソッドの引数、および、その詳細は、APIドキュメント「 AbstractMessageDeliverer 」を参照してください)
  • writeSuccessLog

    • メッセージの送信に成功したことを示す情報ログを出力します。
  • writeSkipLog

    • メッセージの送信をスキップしたことを示す情報ログを出力します。
  • writeWarningLog

    • メッセージの送信に失敗し、以降の処理をスキップしたことを示す警告ログを出力します。
  • writeErrorLog

    • メッセージの送信が失敗したことを示すエラーログを出力します。
配信処理実装時には、利用用途に応じて適切なログ出力を行ってください。