tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:データローダバッチを使った別システムとのデータ連携について

Salesforceと別システムを連携するときですが、データローダのバッチモードの機能を利用してデータ連携の仕組みを構築できます。リアルタイムでの連携はできませんが、API連携などに開発をリソースを確保できない場合などに便利です。

f:id:tyoshikawa1106:20191008182618p:plain

データローダをバッチモードで使用する際の設定手順


以前まとめた開発のイメージと注意点についてです。


データローダバッチでデータ連携するときの処理の流れは下記のようになります。

1. Salesforce側にデータを登録
2. Windowsのタスクスケジューラ機能でデータローダバッチ実行
3. バッチ処理実行によりSalesforceのデータをCSVファイル形式で出力
4. 出力したCSVファイルを既存システム側へ取り込む

※上記と同じような感じでSalesforce側にCSVデータを取り込んでデータ作成することも可能です。(INSERT or UPSERT)


一般的にデータローダバッチを使ったデータ連携は下記のような構成になると思います。
f:id:tyoshikawa1106:20191008185832p:plain


例えば取引先データを他システムに連携する場合、データローダバッチのエクスポート処理を実装することで取引先データをそのままCSV形式で出力可能です。
CSVファイルができればあとは他システム側でCSV取込の処理を実装して連携完了です。


・・・ですがSalesforceと他システムでデータの持ち方が異なる場合があります。他システム側でCSVファイルを取り込んでデータ登録する際に形式の変換処理を行うことで対応は可能ですが、他システム側の開発に大きな負担が発生します。



そこで下記の方法が良いと思います。
f:id:tyoshikawa1106:20191008190114p:plain


連携対象をカスタムオブジェクトで管理する方法です。直接取引先などのオブジェクトを出力対象にするのではなく、カスタムオブジェクトを経由することで数式によるデータの加工や連携対象となったデータが何件存在しているかの確認が可能となります。その他連携時にトラブルが発生した場合でも、取引先の場合は業務開始と同時にバンバン更新されますが、カスタムオブジェクトで管理していることでエラー発生時のデータをそのまま残すことが可能です。


データ連携の出力データを作成するために取引先データを元にカスタムオブジェクトのデータを作成する処理が必要になりますが、Apexバッチを開発することで用意に実現できます。


基本的にSalesforce側で開発を行うのは、既存システムで機能追加するよりも容易に実装しやすいと思いますので、CSV出力時にそのまま取り込めるようなデータ形式に調整しておく構成が良いと思います。

データローダバッチで運用するときの注意点

実際に運用してみて下記のトラブルに遭遇しました。

トラブル発生時の状況
  • データローダバッチで出力するオブジェクトは2つ。
  • 出力実行はWindowsのタスクスケジューラ
  • タスクスケジュールから起動するバッチ処理内では、2つのオブジェクトのエクスポート処理を同時に呼び出し。
トラブルの内容
  • 2つのオブジェクトのうち、1つのオブジェクトのCSVデータが空。(運用開始直後は問題なかった。。)
  • Windowsタスクスケジューラは正常に実行されていた。
  • CSVファイル自体はできていたのでバッチ処理は起動している。
解決方法

上記トラブルが発生したのですが、運用開始から数日は問題なく動作していることもあり原因がわかりませんでした。ですが、おそらく2種類のオブジェクトのエクスポート処理を同時に実行したことが理由であると判断しました。実際に出力処理を別にわけて(2つめは30分後に実行)から様子を見たところ、出力結果が0件のトラブルは発生しなくなりました。


SalesforceからApexバッチを同時に実行しても数件はキューとして保持されるためエラーにならずに処理が実行できますが、ローカル環境で動くデータローダの起動を同時に行うのは無理があったと思います。(もともと人の手で操作して処理を行うツールのためそういう使い方は正しくない)

データローダバッチとログ出力

データローダバッチ処理の実行結果を残しておきたい場合があると思います。その場合は「config.properties」ファイル内の設定で設定可能です。

f:id:tyoshikawa1106:20191008193050p:plain


主にエクスポート処理時のための設定と思いますが、「process.enableExtractStatusOutput=true」とすると処理結果のログを残すことができます。(INSERTは特に指定してなくてもログが自動で生成された気がします。)


出力結果はlogフォルダに出力される。
f:id:tyoshikawa1106:20191008193251p:plain


出力先は「process-conf.xml」ファイル内で指定も可能
f:id:tyoshikawa1106:20191008193407p:plain


データ連携ですが、予期せぬエラーなどトラブルが発生することを想定する必要があります。ログを残したりは必ずやっておいた方が良いと思います。

データローダバッチの開発者ガイド

バッチモードについてもドキュメントがまとめられています。ログイン情報の暗号化や各種設定情報のカスタマイズはこちらで確認するのが良いと思います。

f:id:tyoshikawa1106:20191008193730p:plain

バッチモードでの実行 (Windows のみ)