grails blazeds 自前アダプタ

前回まででは、クライアントから送ったデータを、そのままの状態で、サーバからクライアントへ配信していた。
では、サーバー側で受け取ったデータを加工して、それをクライアントへ配信するにはどうするのか。アダプタというものを介してやることになる。

messaging-config.xml の赤字部分を追加および変更。

<?xml version="1.0" encoding="UTF-8"?>


    
        
        
    

    
        
    

    
        
    


ChatAdapterというアダプタを追加して、destinationで利用するアダプタとして設定する。
ここから推測すると、アダプタが設定されていないdestinationは、デフォルトアダプタとして登録されているアダプタが利用されるということかと。上記の例では、デフォルトアダプタは、actionscriptということになる。


以下のファイルを追加。
src/groovy/blaze/ChatAdapter.groovy

package blaze

import flex.messaging.messages.Message
import flex.messaging.services.MessageService;
import flex.messaging.services.ServiceAdapter

class ChatAdapter extends ServiceAdapter {
    Object invoke(Message message) {
        message.body.receiveTime = new Date().format('yyyy/MM/dd HH:mm:ss')
        getDestination().getService().pushMessageToClients(message, false)
        return null
    }
}

アダプタは、ServiceAdapterを継承して作成する。
クライアントからメッセージを受け取ったアダプタは、invokeというメソッドをキックする仕組みのようだ。
アダプタが利用されていることが分かるように、受信時間をメッセージに付加して、クライアントへ配信してみることにする。


クライアント側の実装

<?xml version="1.0" encoding="utf-8"?>

  
    <![CDATA[
      import mx.messaging.ChannelSet;
      import mx.messaging.channels.StreamingAMFChannel;
      import mx.messaging.messages.AsyncMessage;
      import mx.messaging.messages.IMessage;
      
      private function send():void{
        var message:IMessage = new AsyncMessage();
        message.body.message = msg.text;
        producer.send(message);
        msg.text = "";
      }

      private function messageHandler(message:IMessage):void{
        log.text += '['+message.body.receiveTime+'] '+message.body.message + "\n";
      }
    ]]>
  
  
    
      
    
    
    
    
  
  
  
    
    
      
      
    
    

赤字部分を変更。

チャットログ欄に時間が付加されるようになった。

ここからは、チャットに限らず、いろんな可能性を感じ取る事が出来る。