Tag Archive for 'java'

25AugMessaging中にRemoteObjectの処理をする

Messaging中にRemoteObjectにデータを保存したり、メソッド実行したりする際にRemotingObjectにアクセスする方法を忘れないようにメモ。

  • パッケージ名:packagename
  • Messagingをするクラス名:MessagingAdapter(ServiceAdapterのサブクラス)
  • Messagingのadapter-definition id:hoge-messaging-adapter
  • RemoteObjectのクラス名:ClassName
  • RemoteObjectのdestination id:hoge-remote-object

FlexContext.getServletContext()で取得したServletContextから、getAttribute('destination id')でRemoteObjectの参照を取得する。
これでメッセージングする度にRemoteObjectのsetDataにmessageのbodyが渡されるようになる。
あとは煮るなり焼くなり・・・

  1. package packagename;
  2.  
  3. import packagename.ClassName;
  4.  
  5. import flex.messaging.config.ConfigMap;
  6. import flex.messaging.messages.Message;
  7. import flex.messaging.FlexContext;
  8. import flex.messaging.MessageBroker;
  9. import flex.messaging.services.MessageService;
  10. import flex.messaging.services.ServiceAdapter;
  11.  
  12. import java.util.HashMap;
  13.  
  14. import javax.servlet.ServletContext;
  15.  
  16. public class MessagingAdapter extends ServiceAdapter {
  17.     private MessageBroker messageBroker;
  18.     private MessageService messageService;
  19.     private ServletContext servletContext;
  20.     private ClassName remoteObject;
  21.    
  22.     @Override
  23.     public void initialize(String id, ConfigMap properties) {
  24.        
  25.     }
  26.    
  27.     @Override
  28.     public void start() {
  29.         // MessagingService取得
  30.         messageBroker = MessageBroker.getMessageBroker(null);
  31.         messageService = (MessageService) messageBroker.getService("hoge-messaging-service");
  32.        
  33.         // RemoteObject取得
  34.         servletContext = FlexContext.getServletContext();
  35.         remoteObject = (IconManager) servletContext.getAttribute("hoge-remote-object");
  36.     }
  37.    
  38.     @Override
  39.     public void stop() {
  40.        
  41.     }
  42.    
  43.     @Override
  44.     public Object invoke(Message message) {
  45.         // Messaging配信
  46.         messageService.pushMessageToClients(message, true);
  47.         messageService.sendPushMessageFromPeer(message, true);
  48.        
  49.         // RemoteObjectへmessageのbodyを渡す
  50.         HashMap hmMessage = (HashMap) message.getBody();
  51.         remoteObject.setData(hmMessage);
  52.        
  53.         return null;
  54.     }
  55.    
  56. }

ちなみにこの時の*-config.xmlたちはこんな感じ。

  • XML
  • messaging-config.xml
  • Source
  1. <?xml version="1.0" encoding="UTF-8"?>
  2.  
  3. <service id="hoge-messaging-service"
  4.     class="flex.messaging.services.MessageService">
  5.  
  6.     <adapters>
  7.         <adapter-definition id="actionscript"
  8.             class="flex.messaging.services.messaging.adapters.ActionScriptAdapter"
  9.             default="true" />
  10.         <adapter-definition id="hoge-messaging-service"
  11.             class="packagename.MessagingAdapter" />
  12.     </adapters>
  13.  
  14.     <!-- ...中略... -->
  15.  
  16. </service>
  • XML
  • remoting-config.xml
  • Source
  1. <?xml version="1.0" encoding="UTF-8"?>
  2.  
  3. <service id="hoge-remoting-service" class="flex.messaging.services.RemotingService">
  4.    
  5.     <!-- ...中略... -->
  6.    
  7.     <destination id="hoge-remote-object">
  8.         <properties>
  9.             <source>packagename.ClassName</source>
  10.             <scope>application</scope>
  11.         </properties>
  12.     </destination>
  13.    
  14. </service>

21Aug識別子なのに識別できなかった件

BlazeDSのMessaging APIsのServiceAdapterとAbstractBootstrapServiceのサブクラスを作っていた時のお話。

  • Java
  • MessagingAdapter.java
  • Source
  1. public class MessagingAdapter extends ServiceAdapter {
  2.     // ...中略...
  3.     @Override
  4.     public Object invoke(Message message) {
  5.         System.out.println(message.getClientId())// Result 19FF0FC6-1818-5450-D6BE-33FF6297BFD0
  6.     }
  7. }
  • Java
  • BootstrapService.java
  • Source
  1. public class BootstrapService extends AbstractBootstrapService {
  2.     // ...中略...
  3.     class ClientWatcher implements MessageClientListener {
  4.         public void messageClientCreated(MessageClient msgClient) {
  5.             System.out.println(msgClient.getClientId());    // Result 19FF11B5-B30A-3172-EDD2-0AB30F8A73EA
  6.         }
  7.     }
  8. }

この二つで取得できるクライアントIDって同一のクライアントなはずなのに別モノ。
この二つのクラスからRemoteObjectにクライアントID渡してごにょごにょしようとしてたらできなくて、調べていくとこういうことだった。

同じものが取得できると思ったのに。同じものが取得できると思ったのに。

17JulBlazeDS - Messaging(Server)

BlazeDSの主要な機能の一つであるMessegingのサーバーサイドの処理について。

  1. services-config.xmlにstreamingの設定を書く。

    ss_030
    • XML
    • services-config.xml
    • Source
    1. <?xml version="1.0" encoding="UTF-8"?>
    2.  
    3. <service id="message-service" class="flex.messaging.services.MessageService">
    4.    
    5.     <adapters>
    6.         <adapter-definition id="actionscript" class="flex.messaging.services.messaging.adapters.ActionScriptAdapter" default="true" />
    7.         <!-- <adapter-definition id="jms" class="flex.messaging.services.messaging.adapters.JMSAdapter"/> -->
    8.     </adapters>
    9.    
    10.     <default-channels>
    11.         <channel ref="my-streaming-amf"/>
    12.     </default-channels>
    13.    
    14.     <destination id="messagingTutorial"/>
    15.    
    16. </service>
  2. messaging-config.xmlにデフォルトチャンネルの設定、サービスのIDを書く。

    ss_031
    • XML
    • messaging-config.xml
    • Source
    1. <channel-definition id="my-streaming-amf" class="mx.messaging.channels.StreamingAMFChannel">
    2.     <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/streamingamf" class="flex.messaging.endpoints.StreamingAMFEndpoint"/>
    3.     <properties>
    4.         <idle-timeout-minutes>0</idle-timeout-minutes>
    5.         <max-streaming-clients>100</max-streaming-clients>
    6.         <server-to-client-heartbeat-millis>5000</server-to-client-heartbeat-millis>
    7.         <user-agent-settings>
    8.             <user-agent match-on="MSIE" kickstart-bytes="2048" max-streaming-connections-per-session="10"/>
    9.             <user-agent match-on="Firefox" kickstart-bytes="2048" max-streaming-connections-per-session="10"/>
    10.             <user-agent match-on="AppleWebKit" kickstart-bytes="2048" max-streaming-connections-per-session="10"/>
    11.         </user-agent-settings>
    12.     </properties>
    13. </channel-definition>
  3. サーバーを再起動。

07JulBlazeDS - Remotoing(Server)

BlazeDSの主要な機能の一つであるRemotingのサーバーサイドの処理について。

  1. remoting-config.xmlで、これから使うRemotingのサービスを定義する。 <destination id="***">には、クライアントからサーバーサイドJavaのメソッドを呼び出すときのユニークなIDを入力。 <source>***</source>には、サーバーサイドJavaのパッケージ名.クラス名を入力。

    • XML
    • remoting-config.xml
    • Source
    1. <destination id="remotingTutorial">
    2.     <properties>
    3.         <source>tutorial.RemotingTutorial</source>
    4.         <scope>application</scope>
    5.     </properties>
    6. </destination>
    ss_010
  2. 「ファイル > 新規 > プロジェクト」より、「Javaプロジェクト」を作成する。

    ss_011 ss_012
  3. 「内容 > 外部ソースからプロジェクトを作成」をチェックし、\tutorial\WEB-INF\classesを指定し、「次へ」。

    ss_013 
  4. 「ライブラリー > 外部JARの追加」で、\tutorial\WEB-INF\lib内の全jarファイルを指定し、クラスパスを通す。

    ss_014 ss_015 ss_016
  5. tutorial-javaを右クリックして、「新規 > パッケージ」をクリック。「名前」に1.で設定したパッケージ名(このチュートリアルでは"tutorial")を入力して「終了」。

    ss_017 ss_018
  6. \tutorial\WEB-INF\srcに1.で設定したクラス名のJavaのソースファイルを作る。(このチュートリアルでは"RemotingTutorial.java)

    ss_019
  7. 6.で作ったクラスファイル(RemotingTutorial.java)を、5.で作ったパッケージ内にリンクする。tutorialを右クリックして、「新規 > ファイル」をクリック。「拡張」をクリック後、6.で作ったクラスファイルを指定し、終了。

    ss_020 ss_021
  8. RemotingTutorial.javaを開き、足し算して返すだけの関数を書く。

    • Java
    • RemotingTutorial.java
    • Source
    1. package tutorial;
    2.  
    3. import java.util.HashMap;
    4.  
    5. public class RemotingTutorial {
    6.    
    7.     public RemotingTutorial() {
    8.         System.out.println("RemotingTutorial を初期化します");
    9.     }
    10.    
    11.     public HashMap<String, Integer> getCalcResult(HashMap<String, Integer> mapSource) {
    12.         HashMap<String, Integer> mapBody = new HashMap<String, Integer>();
    13.        
    14.         mapBody.put("result", (mapSource.get("param0") + mapSource.get("param1")));
    15.        
    16.         return mapBody;
    17.     }
    18.    
    19. }
    ss_022

06JulBlazeDS - 開発準備

  1. 開発環境となるEclipse + Flex Builder 3をインストールする。

  2. \blazeds\tomcat\webappsで、blazedsディレクトリをコピー。
    中にWEB-INFと、META-INFが入っているのを確認したら、Eclipseへ。

    ss_000 ss_001
  3. 「File > 新規 > プロジェクト」から、「Flex Builder > Flexプロジェクト」を選択して「次へ」。
    「プロジェクト名」にプロジェクトの名前を入力。(ここでは"tutorial")
    「プロジェクトの場所」に作業ディレクトリを指定。(ここでは"C:\blazeDS_temp\tutorial")
    「アプリケーションの種類」で「Web アプリケーション」を選択。
    「サーバーテクノロジ」で「アプリケーションサーバーの種類」を「J2EE」とし、「リモートオブジェクトアクセスサービスを使用」にチェック。

    ss_002 ss_003
  4. 「サーバーの場所」を2.で作ったディレクトリに指定し、「設定を検証」。
    「結合したFlexアプリケーションの場所」にデバッグ用ディレクトリを指定し、「終了」。

    ss_004 ss_005
  5. これでクライアント側の開発環境は整った。

    ss_006
  6. サーバー設定ファイルをリンクさせておく。srcフォルダを右クリックし、「新規 > ファイル」をクリック。

    ss_007
  7. 「拡張 > ファイル・システム内のファイルにリンク」で、C:\blazeDS\tomcat\webapps\tutorial\WEB-INF\flex\messaging-config.xmlを指定する。

    ss_008
  8. proxy-config.xml,remoting-config.xml,services-config.xmlについても同様にリンクしておく。

    ss_009



Return to page top