2009-12-09 15 views
5

Używam BlazeDS dla funkcji wypychania danych w moim projekcie aplikacji Flex. Z oficjalnego samouczka, Getting started with BlazeDS, pokazuje przykład wiadomości z producentem/konsumentem z API.jak przesłać dane z BlazeDS bez odbierania wiadomości od klienta Flex?

ale jak mogę zaimplementować stronę serwera, która nie musi być wywoływana z klienta Flex, ale z poziomu serwera. Mam pomysł, ale nie wiem, jak to zrobić, ponieważ jestem programistą Flex, a nie programistą Java, więc myślę, że możesz mi pomóc.

  1. w Google, tam tutorial pokaz o muszę przedłużyć ServiceAdapter klasę Java po stronie, która rozciąga Invoke metody. Czy muszę zamiast tego wykonywać inne zajęcia, aby robić to, co chcę?

  2. Jak skonfigurować message-config.xml, aby uzyskać wynik podobny do opisanego powyżej?

+1

Porada, niech ktoś obejrzy to i poprawi gramatykę. To bardzo trudne do naśladowania. – cwallenpoole

Odpowiedz

8

Oto kod testowy, który napisałem i którego używam czasami do testowania wysyłania danych do naszego klienta. Jest to uproszczona wersja Java Service implementacji ServiceAdapter. Usuwa wiele niepotrzebnego kodu z istniejących przykładów w Internecie. Kompiluje, działa i często go używam w testach.

package your.package.structure.adapter; 

import your.package.structure.device.DevicePort; 
import flex.messaging.messages.AsyncMessage; 
import flex.messaging.messages.Message; 
import flex.messaging.services.MessageService; 
import flex.messaging.services.ServiceAdapter; 
import flex.messaging.util.UUIDUtils; 

    /** 
    * Test service adapter. Great for testing when you want to JUST SEND AN OBJECT and nothing 
    * else. This class has to stay in the main codebase (instead of test) because, when it's used 
    * it needs to be deployed to Tomcat. 
    * @author Kevin G 
    * 
    */ 

public class TestServiceAdapter extends ServiceAdapter { 

    private volatile boolean running; 

    private Message createTestMessage() { 
     DevicePort objectToSend = new DevicePort("RouterDevice"); 

     final AsyncMessage msg = new AsyncMessage(); 
     msg.setDestination(getClass().getSimpleName() + "Destination"); 
     msg.setClientId(UUIDUtils.createUUID()); 
     msg.setMessageId(UUIDUtils.createUUID()); 
     msg.setBody(objectToSend); 

     return msg; 
    } 

    private void sendMessageToClients(Message msg) { 
     ((MessageService) getDestination().getService()).pushMessageToClients(msg, false); 
    } 

    /** 
    * @see flex.messaging.services.ServiceAdapter#start() 
    */ 
    @Override 
    public void start(){  
     super.start(); 

     Thread messageSender = new Thread(){ 
      public void run(){ 
       running = true; 
       while(running){ 
        sendMessageToClients(createTestMessage()); 
        secondsToSleep(3); 
       } 
      } 
     }; 

     messageSender.start();   
    } 
    /** 
    * @see flex.messaging.services.ServiceAdapter#stop() 
    */ 
    @Override 
    public void stop(){ 
     super.stop(); 
     running = false; 
    } 
    /** 
    * This method is called when a producer sends a message to the destination. Currently, 
    * we don't care when that happens. 
    */ 
    @Override 
    public Object invoke(Message message) { 
     if (message.getBody().equals("stop")) { 
      running = false; 
     } 
     return null; 
    } 
    private void secondsToSleep(int seconds) { 
     try{ 
      Thread.sleep(seconds * 1000); 
     }catch(InterruptedException e){ 
      System.out.println("TestServiceAdapter Interrupted while sending messages"); 
      e.printStackTrace(); 
     } 
    }   
} 

Musisz ustawić kilka właściwości w tomcat, aby to działało.

W messaging-config.xml, trzeba dodać adapter i przeznaczenia:

dodać linię do istniejącej <adapters> tagu:

<adapter-definition id="TestServiceAdapter" class="your.package.structure.adapter.TestServiceAdapter"/> 

Dodaj ten cel do tej samej messaging-config.xml pliku:

<destination id="TestServiceAdapterDestination"> 
     <channels> 
      <channel ref="my-streaming-amf"/> 
     </channels> 
     <adapter ref="TestServiceAdapter"/> 
    </destination> 

Wreszcie, upewnij się, że kanał "my-streaming-amf" jest zdefiniowany w services-config.xml, jak w:

<channel-definition id="my-streaming-amf" class="mx.messaging.channels.StreamingAMFChannel"> 
     <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/streamingamf" class="flex.messaging.endpoints.StreamingAMFEndpoint"/> 
     <properties> 
      <!-- you don't need to set all these properties, this is just what we set, included for illustration, only --> 
      <idle-timeout-minutes>0</idle-timeout-minutes> 
      <max-streaming-clients>10</max-streaming-clients> 
       <server-to-client-heartbeat-millis>5000</server-to-client-heartbeat-millis> 
      <user-agent-settings> 
       <user-agent match-on="Safari" kickstart-bytes="2048" max-streaming-connections-per-session="10"/> 
       <user-agent match-on="MSIE" kickstart-bytes="2048" max-streaming-connections-per-session="15"/> 
       <user-agent match-on="Firefox" kickstart-bytes="2048" max-streaming-connections-per-session="10"/> 
      </user-agent-settings> 
     </properties> 
    </channel-definition> 

Należy zauważyć, że w BlazeDS, te dwa pliki konfiguracyjne (wiadomości-config.xml i services-config.xml) znajdują się w następującym katalogu:

/blazeds/tomcat/webapps/[nameOfYourApp]/WEB-INF/flex/ 

gdzie [nameOfYourApp] jest katalog Twój webapp mieszka w.

Mam nadzieję, że to pomoże!

-kg

+0

To jest niesamowite. Czy możliwe byłoby również otrzymanie wiadomości wysłanej w tej samej klasie? – MikeW

1

Czy chcesz przekazywać wiadomości z serwera do klienta? W takim przypadku zajrzyj do próbek BlazeDS. W folderze o nazwie traderdesktop znajduje się próbka. Fragment kodu, który wysyła wiadomości, jest poniżej:

MessageBroker msgBroker = MessageBroker.getMessageBroker(null); 

AsyncMessage msg = new AsyncMessage(); 

msg.setDestination(yourdestination); 

msg.setClientId(clientID); 

msg.setMessageId(UUIDUtils.createUUID()); 

msg.setTimestamp(System.currentTimeMillis()); 

msg.setBody("dummy"); 

msgBroker.routeMessageToService(msg, null); 
+0

Dziękuję za odpowiedź, Comel. Co to jest identyfikator klienta, który muszę podać? lub skąd mogę to wziąć? – Teerasej

+0

Z tego samego przykładu: String clientID = UUIDUtils.createUUID(); –

0

Jeśli chcesz ustawić adres URL do strumienia w czasie wykonywania należy wykonać następujące czynności:

//assumes _consumer is an instance variable mx.messaging.Consumer 
var channelSet:ChannelSet = new ChannelSet(); 
//change {server.name}:{server.port} to the end point you wanna hit 
var ep:String = "http://{server.name}:{server.port}/messagebroker/streamingamf"; 
var channel:StreamingAMFChannel = new StreamingAMFChannel("my-streaming-amf", ep); 
channelSet.addChannel(channel); 

_consumer = new Consumer(); 
_consumer.channelSet = channelSet; 
_consumer.destination = "TestServiceAdapterDestination"; 
_consumer.subscribe(); 
_consumer.addEventListener(MessageEvent.MESSAGE, onMsg); 
_consumer.addEventListener(MessageFaultEvent.FAULT, faultHandler); 

prostu głowy do góry. To wymagało trochę headbangingu, żeby zacząć. Mam nadzieję, że to pomoże komuś.

Powiązane problemy