SlideShare a Scribd company logo
1 of 33
Spring AMQP × RabbitMQ
        @Keisuke69
自己紹介
西谷圭介

  TIS株式会社

  eXcaleというPaaSやってます
  http://www.excale.net/
Twitter ID : @Keisuke69
Github : Keisuke69
Spring AMQPとは?
Springのサブプロジェクトの1つ

Java版と.Net版がある

比較的若いプロダクト

  最初のGAリリースが2011/08

  最新は1.1.3

AMQPベースのメッセージングをSpringっぽく扱える

  アプリケーションロジックとインフラ周りの設定を切り離せる

メッセージ送受信用に抽象化されたtemplateを提供

POJOによるメッセージ送受信をサポート
AMQP
メッセージングミドルウェアのオープンなプロトコル仕様

プラットフォーム問わず、実装言語非依存

インターオペラビリティ高い

APIだけでなくワイヤレベルプロトコルである

    JMSはAPIだけ

ビジネス上のリアルな問題を解決するようデザインされてい
る

http://www.amqp.org/
基本モデル
                                                 Server



   Publisher                    Exchange

                                       Binding



  Consumer                    Message Queue

                                       Virtual Host

Exchangeがメッセージを受け取ってMessage Queueへと受け渡す

Message QueueはMessageをためてConsumerに渡す

ExchangeとMessageQueueを対応付けるのがBinding

  ExchangeのタイプはDirect、Fanout、Topic、Headerがある

  MessageQueueを複数にする構成も可能
RabbitMQ
Erlangで書かれているブローカー

 VMwareによって開発されている

AMQPのインプリメンテーション

クラスタリングやキューのミラーリングが可能

 本来AMQPのSpecではクラスタ等については
 定義されていない
なぜメッセージングか


コンポーネントを疎結合にできる

非同期

負荷分散とスケーラビリティ
Spring AMQPを使う
Java-based container
    configuration
 従来、XMLで定義していたSpringの各種設定をJavaクラス
 で定義

   冗長になりがちなXMLを書かなくていいので個人的に
   はおすすめ

 @Configurationをつけたクラスに、@Beanをつけたメ
 ソッドを実装してbean登録

 ApplicationContextはAnnotationConfigApplicationContextで

 今回のサンプルは全てこの方式で設定
ConnectionFactory
RabbitMQへの接続を管理するインター
フェース

com.rabbitmq.client.Connectionのラッ
パー

CachingConnectionFactoryだけが実装ク
ラスとして提供されている
Template
AmqpTemplate
  汎用インターフェース

RabbitOperation
  RabbitMQ用インターフェース

RabbitTemplate
  実際のインプリメンテーション

実情として現時点ではサポートしているのがRabbitMQのみ

  後々、他のAMQPミドルウェアをサポート予定(らしい)
Template
  各種メソッドおよびコールバックを提供

  メッセージの送受信は基本的にTemplateを利用して行
  う
void send(Message message) throws AmqpException;

void convertAndSend(Object message) throws AmqpException;

Message receive() throws AmqpException;

Object receiveAndConvert() throws AmqpException;
MessageConverter
Spring AMQPの大きな特徴

オブジェクトとメッセージ間で変換が行
える

デフォルトではSimpleMessageConverter

 JsonMessageConverter
 MarshallingMessageConverter
Configuration
@Configuration
public class SampleConfig {
	
	    @Bean
	    public ConnectionFactory connectionFactory() {
	        CachingConnectionFactory connectionFactory = new CachingConnectionFactory("localhost");
	        connectionFactory.setUsername("guest");
	        connectionFactory.setPassword("guest");
	        return connectionFactory;
	    }
	
	    @Bean
	    public AmqpAdmin amqpAdmin() {
	    	    return new RabbitAdmin(connectionFactory());
	    }
	
	    @Bean
	    public RabbitTemplate rabbitTemplate() {
	    	    RabbitTemplate template = new RabbitTemplate(connectionFactory());
	    	    template.setRoutingKey("sample_queue");
	    	    template.setQueue("sample_queue");
	    	    return template;
	    }
	
	    @Bean
	    public Queue helloWorldQueue() {
	    	    return new Queue("sample_queue");
	    }
}
メッセージの送信
        AmqpTemplateを使って行う

        下記サンプルではアノテーションベースの設定を行なっ
        ているのでAnnotationConfitgApplicationContextを使用

public class Publisher {
    public static void main(String[] args){
        ApplicationContext context = new AnnotationConfigApplicationContext(SampleConfig.class);
        AmqpTemplate amqpTemplate = context.getBean(RabbitTemplate.class);
        amqpTemplate.convertAndSend("Hello world");
        System.out.println("Sent message.");
    }
}
メッセージの受信
       送信と同じくAmqpTemplateを使う
public class Consumer {
    public static void main(String[] args){
        ApplicationContext context = new
AnnotationConfigApplicationContext(SampleConfig.class);
        AmqpTemplate amqpTemplate = context.getBean(RabbitTemplate.class);
        String message = (String)amqpTemplate.receiveAndConvert();
        System.out.println("Receive: " + message);
    }
}
MessageConverter
           Templateのbean登録時に利用したいコンバータをセットする

               今回は JsonMessageConverterを使用

           JsonMessageConverterを利用する場合、Jacksonパーサ必須

@Configuration
public class SampleConfig {
	
(省略)
	
	  @Bean
	  public RabbitTemplate rabbitTemplate() {
	  	    RabbitTemplate template = new RabbitTemplate(connectionFactory());
	  	    template.setRoutingKey("sample_queue");
	  	    template.setQueue("sample_queue");
	  	    template.setMessageConverter(new JsonMessageConverter());
	  	    return template;
	  }
	
(省略)
}
MessageConverter
 POJOを用意する

 今回はシンプルにkeyとmessageというフィールドを用意してそれらに対するgetter/setter
 を定義したものを用意

 DB用のモデルクラスなどと兼用することも可能

public class SimplePojo {
    private String key;
    private String message;
   
    public String getKey() {
        return key;
    }
    public void setKey(String key) {
        this.key = key;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
}
コンバータを使った送信
       POJOをnewしたオブジェクトに値をセット

       AmqpTemplateのconvertAndSendの引数としてオブジェクトを渡
       す
public class Publisher {
    public static void main(String[] args){
        ApplicationContext context = new
AnnotationConfigApplicationContext(SampleConfig.class);
        AmqpTemplate amqpTemplate = context.getBean(RabbitTemplate.class);
        SimplePojo simplePojo = new SimplePojo();
        simplePojo.setKey("ABC");
        simplePojo.setMessage("This is message made by pojo.");
        amqpTemplate.convertAndSend(simplePojo);
        System.out.println("Sent message.");
    }
}
コンバータを使った受信
                同期処理

                AmqpTemplate.receiveAndConvert()
                変換先の型にキャストする必要がある

public class Consumer {
    public static void main(String[] args){
        ApplicationContext context = new AnnotationConfigApplicationContext(SampleConfig.class);
        AmqpTemplate amqpTemplate = context.getBean(RabbitTemplate.class);
        SimplePojo simplePojo = (SimplePojo)amqpTemplate.receiveAndConvert();
        System.out.println("Receive message: key = " + simplePojo.getKey() + ", message = " + simplePojo.getMessage());
    }
}
MessageListener
MessageListener

非同期受信のためのインターフェース

  メッセージドリブンなコールバック処理を簡
  単に実装できる

SimpleMessageListenerContainer
  Springが提供する軽量リスナーコンテナ

メッセージ受信時の処理をハンドラとして実装
MessageListener
               HelloWorldHandlerというハンドラクラスをMessageListenerAdapterで紐付け

               もちろん、MessageConverterも利用可能


@Configuration
public class SampleListenerConfig {
    String queueName = "sample_queue";
   
    @Bean
    public ConnectionFactory connectionFactory() {
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory("localhost");
        connectionFactory.setUsername("guest");
        connectionFactory.setPassword("guest");
        return connectionFactory;
    }
    @Bean
    public SimpleMessageListenerContainer listenerContainer(){
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
        container.setConnectionFactory(connectionFactory());
        container.setQueueNames(queueName);
        container.setMessageListener(new MessageListenerAdapter(new HelloWorldHandler(),new JsonMessageConverter()));
        return container;
    }
}
ハンドラクラス
        特別なクラスの継承やインターフェースの実装は不要

        handleMessageというメソッドはデフォルト

          変更可能

        メソッドの引数として変換先の型を指定する

          自動的に変換されて、getterでアクセス可能

public class HelloWorldHandler {
    public void handleMessage(SimplePojo simplePojo) {
        System.out.println("Received: Key = " + simplePojo.getKey()
                 + ", message = " + simplePojo.getMessage());
    }
}
MessageListenerの起動
        基本的に変わらない

        標準ではApplicationContext起動時に自動でリスナーも
        起動される

        受信時の処理がハンドラで行われるようになっている
        ためその辺りの記述が不要

public class Consumer {
    public static void main(String[] args){
        new AnnotationConfigApplicationContext(SampleListenerConfig.class);
    }
}
困ったところ
メッセージの型が固定になる

 ヘッダの値を元に変換先の型が特定されている(FQCN)

 PublisherがSpring以外でもこのヘッダのセットが必要

 我々の場合、MQにメッセージを送る側が異なる言語で実装されていた

 独自のクラスマッパーを用意

   とは言ってもFQCNでの指定を不要にしただけ

1つの型につき、定義できる処理が1つ

 複数のキュー、型を利用したい場合に大量に定義が必要、かつ1つの型で複数の処理
 は定義できない

   同じ型で異なる処理をさせたかった

 汎用ハンドラクラスを用意し、型と命名規則で実際のハンドラクラスへ処理を実装
サンプル
 (独自ClassMapper)
DefaultClassMapperを継承してtoClassメ
ソッドをオーバーライド

メッセージヘッダの"__TypeId__"に指定
された型名(FQCNじゃない)を使って
指定のパッケージ配下からクラスを探
しだして返却
サンプル
           (独自ClassMapper)
	   @Override
	   public Class<?> toClass(MessageProperties properties) {
	   	   if (targetClass != null) {
	   	   	    return targetClass;
	   	   }

	   	   Map<String, Object> headers = properties.getHeaders();
	   	   Object classIdFieldNameValue = headers.get(getClassIdFieldName());
	   	   String classId = null;
	   	   if (classIdFieldNameValue != null) {
	   	   	   classId = classIdFieldNameValue.toString();
	   	   }
	   	   String className = null;
	   	   try {
	   	   	   className = ClassResolver.scan(classId, this.basePackage);
	   	   	   if (className != null) {
	   	   	   	    return ClassUtils.forName(className, getClass()
	   	   	   	    	   	    .getClassLoader());
	   	   	   }
	   	   } catch (IOException e1) {

	   	   } catch (ClassNotFoundException e) {

	   	   }
	   	   return super.toClass(properties);
	   }
サンプル
(汎用ハンドラクラス)
メッセージヘッダのTypeId+Handlerという名前で委
譲先のハンドラクラスを決定

“__Method__”ヘッダにセットされたメソッドを実行

全オブジェクト分のSimpleListenerContainerのbean登
録が不要に

1つのキューで複数のオブジェクトを元にしたメッ
セージの送受信が可能
サンプル
                            (汎用ハンドラクラス)
public class GenericHandler {

	    private String path;

	    @Autowired
	    BeanFactory beanFactory;

	    public GenericHandler() {
	    	    this.path = "org.hoge";
	    }

	    public GenericHandler(String path) {
	    	    this.path = path;
	    }

	    public void handleMessage(Object obj, MessageProperties message) {
	    	    String typeId = null;
	    	    String methodName = null;
	    	    try {
	    	    	     Map<String, Object> headers = message.getHeaders();
	    	    	     typeId = (String) headers.get("__TypeId__");
	    	    	     methodName = ((String) headers.get("__Method__"));
	    	    	     methodName = StringUtils.uncapitalize(methodName);

	    	    	     String delegateClassName = ClassResolver.scan(typeId + "Handler",this.path);
	    	    	     Object delegate = beanFactory.getBean(ClassUtils.forName(delegateClassName, getClass().getClassLoader()));

	    	    	    MethodInvoker methodInvoker = new MethodInvoker();
	    	    	    methodInvoker.setTargetObject(delegate);
	    	    	    methodInvoker.setTargetMethod(methodName);
	    	    	    Object[] objects = { obj };
	    	    	    methodInvoker.setArguments(objects);
	    	    	    methodInvoker.prepare();
	    	    	    methodInvoker.invoke();
	    	    } catch (Exception e) {
	    	    	    throw new HandlerExecutionFailureException(e);
	    	    }
	    }
}
その他の考慮事項
RabbitMQを冗長化した場合の話

 特にMirroredQueueを利用する場合
 →Codezineさんに寄稿した記事に書いておきました
  http://codezine.jp/article/detail/6943

エラー時のハンドリング

 RetryTemplateとMessageRecovererとか

トランザクション

 @TransactionalとTransactionManager
なぜメッセージングか
コンポーネントを疎結合にできる

 MQを境界としてコンポーネント間の依存関係を切り離せる

 メッセージのフォーマットさえ正しければ言語が異なってもOK

非同期

 疎結合になるため、障害時などの影響を小さくできる

 部分的なスケールアウトなどが可能に

負荷分散とスケーラビリティ

 Consumerプロセスを増やすだけでスケールできる

      SpringMQを使えば1プロセス内の並行度の設定も可能

 Queueを増やすことも簡単、Exchangeの構成だけでラウンドロビン等も可能
Spring AMQPとRabbitMQ使うと

 簡単に非同期アプリが書けますよ!

      http://www.excale.net/

More Related Content

What's hot

What's new in Spring Batch 5
What's new in Spring Batch 5What's new in Spring Batch 5
What's new in Spring Batch 5ikeyat
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)NTT DATA Technology & Innovation
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」Masahito Zembutsu
 
バッチは地味だが役に立つ
バッチは地味だが役に立つバッチは地味だが役に立つ
バッチは地味だが役に立つapkiban
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門Kohei Tokunaga
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjugYahoo!デベロッパーネットワーク
 
JDKの選択肢とサーバーサイドでの選び方
JDKの選択肢とサーバーサイドでの選び方JDKの選択肢とサーバーサイドでの選び方
JDKの選択肢とサーバーサイドでの選び方Takahiro YAMADA
 
KubernetesでRedisを使うときの選択肢
KubernetesでRedisを使うときの選択肢KubernetesでRedisを使うときの選択肢
KubernetesでRedisを使うときの選択肢Naoyuki Yamada
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -onozaty
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法についてYuji Otani
 
システム間連携を担うSpring Integrationのエンタープライズ開発での活用
システム間連携を担うSpring Integrationのエンタープライズ開発での活用システム間連携を担うSpring Integrationのエンタープライズ開発での活用
システム間連携を担うSpring Integrationのエンタープライズ開発での活用apkiban
 
ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方Yoshiyasu SAEKI
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugMasatoshi Tada
 
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るSpring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るGo Miyasaka
 
Springを何となく使ってる人が抑えるべきポイント
Springを何となく使ってる人が抑えるべきポイントSpringを何となく使ってる人が抑えるべきポイント
Springを何となく使ってる人が抑えるべきポイント土岐 孝平
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMPYusuke Kagata
 

What's hot (20)

What's new in Spring Batch 5
What's new in Spring Batch 5What's new in Spring Batch 5
What's new in Spring Batch 5
 
Serverless時代のJavaについて
Serverless時代のJavaについてServerless時代のJavaについて
Serverless時代のJavaについて
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
 
バッチは地味だが役に立つ
バッチは地味だが役に立つバッチは地味だが役に立つ
バッチは地味だが役に立つ
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
 
JDKの選択肢とサーバーサイドでの選び方
JDKの選択肢とサーバーサイドでの選び方JDKの選択肢とサーバーサイドでの選び方
JDKの選択肢とサーバーサイドでの選び方
 
KubernetesでRedisを使うときの選択肢
KubernetesでRedisを使うときの選択肢KubernetesでRedisを使うときの選択肢
KubernetesでRedisを使うときの選択肢
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
 
分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
 
システム間連携を担うSpring Integrationのエンタープライズ開発での活用
システム間連携を担うSpring Integrationのエンタープライズ開発での活用システム間連携を担うSpring Integrationのエンタープライズ開発での活用
システム間連携を担うSpring Integrationのエンタープライズ開発での活用
 
ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
 
KeycloakでAPI認可に入門する
KeycloakでAPI認可に入門するKeycloakでAPI認可に入門する
KeycloakでAPI認可に入門する
 
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るSpring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作る
 
Springを何となく使ってる人が抑えるべきポイント
Springを何となく使ってる人が抑えるべきポイントSpringを何となく使ってる人が抑えるべきポイント
Springを何となく使ってる人が抑えるべきポイント
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMP
 

Similar to Spring AMQP × RabbitMQ

JavaOne2015報告会 Java EE アップデート #j1jp
JavaOne2015報告会 Java EE アップデート #j1jpJavaOne2015報告会 Java EE アップデート #j1jp
JavaOne2015報告会 Java EE アップデート #j1jpNorito Agetsuma
 
A Prolog To Java Translator System And Its Application
A Prolog To Java Translator System And Its ApplicationA Prolog To Java Translator System And Its Application
A Prolog To Java Translator System And Its Applicationguestc68147
 
第2回デザインパターン資料
第2回デザインパターン資料第2回デザインパターン資料
第2回デザインパターン資料gaaupp
 
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugY Watanabe
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめYu Nobuoka
 
PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方Satoshi Nagayasu
 
Netty & Apache Camel
Netty & Apache CamelNetty & Apache Camel
Netty & Apache Camelssogabe
 
jjugccc2018 app review postmortem
jjugccc2018 app review postmortemjjugccc2018 app review postmortem
jjugccc2018 app review postmortemtamtam180
 
Apexコアデベロッパーセミナー(Apexコード)071010
Apexコアデベロッパーセミナー(Apexコード)071010Apexコアデベロッパーセミナー(Apexコード)071010
Apexコアデベロッパーセミナー(Apexコード)071010stomita
 
Spring integration概要
Spring integration概要Spring integration概要
Spring integration概要kuroiwa
 
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略takezoe
 
Spring mvc
Spring mvcSpring mvc
Spring mvcRyo Asai
 
Implements OpenTelemetry Collector in DotNet
Implements OpenTelemetry Collector in DotNetImplements OpenTelemetry Collector in DotNet
Implements OpenTelemetry Collector in DotNetYoshifumi Kawai
 
Cloud computing competition by Hapyrus
Cloud computing competition by HapyrusCloud computing competition by Hapyrus
Cloud computing competition by HapyrusKoichi Fujikawa
 
使ってみよう PowerShell
使ってみよう PowerShell使ってみよう PowerShell
使ってみよう PowerShellKazuki Takai
 

Similar to Spring AMQP × RabbitMQ (20)

JavaOne2015報告会 Java EE アップデート #j1jp
JavaOne2015報告会 Java EE アップデート #j1jpJavaOne2015報告会 Java EE アップデート #j1jp
JavaOne2015報告会 Java EE アップデート #j1jp
 
A Prolog To Java Translator System And Its Application
A Prolog To Java Translator System And Its ApplicationA Prolog To Java Translator System And Its Application
A Prolog To Java Translator System And Its Application
 
第2回デザインパターン資料
第2回デザインパターン資料第2回デザインパターン資料
第2回デザインパターン資料
 
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめ
 
PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方
 
MoteMote Compiler Plugin
MoteMote Compiler PluginMoteMote Compiler Plugin
MoteMote Compiler Plugin
 
Clrh 110716 wcfwf
Clrh 110716 wcfwfClrh 110716 wcfwf
Clrh 110716 wcfwf
 
Netty & Apache Camel
Netty & Apache CamelNetty & Apache Camel
Netty & Apache Camel
 
jjugccc2018 app review postmortem
jjugccc2018 app review postmortemjjugccc2018 app review postmortem
jjugccc2018 app review postmortem
 
Apexコアデベロッパーセミナー(Apexコード)071010
Apexコアデベロッパーセミナー(Apexコード)071010Apexコアデベロッパーセミナー(Apexコード)071010
Apexコアデベロッパーセミナー(Apexコード)071010
 
Spring integration概要
Spring integration概要Spring integration概要
Spring integration概要
 
Rakuten tech conf
Rakuten tech confRakuten tech conf
Rakuten tech conf
 
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略
 
sveltekit-ja.pdf
sveltekit-ja.pdfsveltekit-ja.pdf
sveltekit-ja.pdf
 
Spring mvc
Spring mvcSpring mvc
Spring mvc
 
Implements OpenTelemetry Collector in DotNet
Implements OpenTelemetry Collector in DotNetImplements OpenTelemetry Collector in DotNet
Implements OpenTelemetry Collector in DotNet
 
Cloud computing competition by Hapyrus
Cloud computing competition by HapyrusCloud computing competition by Hapyrus
Cloud computing competition by Hapyrus
 
Java EE8 Report
Java EE8 ReportJava EE8 Report
Java EE8 Report
 
使ってみよう PowerShell
使ってみよう PowerShell使ってみよう PowerShell
使ってみよう PowerShell
 

More from Keisuke Nishitani

Application Lifecycle Management in a Serverless World
Application Lifecycle Management in a Serverless WorldApplication Lifecycle Management in a Serverless World
Application Lifecycle Management in a Serverless WorldKeisuke Nishitani
 
AWSでアプリ開発するなら 知っておくべこと
AWSでアプリ開発するなら 知っておくべことAWSでアプリ開発するなら 知っておくべこと
AWSでアプリ開発するなら 知っておくべことKeisuke Nishitani
 
Introducing Amazon Rekognition, Amazon Polly and Amazon Lex
Introducing Amazon Rekognition, Amazon Polly and Amazon LexIntroducing Amazon Rekognition, Amazon Polly and Amazon Lex
Introducing Amazon Rekognition, Amazon Polly and Amazon LexKeisuke Nishitani
 
Running Java Apps with Amazon EC2, AWS Elastic Beanstalk or Serverless
Running Java Apps with Amazon EC2, AWS Elastic Beanstalk or ServerlessRunning Java Apps with Amazon EC2, AWS Elastic Beanstalk or Serverless
Running Java Apps with Amazon EC2, AWS Elastic Beanstalk or ServerlessKeisuke Nishitani
 
AWSのサーバレス関連アップデートを10分で紹介します
AWSのサーバレス関連アップデートを10分で紹介しますAWSのサーバレス関連アップデートを10分で紹介します
AWSのサーバレス関連アップデートを10分で紹介しますKeisuke Nishitani
 
Introducing Serverless Computing (20160802)
Introducing Serverless Computing (20160802)Introducing Serverless Computing (20160802)
Introducing Serverless Computing (20160802)Keisuke Nishitani
 
Going Serverless, Building Applications with No Servers
Going Serverless, Building Applications with No ServersGoing Serverless, Building Applications with No Servers
Going Serverless, Building Applications with No ServersKeisuke Nishitani
 
クラウド時代のソフトウェアアーキテクチャ
クラウド時代のソフトウェアアーキテクチャクラウド時代のソフトウェアアーキテクチャ
クラウド時代のソフトウェアアーキテクチャKeisuke Nishitani
 
Building Scalable Application on the Cloud
Building Scalable Application on the CloudBuilding Scalable Application on the Cloud
Building Scalable Application on the CloudKeisuke Nishitani
 
AWS Lambda / Amazon API Gateway Deep Dive
AWS Lambda / Amazon API Gateway Deep DiveAWS Lambda / Amazon API Gateway Deep Dive
AWS Lambda / Amazon API Gateway Deep DiveKeisuke Nishitani
 
Androidを中心に紐解くIoT
Androidを中心に紐解くIoTAndroidを中心に紐解くIoT
Androidを中心に紐解くIoTKeisuke Nishitani
 
AWSで実現するクラウドネイティブなアプリ開発のポイント
AWSで実現するクラウドネイティブなアプリ開発のポイントAWSで実現するクラウドネイティブなアプリ開発のポイント
AWSで実現するクラウドネイティブなアプリ開発のポイントKeisuke Nishitani
 
Scale Your Business without Servers
Scale Your Business without ServersScale Your Business without Servers
Scale Your Business without ServersKeisuke Nishitani
 

More from Keisuke Nishitani (20)

Application Lifecycle Management in a Serverless World
Application Lifecycle Management in a Serverless WorldApplication Lifecycle Management in a Serverless World
Application Lifecycle Management in a Serverless World
 
Serverless Anti-Patterns
Serverless Anti-PatternsServerless Anti-Patterns
Serverless Anti-Patterns
 
AWSでアプリ開発するなら 知っておくべこと
AWSでアプリ開発するなら 知っておくべことAWSでアプリ開発するなら 知っておくべこと
AWSでアプリ開発するなら 知っておくべこと
 
Tune Up AWS Lambda
Tune Up AWS LambdaTune Up AWS Lambda
Tune Up AWS Lambda
 
What's new with Serverless
What's new with ServerlessWhat's new with Serverless
What's new with Serverless
 
Introduction to AWS X-Ray
Introduction to AWS X-RayIntroduction to AWS X-Ray
Introduction to AWS X-Ray
 
Introducing Amazon Rekognition, Amazon Polly and Amazon Lex
Introducing Amazon Rekognition, Amazon Polly and Amazon LexIntroducing Amazon Rekognition, Amazon Polly and Amazon Lex
Introducing Amazon Rekognition, Amazon Polly and Amazon Lex
 
What's new with Serverless
What's new with ServerlessWhat's new with Serverless
What's new with Serverless
 
Running Java Apps with Amazon EC2, AWS Elastic Beanstalk or Serverless
Running Java Apps with Amazon EC2, AWS Elastic Beanstalk or ServerlessRunning Java Apps with Amazon EC2, AWS Elastic Beanstalk or Serverless
Running Java Apps with Amazon EC2, AWS Elastic Beanstalk or Serverless
 
Serverless Revolution
Serverless RevolutionServerless Revolution
Serverless Revolution
 
AWSのサーバレス関連アップデートを10分で紹介します
AWSのサーバレス関連アップデートを10分で紹介しますAWSのサーバレス関連アップデートを10分で紹介します
AWSのサーバレス関連アップデートを10分で紹介します
 
Introducing Serverless Computing (20160802)
Introducing Serverless Computing (20160802)Introducing Serverless Computing (20160802)
Introducing Serverless Computing (20160802)
 
Going Serverless, Building Applications with No Servers
Going Serverless, Building Applications with No ServersGoing Serverless, Building Applications with No Servers
Going Serverless, Building Applications with No Servers
 
クラウド時代のソフトウェアアーキテクチャ
クラウド時代のソフトウェアアーキテクチャクラウド時代のソフトウェアアーキテクチャ
クラウド時代のソフトウェアアーキテクチャ
 
AWS Lambda Updates
AWS Lambda UpdatesAWS Lambda Updates
AWS Lambda Updates
 
Building Scalable Application on the Cloud
Building Scalable Application on the CloudBuilding Scalable Application on the Cloud
Building Scalable Application on the Cloud
 
AWS Lambda / Amazon API Gateway Deep Dive
AWS Lambda / Amazon API Gateway Deep DiveAWS Lambda / Amazon API Gateway Deep Dive
AWS Lambda / Amazon API Gateway Deep Dive
 
Androidを中心に紐解くIoT
Androidを中心に紐解くIoTAndroidを中心に紐解くIoT
Androidを中心に紐解くIoT
 
AWSで実現するクラウドネイティブなアプリ開発のポイント
AWSで実現するクラウドネイティブなアプリ開発のポイントAWSで実現するクラウドネイティブなアプリ開発のポイント
AWSで実現するクラウドネイティブなアプリ開発のポイント
 
Scale Your Business without Servers
Scale Your Business without ServersScale Your Business without Servers
Scale Your Business without Servers
 

Recently uploaded

プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価sugiuralab
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールsugiuralab
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 

Recently uploaded (8)

プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツール
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 

Spring AMQP × RabbitMQ