{"id":14,"date":"2010-06-30T13:20:18","date_gmt":"2010-06-30T11:20:18","guid":{"rendered":"http:\/\/www.capri-soft.de\/blog\/?p=14"},"modified":"2018-03-05T16:10:36","modified_gmt":"2018-03-05T15:10:36","slug":"fluorinefx-messaging-konfigurieren","status":"publish","type":"post","link":"https:\/\/www.capri-soft.de\/blog\/?p=14","title":{"rendered":"FluorineFX RTMP\/Messaging konfigurieren"},"content":{"rendered":"<p>In einer Microsoft IIS Umgebung greift der Flex-Entwickler auf die kostenlose Middleware <a href=\"http:\/\/www.fluorinefx.com\">FluorineFX<\/a> zur\u00fcck. Hier gibt es 4 wichtige Dateien, die f\u00fcr die Konfiguration des Frameworks zust\u00e4ndig sind.<\/p>\n<ul>\n<li>data-management-config.xml<\/li>\n<li>messaging-config.xml<\/li>\n<li>remoting-config.xml<\/li>\n<li>services-config.xml<\/li>\n<\/ul>\n<p>Dem Java-Entwickler sind diese Dateien ebenfalls aus der Java-Bibliothek BlazeDS bekannt.<\/p>\n<p>Bei einem Kompiliervorgang wird die Datei services-config.xml in den Compilersettings angegeben.<br \/>\n[Rechtsklick auf Projekt in Workspace -> Properties -> Flex Compiler -> Additional compiler arguments]<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">-locale en_US -services services-config.xml -context-root \/<\/pre>\n<p>Es gibt die M\u00f6glichkeit einen direkten Pfad mit einer Netzwerkfreigabe auf die services-config.xml des IIS-Servers anzugeben oder diese Datei lokal zu kopieren und die URL&#8217;s <\/p>\n<ul>\n<li>RTMP &#8211; Real Time Messaging Protocol &#8211; was f\u00fcr Messaging ben\u00f6tigt wird und.. <\/li>\n<li>die normalen AMF Services (Actionscript Messaging Format &#8211;  dient lediglich der RPC-Kommunikation wie GWT RPC oder SOAP Webservices, hierauf wird in diesem Artikel nicht eingegangen)<\/li>\n<\/ul>\n<p>anzupassen. Hierbei kann man eine absolute Pfadangabe machen, wenn man den IIS nicht lokal auf dem Entwicklerrechner installiert hat (dies ist das Vorgehen in diesem Artikel). Auf dem Server, auf dem sich redundant (in der deployten FluorineFX-Anwendung im WEB-INF-Verzeichnis) diese Dateien befinden, werden allerdings entgegen den nachfolgenden Beispielen anstelle der absoluten Pfade die Platzhalter rtmp:\/\/{server.name}:2037 und http:\/\/{server.name}:{server.port}\/{context.root}\/Gateway.aspx verwendet.<\/p>\n<p>services-config.xml:<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt; \r\n&lt;services-config&gt;\r\n    &lt;services&gt;\r\n      &lt;service-include file-path=&quot;remoting-config.xml&quot; \/&gt;\r\n      &lt;service-include file-path=&quot;messaging-config.xml&quot; \/&gt;\r\n    &lt;\/services&gt;\r\n       \r\n    &lt;channels&gt;\r\n        &lt;channel-definition id=&quot;my-amf&quot; class=&quot;mx.messaging.channels.AMFChannel&quot;&gt;\r\n\t        &lt;endpoint uri=&quot;http:\/\/rechner3j.asag.asap.com:4321\/Gateway.aspx&quot; \r\n                 class=&quot;flex.messaging.endpoints.AMFEndpoint&quot;\/&gt; \r\n        &lt;\/channel-definition&gt;\r\n\r\n        &lt;channel-definition id=&quot;my-rtmp&quot; class=&quot;mx.messaging.channels.RTMPChannel&quot;&gt;\r\n            &lt;endpoint uri=&quot;rtmp:\/\/rechner3j.asag.asap.com:2037&quot; \r\n             class=&quot;flex.messaging.endpoints.RTMPEndpoint&quot;\/&gt;\r\n            &lt;properties&gt;\r\n                &lt;idle-timeout-minutes&gt;0&lt;\/idle-timeout-minutes&gt;\r\n            &lt;\/properties&gt;\r\n        &lt;\/channel-definition&gt;\r\n\r\n    &lt;\/channels&gt;\r\n&lt;\/services-config&gt;\r\n<\/pre>\n<p>remoting-config.xml<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;\r\n&lt;service id=&quot;remoting-service&quot; class=&quot;flex.messaging.services.RemotingService&quot; \r\n messageTypes=&quot;flex.messaging.messages.RemotingMessage&quot;&gt;\r\n    &lt;adapters&gt;\r\n        &lt;adapter-definition id=&quot;dotnet&quot; class=&quot;FluorineFx.Remoting.RemotingAdapter&quot; \r\n\tdefault=&quot;true&quot;\/&gt;\r\n    &lt;\/adapters&gt;\r\n\r\n    &lt;0default-channels&gt;\r\n        &lt;channel ref=&quot;my-amf&quot;\/&gt;\r\n    &lt;\/default-channels&gt;\r\n\r\n  &lt;destination id=&quot;GenericDestination&quot;&gt;\r\n    &lt;properties&gt;\r\n      &lt;source&gt;*&lt;\/source&gt;\r\n    &lt;\/properties&gt;\r\n  &lt;\/destination&gt;  \r\n\r\n  &lt;destination id=&quot;fluorine&quot;&gt;\r\n    &lt;properties&gt;\r\n       &lt;source&gt;*&lt;\/source&gt;\r\n    &lt;\/properties&gt;      \r\n  &lt;\/destination&gt;\r\n&lt;\/service&gt;\r\n<\/pre>\n<p>messaging-config.xml<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;\r\n&lt;service id=&quot;message-service&quot; class=&quot;flex.messaging.services.MessageService&quot; \r\n messageTypes=&quot;flex.messaging.messages.AsyncMessage&quot;&gt;\r\n     &lt;!-- DO NOT CHANGE &lt;adapters&gt; SECTION--&gt;\r\n    &lt;adapters&gt;\r\n\t&lt;adapter-definition id=&quot;messagingAdapter&quot; \r\n        class=&quot;FluorineFx.Messaging.Services.Messaging.MessagingAdapter&quot; \r\n        default=&quot;true&quot;\/&gt;\r\n    &lt;\/adapters&gt;\r\n\r\n    &lt;destination id=&quot;chat&quot;&gt;\r\n\t\t&lt;adapter ref=&quot;messagingAdapter&quot;\/&gt;\r\n    \t&lt;properties&gt;\r\n\t        &lt;network&gt;\r\n            \t&lt;session-timeout&gt;0&lt;\/session-timeout&gt;\r\n        \t&lt;\/network&gt;\r\n    \t&lt;\/properties&gt;\r\n    \t&lt;channels&gt;\r\n         \t&lt;channel ref=&quot;my-rtmp&quot;\/&gt;\r\n    \t&lt;\/channels&gt;\r\n    &lt;\/destination&gt;\r\n&lt;\/service&gt;\r\n<\/pre>\n<p>FluorineFX geht folgenderma\u00dfen vor:<br \/>\nSobald die Server-Seite (also nicht die Dateien mit den absoluten Pfaden wie obenstehend) mit der Definition f\u00fcr einen RTMP-Channel versehen wurde, wird ein Treffer auf einer beliebigen ASPX-Seite innerhalb der FluorineFX-Webanwendung dazu f\u00fchren, das ein Socket auf dem definierten Port gestartet wird (oben w\u00e4re dass dann Port 2037 f\u00fcr RTMP). Ob es funktioniert hat, l\u00e4sst sich mit einem telnet-Login pr\u00fcfen. Hierzu einfach mal in der Eingabeaufforderung (CMD) <\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">telnet hostname 2037<\/pre>\n<p>eingeben. Sollte der RTMP-Server nicht laufen, bitte mal auf dem Server per Remotekonsole einloggen und in der Eingabeaufforderung mit <\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">telnet 127.0.0.1 2037<\/pre>\n<p>den Login versuchen.<br \/>\nDer Login funktioniert, wenn der Bildschirm gel\u00f6scht wird und ein Cursor in der Ecke links oben steht. Dieser Modus kann meistens mit STRG+C abgebrochen werden, sollte dies nicht funktionieren kann man auch die Eingabeaufforderung schlie\u00dfen. <\/p>\n<p>Wichtig!!! Damit sie die Flex-Anwendung \u00fcberhaupt mit der Messaging-Funktionalit\u00e4t und den obengenannten Konfigurationsdateien kompilieren k\u00f6nnen ben\u00f6tigen sie 2 Dateien, die sie in der Installation der Adobe Livecycle Services (LSDS) finden.<\/p>\n<ul>\n<li>fds_rb.swc<\/li>\n<li>fds.swc<\/li>\n<\/ul>\n<p>Sie m\u00fcssen einen Account bei Adobe registrieren und die LCDS runterladen, anschlie\u00dfend kopieren sie die o.g. Dateien in das LIB-Verzeichnis ihrer Flex-Anwendung und es kompiliert!!! Gl\u00fcckwunsch. So nun ein kleines Beispiel f\u00fcr einen gut funktionierenden Chat:<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;\r\n&lt;mx:Application creationComplete=&quot;{creationComplete()}&quot; \r\n    xmlns:mx=&quot;http:\/\/www.adobe.com\/2006\/mxml&quot; layout=&quot;absolute&quot;&gt;\r\n\t&lt;mx:Script&gt;\r\n\t&lt;!&#x5B;CDATA&#x5B;\r\n\t    import mx.controls.Alert;\r\n\t    import mx.rpc.events.FaultEvent;\r\n            import mx.rpc.events.ResultEvent;\r\n    \t    import mx.messaging.*;\r\n    \t    import mx.messaging.messages.*;\r\n    \t    import mx.messaging.events.*;\r\n    \t    import mx.core.Application; \r\n    \t\t\r\n    \t    public function creationComplete():void\r\n    \t    {\r\n    \t\tconsumer.subscribe();\r\n    \t    }\r\n   \r\n            private function messageHandler(event:MessageEvent):void\r\n            {\r\n    \t\ttxtLog.text += event.message.body.toString()+'\\r';\r\n    \t    }\r\n   \r\n            private function messagefaultHandler(event:MessageFaultEvent):void\r\n    \t    { \r\n        \tAlert.show(event.faultString, &quot;Error&quot;); \r\n    \t    }\r\n   \r\n            public function sendMessage():void\r\n\t    {\r\n        \tvar message:AsyncMessage = new AsyncMessage();\r\n       \t\tmessage.body = txtOutput.text;\r\n       \t\tproducer.send(message);\r\n       \t\ttxtOutput.text=&quot;&quot;;\r\n    \t    }\r\n\t]]&gt;\r\n       &lt;\/mx:Script&gt;\r\n       &lt;mx:Consumer id=&quot;consumer&quot; destination=&quot;chat&quot; \r\n\t   message=&quot;messageHandler(event)&quot; fault=&quot;messagefaultHandler(event)&quot;\/&gt;\r\n       &lt;mx:Producer id=&quot;producer&quot; destination=&quot;chat&quot; fault=&quot;messagefaultHandler(event)&quot;\/&gt;\r\n       &lt;mx:VBox width=&quot;100%&quot; height=&quot;100%&quot;&gt;\r\n    \t\r\n       &lt;mx:HBox width=&quot;100%&quot;&gt;\r\n         &lt;mx:TextInput width=&quot;100%&quot; id=&quot;txtOutput&quot;\/&gt;\r\n         &lt;mx:Button label=&quot;Skicka&quot; click=&quot;sendMessage()&quot;\/&gt;\r\n       &lt;\/mx:HBox&gt;\r\n    \t&lt;mx:TextArea height=&quot;100%&quot; width=&quot;100%&quot; editable=&quot;true&quot; id=&quot;txtLog&quot;\/&gt;\r\n    &lt;\/mx:VBox&gt;\r\n&lt;\/mx:Application&gt;\r\n<\/pre>\n<iframe src=\"http:\/\/www.facebook.com\/plugins\/like.php?href=https%3A%2F%2Fwww.capri-soft.de%2Fblog%2F%3Fp%3D14&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light\" scrolling=\"no\" frameborder=\"0\" allowTransparency=\"true\" style=\"border:none; overflow:hidden; width:450px;margin-top:5px;\"><\/iframe>","protected":false},"excerpt":{"rendered":"<p>In einer Microsoft IIS Umgebung greift der Flex-Entwickler auf die kostenlose Middleware FluorineFX zur\u00fcck. Hier gibt es 4 wichtige Dateien, die f\u00fcr die Konfiguration des Frameworks zust\u00e4ndig sind. data-management-config.xml messaging-config.xml remoting-config.xml services-config.xml Dem Java-Entwickler sind diese Dateien ebenfalls aus der Java-Bibliothek BlazeDS bekannt. Bei einem Kompiliervorgang wird die Datei services-config.xml in den Compilersettings angegeben. [Rechtsklick &hellip; <a href=\"https:\/\/www.capri-soft.de\/blog\/?p=14\" class=\"more-link\"><span class=\"screen-reader-text\">FluorineFX RTMP\/Messaging konfigurieren<\/span> weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[4,5],"tags":[],"class_list":["post-14","post","type-post","status-publish","format-standard","hentry","category-net","category-adobe-flex"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p4yGeN-e","jetpack_likes_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/14","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=14"}],"version-history":[{"count":11,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/14\/revisions"}],"predecessor-version":[{"id":2637,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/14\/revisions\/2637"}],"wp:attachment":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=14"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=14"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=14"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}