質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
HTTPS

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

10040閲覧

spring bootでマルチスレッドを使用したhttps通信の方法

退会済みユーザー

退会済みユーザー

総合スコア0

HTTPS

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

1クリップ

投稿2018/11/19 02:58

編集2018/11/26 00:44

外部へのhttps通信処理をspring bootで実装しています。
通知先が多いと送信処理に時間がかかってしまう為、マルチスレッドを使って処理時間を減らそうと思います。
処理ロジックは下記の通りです。

・画面から配信データを入力、送信ボタンを押す
・DBから通知先データのリストを取得
・通知先データの数だけ送信処理を繰り返す(ここでマルチスレッドを実装)
・送信処理を行った件数を画面に出力する

@EnableAsync、@Asyncを使用して実行時のログを見てみたのですが、同期的な実行結果になってしまいました。
1つの送信処理にかかっている時間は100ms台~500ms台と幅が出ています。
処理件数が少ないからこのような実行結果になっているのかもしれませんが、非同期処理を実装するにあたって不足しているアノテーションや
コードの改善案などありましたらご教授頂きたいです。

■DemoApplication.class

@SpringBootApplication @EnableAsync public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication .class, args); } }
@Controller public class DemoController { @Autowired DemoService service;   //略 @PostMapping(value = "/") public String subscribe(@ModelAttribute SendForm form, RedirectAttributes redirectAttribute) { List<DemoData> list = this.service.getTargetList(); int num = list.size(); this.service.send(list, form); redirectAttribute.addFlashAttribute("num", num); return "redirect:/"; } }
@Service public class DemoService { @Autowired DemoConfiguration config; private static final Log log = LogFactory.getLog(DemoService.class); //略 public void send(List<DemoData> list, SendForm form) { final String PUBLIC_KEY = this.config.getPublicKey(); final String PRIVATE_KEY = this.config.getPrivateKey(); final String SUBJECT = form.getTitle(); int max = list.size(); String payload = ""; ObjectMapper mapper = new ObjectMapper(); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); DemoService demoService = null; try { demoService = new DemoService(PUBLIC_KEY, PRIVATE_KEY, SUBJECT); payload = mapper.writeValueAsString(form); } catch (GeneralSecurityException | JsonProcessingException e) { e.printStackTrace(); } for (int i = 0; i < max; i++) { String subscriptionJson = list.get(i).getJson(); this.asyncSend(i,subscriptionJson, mapper, payload, demoService); } } @Async private void asyncSend(int i, String subscriptionJson, ObjectMapper mapper, String payload, DemoService demoService) { try { Subscription subscription = mapper.readValue(subscriptionJson, Subscription.class); Notification notification = new Notification(subscription, payload); demoService.send(notification); } catch (Exception e) { System.out.println(e.getMessage()); } } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

非同期で実行するServiceやComponentなどのSpring管理下にあるbeanは、CompletableFutureを使うと、比較的容易に実現できます。

@EnableAsyc@Asyncの記述についても、@Asyncを付与したメソッドがあるクラスと、これを呼び出すクラスは別クラスに分けなければなりません。
(Springから見ると、1つのBeanから非同期に別のBeanを呼び出したいため)

実装については以下が参考になるでしょう。

https://spring.io/guides/gs/async-method/
SpringBootの@AsyncとCompletableFutureを組み合わせて並列ロジックを作る

投稿2018/11/19 05:00

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/11/21 06:44

ご回答ありがとうございます。 こちらの方法でなんとか解決できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問