Challenge Engineer Life !

エンジニア人生を楽しみたい!仕事や趣味で学んだ技術的なことを書いていくブログです。

SalesforceからSendGridを利用してメール送信する!

この記事は「SendGrid Advent Calendar 2016」の13日目の記事です。
昨日は @azumakuniyuki さんの「SendGridへリレーする方法、MTA3種盛り。」でした。
明日は @nakansukeさん の「Amazon SESとの比較」です。

Salesforce World Tour Tokyo 2016

本日からSalesforce World Tour Tokyo 2016が開催されますね。SendGridチームは明日12/14(水)、開発者向けの「Developer Forest*1に出展します!私もスタッフとして立っていると思うので、もしご興味ある方は是非ご参加ください!

ということで、今日はSalesforceにおけるメール送信について書いてみたいと思います。

なお、私自身、Salesforceを触ったり、連携するシステム開発の経験はありますが、Salesforce系の資格とか、ゴリゴリApex書いたとか、の経験はありません(>_<;今回のエントリは、自分で調べた範囲の知識にて、もし間違いがあった場合などはご指摘いただけると嬉しいです(^^;

Salesforceにおけるメール送信

Salesforceでは、リードや取引先責任者へメールを送ったり、ワークフローの承認でメールを送ったり、様々な用途、タイミングでメールが利用されます。メール送信に関しては、ざっと調べた範囲でも以下の選択肢があると思います。

機能カテゴリ 機能
Salesforce標準*のメール送信機能 リードへの一括メール送信
取引先責任者への一括メール送信
ワークフロー・承認申請のメールアラート
メール to ケース
メール to Salesforce
Apex(メールサービス) Apexプログラムによるメール送信
メールリレー 既存SMTPサーバをリレーサーバとして利用
AppExchange Sendmail(Salesforce Labs)
Autobahn for AppExchange
Synergy!LEAD
外部サービス(Lightning限定) Gmail
Office 365

他にもあるかもしれません。

せっかくなので、表の中のいくつか試してみます。

取引先責任者への一括メール送信

取引先責任者のツールメニューに「取引先責任者の一括メール送信」があります。

f:id:kikutaro777:20161212162253p:plain

宛先にする責任者をビューから選択します。

f:id:kikutaro777:20161212162307p:plain

メールテンプレートはSalesforceで標準にあったものから適当に選びました。

f:id:kikutaro777:20161212162323p:plain

一括メール送信名を入れて、「送信」ボタンを押すだけです。

f:id:kikutaro777:20161212162334p:plain

ちなみにこの一括メール送信名によって、管理メニューの「監視」->「一括メール送信」の一覧を識別できるようです。

f:id:kikutaro777:20161212183308p:plain

f:id:kikutaro777:20161212183336p:plain

送信完了を確認したら

f:id:kikutaro777:20161212162352p:plain

メールが届いているか確認します。おー、来てますね。

f:id:kikutaro777:20161212162454p:plain

さすが標準機能、手軽です。

外部サービス(Gmail)

表の一番下に入れた「外部サービス」はLightningだけで使える機能なんですね。せっかくなので、これもちょっと試してみました。管理メニューの「メール管理」から「外部サービス」メニューを選択します。

f:id:kikutaro777:20161212161442p:plain:w100

GmailとOffice 365が選べるのですが、今回はGmailを選択しました。右のボタンを「ON」に切り替えます。

f:id:kikutaro777:20161212160921p:plain

あとは「Lightning Experienceに切り替え」ます。

f:id:kikutaro777:20161212161206j:plain

ちなみにLightningへの切替は事前に環境を確認して行ってくださいm(_ _)mまぁSalesforce側で設定変更前に色々確認メニューでるので、ここではこの程度にしておきます。

切り替えた後、取引先責任者一覧へ。

f:id:kikutaro777:20161212165442p:plain

Lightningめっちゃ綺麗(/・ω・)/

メールの部分をみると、Gmailの選択肢がでます!

f:id:kikutaro777:20161212165730p:plain

メールエディタが組み込まれます。
f:id:kikutaro777:20161212170204p:plain

試しに送信すると、ちゃんと届きます。
f:id:kikutaro777:20161212170416p:plain

すごい。便利w

これらの機能はSalesforceで標準的に用意されており、統合された機能として使いやすいです。一方で、一部ガバナ制限を受けるケースがあったり、テンプレートを作成する際に、Web上でのエディタのようなものがなく少し手間だったり、という点もあるかと思います。ここはここでAppExchangeでカバーされる製品もあるとは思います。

なお、どういう制限があるのか、などQA的なものは以下が良さそうでした。

Salesforceのメール送信 ポイント集
help.salesforce.com

では次に、ここに挙げた選択肢以外でどのようなものがあるのか?というところで、SendGridを利用した方法を試したいと思います。

SalesforceでSendGridを利用したメール送信

SalesforceでSendGridを利用する方法としては、以下の選択肢があると思っています。

方式 方法 利用可能有無 補足
メールリレー × 一番シンプルな方法と思いますが、こちらにあるようにSalesforce側がID/Passの認証対応が現状できないようです。このスレ、相当みなさん文句言っていて面白い…
Apex sendgrid-apex 実はSendGridからApex用のラッパーライブラリがGitHubで公開されてます。詳細は後程。
SendGrid APIを直接叩く 今回時間がなくて試せなかったのですが、Apexでhttpコールができるのであれば、普通にSendGridのAPIをコールすることも
API連携 一番堅実で、SalesforceのSOAPかRESTのAPIで取引先責任者とかメアド取ってきて、SendGridのAPIで送信という形です。

Salesforceのメールリレーの設定は以下のようになっていています。

f:id:kikutaro777:20161212172412j:plain

SendGridでは、SMTPサーバにログインして直接使うこともできるのですが、当然ながらSMTPサーバのユーザIDとパスワードが必要です。しかし、Salesforceの設定ページでは特にそういう設定部がなく…現状、以下ページに書かれているように対応されていないようです。

success.salesforce.com

3つ目のApexでREST APIをコールする部分は今回調べきれなかったです。JavaでいうHttpClientとかJersey Clientみたいなライブラリがつかえると楽なのでしょうが…この辺Apexはどうなっているんでしょうか。。。

また、4つ目のAPI連携は下図のようなイメージです。

f:id:kikutaro777:20161213151606p:plain

今回のAdventでは細かく触れませんが、SalesforceのAPIをJavaで触ったとき(SOAP APIですが)のエントリは前に書いたので、興味ある方はどうぞm(_ _)m

kikutaro777.hatenablog.com

この方法が一番堅実だと個人的には思います。

Apex with SendGrid

さきほど、Apexで利用可能なライブラリがGitHubにあると書きましたが、以下となります。ただ、最終コミットの日付をみていただくとわかるのですが、数年前で止まったままとなっております。

github.com

以降で書くのは、あくまでも私がサンプル的に試したものであり、公式に利用可能であるということは保証できないのでよろしくお願い致します。実際、SendGridでは既にv3というAPIに移行していますが、このApexラッパーのコードを確認すると、v2のラッパーとなっていたりします。

色々ガードはってしまいましたが、早速、試してみましょう。

Salesforceにログインした状態で、GitHubのInstallationの下に表示されているURLをクリックします。
f:id:kikutaro777:20161212171942j:plain

今回は管理者のみでインストールしました。
f:id:kikutaro777:20161212173316j:plain

アクセスの承認をします。ここの2個目はちょっとよくわからず、とりあえず1個目だけチェックしています。
f:id:kikutaro777:20161212173329j:plain

「インストール完了!」と出ればOKです。
f:id:kikutaro777:20161212173340j:plain

開発者は通常EclipseとかでApex触るのだと思いますが、今回は簡単なサンプルなので「開発者コンソール」で進めます。
f:id:kikutaro777:20161212173504j:plain

Apexクラスを作成します。「SendGridController」クラスにしました。
f:id:kikutaro777:20161212173534j:plain

中身は以下のような感じ。お試しされる方は、ID/パスワード/メアドは本物に置き換えてください。
f:id:kikutaro777:20161212173544j:plain

public class SendGridController {

    public void sendMail() {
        SendGrid sendgrid 
            = new SendGrid('sendgridのログインID', 'sendgridのログインパスワード');
        
        SendGrid.Email email = new SendGrid.Email();
        email.addTo('テストで送る宛先メールアドレス');
        email.setFrom('送信元fromのメールアドレス');
        email.setSubject('SalesforceのApexからテスト送信');
        email.setText('Salesforceからこんにちは');
        
        sendgrid.send(email);
    }

}

続いてページを作成します。「Visualforce Page」を選択します。
f:id:kikutaro777:20161212173655j:plain

「SendGridPage」という名前にしました。
f:id:kikutaro777:20161212173703j:plain

中身は以下のように定義。Java EEなどでJSFに慣れていると楽ですね(^^;

<apex:page controller="SendGridController">
    <apex:form>
        <apex:commandButton id="btnSendMail" 
            action="{!sendMail}" value="SendGridでメール送信" />
    </apex:form>
</apex:page>

ページを開いてみます。URLで「https://x.xx2.visual.force.com/apex/SendGridPage」のようにページ名を直接打ってもいいです(xxの辺りはSandboxごとに異なる)し、設定メニューの「ビルド」->「開発」->「Visualforceページ」を選択して
f:id:kikutaro777:20161213141717p:plain:w100

矢印マークからページを起動することもできます。
f:id:kikutaro777:20161213141728p:plain

こんな感じ。
f:id:kikutaro777:20161212174109p:plain

ボタンを押すと、宛先で指定したメールアドレスに送信されます。簡単ですね。

ただ、実際の業務系では、メアドを直接Apexに埋め込むようなコードは書かないですし、こんな画面のユースケースはないと思います。

そこで、取引先責任者のテーブルを作り、メール送信用ボタンをカラムに配置してみたいと思います。その前に、素のままだと見た目があまりにもダサすぎるので、今回VisualStrapを使いました。BootstrapをVisualforceで簡単に使えるようにしてくれるものです。以下ブログが詳しかったです。

tyoshikawa1106.hatenablog.com

先ほどと同じようにApexのクラス(コントローラ)とVisualforceページを以下のように作成しました。今度は先にビューの定義から

<apex:page controller="SendGridTableController">
    <vs:importvisualstrap />
    <vs:visualstrapblock >
        <vs:pageheader title="SendGridによるメール送信" subtitle="デモ" />
        <apex:form >
            <vs:panel >
                <apex:dataTable value="{!contacts}" var="contact" styleClass="table table-striped table-bordered">
                    <apex:column >
                        <apex:facet name="header">取引先担当責任者名</apex:facet>
                        <apex:outputText >{!contact.name}</apex:outputText>
                    </apex:column>
                    <apex:column >
                        <apex:facet name="header">メールアドレス</apex:facet>
                        <apex:outputText >{!contact.email}</apex:outputText>
                    </apex:column>
                    <apex:column >
                        <apex:commandLink styleClass="btn-sm btn-primary" id="btnSendMail" action="{!sendMail}" value="SendGridでメール送信">
                            <apex:param name="email" value="{!contact.email}"/>
                            <apex:param name="name" value="{!contact.name}"/>
                        </apex:commandLink>
                    </apex:column>
                </apex:dataTable>
            </vs:panel>
        </apex:form>
    </vs:visualstrapblock>
</apex:page>
public class SendGridTableController {
    public List<Contact> listContacts;
    
    public void sendMail() {
        String mailTo = System.currentPageReference().getParameters().get('email');
        String name = System.currentPageReference().getParameters().get('name');
        
        //ホントはここで毎回newしないようにするべき
        SendGrid sendgrid
            = new SendGrid('sendgridのログインID', 'sendgridのログインパスワード');
        
        SendGrid.Email email = new SendGrid.Email();
        email.addTo(mailTo);
        
        email.setFrom('送信元fromのメールアドレス');
        email.setSubject('SalesforceのApexからテスト送信');
        
        List<String> subs = new List<String> {name};
        email.addSubstitution('name', subs);
        
        email.addCategory('Salesforce');
        
        email.setHtml('メールコンテンツ');
        sendgrid.send(email);
    }
    
    public List<Contact> getContacts() {
        if(listContacts == null) {
            listContacts = [SELECT Name, Email FROM Contact];
        }
        return listContacts;
    }
}

上記コードにありますが、差し込み(Substitution)カテゴリなどもちゃんと使えます。

で、画面を開くと以下のように取引先責任者一覧が表示されて、各行にメール送信のボタンが付きます。これで送りたい相手のボタンを押せば送れます。ホントはチェックボックス付けたり、がいいのでしょうけど…。
f:id:kikutaro777:20161212182129p:plain

よく考えたらVisualStrapじゃなくて、Lightningで作ってみればよかったな(^^;このVisualforceページをLightningでみたらどうなるんだろう‥と思って切り替えてみたのですがLightning内から開くとVisualforceページが別ウィンドウで呼ばれるんですね(^^;なるほど。

ちなみに、メールの中身ですが、このApexを利用して、以下のようなレスポンシブメールも送信できました!(上記コード内の「email.setHtml('メールコンテンツ');」の部分を変えて)

PC
f:id:kikutaro777:20161213154615j:plain

モバイル

f:id:kikutaro777:20161213142401p:plain:w250

ホントはこの部分もどのようにやったか書こうと思ったのですが、この辺はまたどこかで別途紹介したいと思います。

ちなみに上のサンプルメールはSendGridのマーケティングキャンペーンに関するものをサンプルとしたのですが、最近リリースされた機能なので是非お試しください。以下関連ブログですー。

sendgrid.kke.co.jp

sendgrid.kke.co.jp

*1:SendGridブースへお越しいただく方は、虎ノ門ヒルズフォーラム5Fなので、プリンスパークタワーへ行かないようご注意ください…

JJUGナイトセミナー Javaクラウドプラットフォーム大特集に参加しました!

今日のJJUGナイトセミナーは超豪華でした!仕事を置いてきてでも参加してホント正解(^^)!会社後輩は1人しか来なかった…のですが、ホントもったいないと思う…。

jjug.doorkeeper.jp

発表は以下順番でした。

  1. Heroku
  2. Amazon Web Service
  3. Microsoft Azure
  4. Oracle Java Cloud Service
  5. Cloud Foundry
  6. Google Cloud Platform
  7. OpenShift
  8. IBM Bluemix

当日のつぶやきは既に@yamadamnさんにてまとめられています!

以下、発表者の方のスライドと、過去に自分が触ったときの記事とか合わせて簡単に。

Heroku

Herokuは前にSalesforce Summer(だったかな?)に参加したときに、セッションを聞いて触ってみてました。当時の自分は、Heroku = Ruby on Railsのイメージが凄く強かったのですが、実際に触ってみると、Javaも簡単に動かせて驚いた記憶があります。

今日の発表でも「Spark」に少しだけ触れられてましたが、Sparkのひな形が用意されていて、そこからPayara Microいけるんじゃ?って思った記憶が。

ということで、以前試したHeroku

kikutaro777.hatenablog.com

とPayara Microについて

なお、タイトルにある「12-Factor App」は以下。

12factor.net

日本語訳もあるですね。

12factor.net

AWS

自己紹介の話を聞いてJavaFXの話が聞きたくなりました(^^)w

AWSのBeanstalkは、Docker + GlassFishが使えると聞いて、前に試してました。これも手軽なんですよねー。

kikutaro777.hatenablog.com

他のPaaSに比べて中身の透明性がある(AWSの仕組みで構成されているという意味で)、というのはなるほどーという感じでした。

Azure

OracleでMicrosoftのてらださんがお話をされるという、聞いてる側もまだ何だか不慣れな感じでした(^^;笑

今のMicrosoftはすごくオープン、と強調されてましたが、色んなニュースが続きますよね。

MSがEclipse Foundationに参画したり
www.publickey1.jp

ASP.NETがLinuxで動くとか、先日なんてMS SQL Server on Linuxとか、「は!?」って感じですよね(^^;

jp.techcrunch.com

Azureは自分も一時期いろいろ触ってました。記事としては古いので注意ですが。

kikutaro777.hatenablog.com

Oracle Java Cloud Service

OracleさんのPaaSはまだ触ったことがないのですが、Java Cloud ServiceとApplication Container Serviceの2種類があるとのこと。両方ともFlight Recorderが使える辺りは便利そうですよね。
無料お試しとかあるのかな…。なんとなく気軽に触ってみることができるのか、気になりました。

あと、Java Cloud ServiceはWebLogicだけなのがちょっと残念。GlassFishがあれば…。

Cloud Foundry

Cloud Foundry、よく名前は聞くのですが、全然触ったことないのと、前提知識が薄かったので、今日の@makingさんの発表で勉強になりました!

個人的には「.NETが動く」というのに驚きました。Azure以外でそんなのあるのか!と

3/31にCloud Foundry Tokyo Meetupイベントがあるとのことです!
www.meetup.com

あと、発表者の@makingさんから教えて頂きましたが.NETまわりの仕組みとか聞けるかもです(^^)これはいってみたい。

ハンズオン形式のワークショップもあるそうです。

connpass.com

connpass.com

Google Cloud Platform

やっぱりGoogleの基盤はすごそうだなーと。そして日本にデータセンターという話もホットだったんですね。

www.nikkei.com

OpenShift

Red HatのOpenShiftは、今、自分の中では一番良く利用するPaaSです。発表にもありましたが、無料で使えるPaaSが減ってる中、Java EEのAPサーバ含めて無償枠があるのが嬉しいです。

OpenShift Onlineは現在v2で、v3からはDockerを主軸としたアーキテクチャでガラっと中身を変えたとのこと。

もうすぐv3版のOnlineもでるとのことで、個人的に超たのしみです。

@nekopさんがブログ書かれていました。

nekop.hatenablog.com

OpenShiftを初めて触ったときのエントリもありました(^^;

kikutaro777.hatenablog.com

ちなみに、最近乃木坂46にどハマりしてる自分なのですが、OpenShift上のWildFly + Twitter4Jで以下アプリのっけてます。

Sakamichi46 Collection

作成動機などは以下(^^;;

nogizaka46.hatenablog.jp

脱線しすぎました。

IBM Bluemix

資料はまだでしたが、Blumixも色々面白そうですよね。話題のWatson君とか、IoT関係なども。


ということで、ホントすごく豪華でした!どのPaaSにするか、やっぱり色々触ってみるのがいいですよね(^^)自分の場合は8個中4個は触ったことありますが、少し前なので、それぞれ色々変わってる気がします。触ったことがない中では、やっぱりCloud Foundryが一番気になりました。

触ってみよー。

SalesforceのInvalid Session IDエラーにハマった話

今ずっとSalesforceと連携するシステムを扱ってるのですが、テストフェーズでハマって苦労したエラーを備忘として書いておきます。

連携はSalesforceが提供する標準APIベース(今回はRESTでなくSOAP使ってます)なのですが、頂いた話としては、権限とか色々大変なので、連携専用ユーザを作って処理する、というものでした。

ログイン判定自体はOAuth使ってログイン者基準なのですが、それ以降の連携通信では専用ユーザ、という少し特殊な形です。

で、疎通試験とかを終えて、業務系のテストが始まったとき、あちこちで不安定に連携が失敗する、という現象に陥りました。

エラーは「INVALID_SESSION_ID」というもので、ググると英語で色々出てきます。

WSDLが変とか、一度ログインしたあとSession IDをもう一度セットしないといけない、とかようわからん雑多な情報が転がってて、特定に苦労しました。

で、普通に日本語で以下の情報を発見。

https://help.salesforce.com/apex/HTViewSolution?id=000205994&language=ja

同一ユーザ名で複数のツールや端末からログインをした場合には同じセッションが割り当てられます。
そのため、いずれかのセッションがログアウトした事により、共有されているセッションが無効化され Invalid session ID found エラーが発生します。

な、なんだってー。

要するにSalesforceでは、一般的なWebのCookieベースなセッションとは異なり、サーバサイドでセッションIDを管理してるとのこと。

あとはご想像の通りで、今回、連携専用ユーザをベースにしているため、通常のWebのセッション単位にSalesforceのログインコネクションが張られて連携します。で、連携システムのログアウト時に、そのシステムのWebセッション破棄にあわせて、Salesforceもログアウト処理をかましていたのです。

そのログアウトがトリガーになって、別端末であっても、同じ連携専用ユーザで同じSalesforce Session IDを持ってる人がいるので死んでしまうという…。

原因がわかってしまえば、全員死んじゃう系の典型的な駄目パターンじゃん、って感じですが、Salesforceに詳しいわけでもない中、請け負っているのがね…。

ということで、連携専用ユーザのコネクションはシングルトンな形にして、基本ログアウトさせない形で何とか乗り越えました。気を付けないと、そのコネクションもセッションタイムアウトするケースがあると思うので、もう少し検討が必要な気もしますが。。。

SalesforceのSOAP APIをJavaから呼び出す

現在参画しているPrjでは、Salesforceと連携するシステムを作っているのですが、、、なぜか連携担当に任命されました orz 一番タフな所な気が…。

SalesforceのAPI、調べてみると色々な種類があるんですね。Salesforceのヘルプページに一覧が↓

どの API を使用すべきですか?

大きな分類では、REST APIかSOAP APIとあって、最近の流行りとしてはRESTだからなーとREST APIを調べていました。

が、RESTAPIだと外側からトランザクションの制御ができなさそう。SOAP APIだとAllOrNoneHeaderなるものがあってロールバックできました。

連携内容にもよりますが、今回の連携ではSalesforceの明細オブジェクトみたいなものを1トランザクションで複数insertする、みたいなのがあってロールバックは必須でした。
ということで、SOAP APIの採用へ。

今どきSOAPかぁ…とか思ったのですが、SOAP APIを実際に使ってみると使い勝手が良いです。Javaコード内でも普通のクラスと同様にSalesforceのオブジェクトを扱えて、ことSalesforce APIでいえば、RESTより楽なのでは…と思ったり。

ということで、SalesforceのSOAP API設定メモ。

1.Force.com Web Service Connector(WSC)の取得

SalesforceのSOAP APIをコールするクライアント実装としてForce.com Web Service Connector(WSC)なるものを使います。

github.com

とりあえずクローンして、手元でビルドしました。自分の場合、NetBeans使ってやりました。

f:id:kikutaro777:20151106214808j:plain

force-wsc-35.2.0.jarとforce-wsc-35.2.0-uber.jarの明確な違いがよくわからないのですが…(ちなみに解凍してdiffとってもイマイチ。。)
GitHubのサンプルみるとforce-wsc-35.2.0-uber.jarのほうを使ってました。

2.Salesforce WSDL

Salesforceの環境からWSDLがダウンロードできるようになってます。

設定から「アプリケーションの設定」「開発」「API」を選びます。
f:id:kikutaro777:20151107100027j:plain

今回はEnterprise WSDLを使いました。
f:id:kikutaro777:20151107100119j:plain

前に何かで入れたアプリがでてますが、そのまま「Generate」を押します。
f:id:kikutaro777:20151107100637j:plain

ブラウザでWSDLのxmlが表示されるので保存します。
f:id:kikutaro777:20151107100647j:plain

3.SOAP API用のjarファイル生成

force-wsc-35.2.0-uber.jarをコマンドラインで叩いてSOAP API用のjarを生成します。
最初JDK8で試したら以下エラーとなりました。tools.jarないもんな…。

java -classpath force-wsc-35.2.0-uber.jar com.sforce.ws.tools.wsdlc wsdl.xml sfdc-enterprise-lib.jar
[WSC][wsdlc.main:71]Generating Java files from schema ...
[WSC][wsdlc.main:71]Generated 633 java files.
java.io.FileNotFoundException: C:\Program Files\Java\jre1.8.0_60\lib\tools.jar (
指定されたファイルが見つかりません。)
        at java.util.zip.ZipFile.open(Native Method)
        at java.util.zip.ZipFile.<init>(Unknown Source)
        at java.util.zip.ZipFile.<init>(Unknown Source)
        at java.util.jar.JarFile.<init>(Unknown Source)
        at java.util.jar.JarFile.<init>(Unknown Source)
        at com.sforce.ws.codegen.ToolsJarClassLoader.<init>(ToolsJarClassLoader.
java:52)
        at com.sforce.ws.codegen.Compiler.findCompilerInToolsJar(Compiler.java:6
9)
        at com.sforce.ws.codegen.Compiler.<init>(Compiler.java:57)
        at com.sforce.ws.codegen.Generator.compileTypes(Generator.java:132)
        at com.sforce.ws.tools.wsdlc.run(wsdlc.java:117)
        at com.sforce.ws.tools.wsdlc.run(wsdlc.java:149)
        at com.sforce.ws.tools.wsdlc.main(wsdlc.java:71)
Error: Unable to find compiler. Make sure that tools.jar is in your classpath: j
ava.io.FileNotFoundException: C:\Program Files\Java\jre1.8.0_60\lib\tools.jar (
指定されたファイルが見つかりません。)

ということで、JDK7で実行しました。

java -classpath force-wsc-35.2.0-uber.jar com.sforce.ws.tools.wsdlc wsdl.xml sfdc-enterprise-lib.jar
[WSC][wsdlc.main:71]Generating Java files from schema ...
[WSC][wsdlc.main:71]Generated 633 java files.
[WSC][wsdlc.main:71]Compiling to target 1.6...
警告:[options] ブートストラップ・クラスパスが-source 1.6と一緒に設定されていませ
ん
警告1個
[WSC][wsdlc.main:71]Compiled 636 java files.
[WSC][wsdlc.main:71]Generating jar file ... sfdc-enterprise-lib.jar
[WSC][wsdlc.main:71]Generated jar file sfdc-enterprise-lib.jar

Javaのコードから取引先を作成

jarができてしまえば、あとはコード書くだけです。
生成したjarだけじゃなく、force-wsc-35.2.0-uber.jarの参照も必要でした。

で、コードは

import com.sforce.soap.enterprise.Connector;
import com.sforce.soap.enterprise.EnterpriseConnection;
import com.sforce.soap.enterprise.SaveResult;
import com.sforce.soap.enterprise.sobject.Account;
import com.sforce.soap.enterprise.sobject.SObject;
import com.sforce.ws.ConnectionException;
import com.sforce.ws.ConnectorConfig;

public class SfdcSoapApiSample {

    public static void main(String[] args) throws ConnectionException {
        ConnectorConfig config = new ConnectorConfig();
        config.setUsername("username"); //実際にはsandboxのログインアカウントを指定
        config.setPassword("password"); //実際にはsandboxのログインパスワードを指定

        EnterpriseConnection connection = Connector.newConnection(config);
        Account account = new Account();
        account.setName("20151106テスト取引先");
        SaveResult[] ret = connection.create(new SObject[]{account});
        //retから情報取得したり
    }
    
}

Salesforce上に取引先ができてればOK。

f:id:kikutaro777:20151107115325j:plain

ちなみに会社の後輩にはSOAP APIのドキュメントみながらやってもらったところ、wscのバージョンが23とかなってたっぽい(^^;けど動いたらしいのであまり変わらないのかも。

開発かなりタイトなのだけど、がんばろう(*´Д`)

PayaraMicro on Heroku !

I'm newbie both Payara and Heroku. Though I tried to play with these for preparing my presentation in Japanese GlassFish User Group event.

glassfish.doorkeeper.jp

About one month ago, I participated Japanese Salesforce event. It was called "Salesforce Summer".eventjp.salesforce.com

At the event, I saw Heroku demonstration. This is the reason why I started to use Heroku.After the event, I checked Heroku site and found good Java tutorial. In the tutorial, the sample Java web application used Spark.

I thought that ... if I use Payara Micro, is it possible to deploy Java EE application to Heroku ?

Finally, it could. Here is procedures.

Getting Started with Java on Heroku

Firstly, I started "Getting Started with Java on Heroku". The tutorial is very polite, so it's easy to do.
f:id:kikutaro777:20150914011127j:plain

  • Installing Toolbelt (for Windows on my environment)
  • heroku login

After that, I cloned "java-getting-started" from github.

git clone https://github.com/heroku/java-getting-started.git

And changed directory.

cd java-getting-started

Next

heroku create
git push heroku master
heroku ps:scale web=1
heroku open

Finally I confirmed the deployed page.

f:id:kikutaro777:20150915233153j:plain

These procedures are same as the tutorial.

PayaraMicro on Heroku

I used the same project, it means I used "java-getting-started" project cloned from GitHub.
It's kind of cheat I think. Normally, it had better create as new project.

Firstly, I changed pom.xml.

<dependency>
    <groupId>fish.payara.extras</groupId>
    <artifactId>payara-micro</artifactId>
    <version>4.1.153</version>
    <type>jar</type>
</dependency>

Also, I edited the code like this.

import fish.payara.micro.BootstrapException;
import fish.payara.micro.PayaraMicro;

public class Main {
  public static void main(String[] args) throws BootstrapException {
      PayaraMicro.getInstance()
                .setHttpPort(Integer.parseInt(System.getenv("PORT")))
                .addDeployment("DeployTarget.war")
                .bootStrap();
  }
}

It's very important to call "setHttpPort(Integer.parseInt(System.getenv("PORT")))", because the port of HTTP on Heroku is binded random.

If that helps, I used NetBeans IDE.

f:id:kikutaro777:20150914012105j:plain

After changing code, I copied from WAR file which is target of deploy to this project.
The War was created by Java EE 7, but I used only JSF and CDI.

Finally, I committed the code and "git push heroku master". Everything was done.

Here is my deployed Java EE app with PayaraMicro on Heroku :)
f:id:kikutaro777:20150915233036j:plain

Enjoy!

にほんブログ村 IT技術ブログへ
にほんブログ村 にほんブログ村 IT技術ブログ Javaへ
にほんブログ村