2024/10/01

Batch実行時のエラー「java.lang.NullPointerException: Cannot invoke "String.lastIndexOf(int)" because "endpoint" is null」の対処

事象

GAE/JでBatchジョブを起動しようとBatchServiceClient.create()をコールすると、以下のエラーが発生しました。

java.lang.NullPointerException: Cannot invoke "String.lastIndexOf(int)" because "endpoint" is null

ソースコードはGoogleのスニペットどおりで、ヌルポなど発生するわけがないはずです。しかし何度実行しても、ビルドしなおしても状況に変化はありません。


調査

BatchServiceClient.create()ではどのようにしてBatchServiceClientが生成されているのかわかりませんが、BatchServiceClient.create(BatchServiceSettings settings)メソッドを使用して自分でBatchServiceSettingsを生成して渡せば、生成されるBatchServiceClientの内容をある程度推測できそうです。
とりあえず以下のようなスニペットでBatchServiceSettings.newBuilder()でデフォルト設定のBatchServiceSettingsを生成し、別のBatchジョブの起動に成功しているプロジェクトとBatchServiceSettingsの内容を比較してみました。

	BatchServiceSettings settings = BatchServiceSettings.newBuilder().create();

生成されたBatchServiceSettingsの内容で、有意な差異は以下のとおりでした。

成功しているプロジェクト :
	endpoint=batch.googleapis.com:443,
失敗するプロジェクト :
	 endpoint=null,

エラーメッセージどおりですが、endpointがnullです。


endpointは文字列ですし、BatchServiceSettings.Builder.setEntpoint(String endpoint)で設定できます。そこで強制的にendpointに成功しているプロジェクトと同じ値をセットしてBatchServiceSettingsを生成し、それを渡してBatchServiceClientを生成してみると、発生するエラーが以下に変わりました。

com.google.api.gax.rpc.PermissionDeniedException: io.grpc.StatusRuntimeException: PERMISSION_DENIED: Batch API has not been used in project プロジェクト名 before or it is disabled.

Batchが有効になっていない...


解決方法

その1

BatchのAPIを有効にします。GCPコンソールからなら以下の手順になります。

  1. GCPコンソールの「APIとサービス」-「ライブラリ」を表示。
  2. 「APIとサービス」にBatchと入力してBatchを探す。
  3. 検索結果のリストから「Batch API」をクリック。
  4. Batch APIのページの「有効にする」をクリック。



Batchは手動で有効化する必要があったのを忘れていただけでした。そして最初に目にするエラーメッセージはそれを連想しにくいものなので、気づけないというワナもあったということでした。


その2

Batchを有効化し、BatchServiceClient.create()のコールをGoogleのスニペットどおりに戻してみたのですが、相変わらずこの記事の最初と同じヌルポが発生したままです。
とりあえず上記調査と同様にendpointを強制的に設定することで、Batchジョブの実行はできるようになりました。

しかしなぜプロジェクトによって挙動が違うのかは不明のままです。

2024/08/26

Firestore/Datastoreで複数の範囲フィルタを使ってクエリが可能に

Firestoreが登場する前の昔のDatastoreから、Firestore/Datastoreのクエリには「不等式はクエリ内で1つだけ」という制限があったのですが、2024/7/29にやっと解除されました。

上記リンクはFirestoreですが、Datastoreも同様のページがあります。Datastoreの日本語ページにはプレビューマークがついていますが、リリースノートにはGAと説明されています。

この制限のためにこれまで「DBに範囲を記録しておいて、指定の値がその範囲内にあるデータを検索」ができませんでした。具体的には以下のようなケースです。
  • 開始・終了日時を保存しておき、指定の日時に対応するデータを検索。
  • 上限・下限の金額を保存しておき、指定の金額に対応するデータを検索。
  • etc.

ただし無制限になったわけではなく、少ないながらも制限事項もあるようです。検索時間などパフォーマンス面も未検証なので、遅くないのかなど気になります。

これまではこの制限を回避するためだけにSearch APIを利用したりElasticsearchをインストールしたりといった対応が必要だったのですが、だいぶFirestore/Datastoreのみで検索ができるようになりそうです。

2024/07/17

vsReversiアップデート

 vsReversiをアップデートしました。


仕様変更

  • 以下のアカウントによるログイン/新規登録を廃止。
    • FaceBook
    • twitter

不具合修正

  • ブラウザでクロスオリジン・リダイレクト・ログインがサポート停止された影響でログインできないケースがあったので、ログインをポップアップウィンドウに変更。

FaceBookアカウントによるログインは維持するのが難しくなったので、廃止しました。
FaceBookは定期的にアカウントなどを利用する機能に対する審査を行っており、機能の提供を受けるためにはその審査を通過する必要があります。審査の内容や、通過しなかった場合の対応の仕方は毎年変わります。昨年まではサポートやり取りしながらなんとかなりましたが、とうとう維持する手間が見合わないところまで来ました。
最近はあまり使われていないようですし、メールアドレスでも利用可能なのでサポート外とすることにしました。
twitterは今のところそのようなことはないのですが、Xに変わってから収益化のために一部サービスの有料化を進める可能性があるようです。今後有料になる可能性もあると考えられますが、vsReversiの本来の目的はデモンストレーションなので、手間暇や運用費用をかけられません。そのため同時にサポートを廃止することにしました。幸いtwitterアカウントによるユーザは登録されていません。