2009-12-09 14 views
5

Estoy utilizando BlazeDS para la función de inserción de datos en mi proyecto de aplicación Flex. Desde el tutorial oficial, Getting started with BlazeDS, muestra ejemplos de mensajes con productores/consumidores de API.cómo enviar datos desde BlazeDS sin recibir mensajes del cliente Flex?

pero cómo puedo implementar el lado del servidor que no necesita ser invocado desde el cliente Flex, sino desde el lado del servidor. Tengo una idea pero no sé cómo hacerlo porque soy un desarrollador de Flex, no un desarrollador de Java, así que creo que puedes ayudarme.

  1. En Google, hay un espectáculo tutorial sobre lo que necesito para extender ServiceAdapter clase en Java del lado, que se extiende Invoke método. ¿Debo extender otra clase en lugar de esto para hacer lo que quiero?

  2. ¿Cómo configurar el message-config.xml para obtener el resultado como he descrito anteriormente?

+1

Un consejo, pídale a alguien que lo revise y corrija la gramática. Es muy difícil de seguir. – cwallenpoole

Respuesta

8

Aquí está el código de prueba que escribió y uso, a veces, para probar el envío de datos a nuestro cliente. Es un ejemplo de Java simplificado y básico de una implementación de ServiceAdapter. Elimina una gran cantidad de código innecesario de los ejemplos existentes en la web. Compila, funciona y lo uso a menudo en las pruebas.

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(); 
     } 
    }   
} 

Es necesario configurar algunas propiedades en Tomcat para conseguir que esto funcione.

En messaging-config.xml, es necesario agregar un adaptador y destino:

añadir esta línea a la <adapters> etiqueta existente:

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

Añadir este destino a ese mismo messaging-config.xml archivo:

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

Finalmente, asegúrese de que el canal "my-streaming-amf" esté definido en services-config.xml, como en:

<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> 

Nótese que en blazeds, estos dos archivos de configuración (mensajería-config.xml y servicios-config.xml) se encuentran en el directorio siguiente:

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

donde [nameOfYourApp] es el directorio de su webapp Vive en.

¡Espero que todo eso ayude!

-kg

+0

Esto es asombroso. ¿Sería posible recibir también el mensaje que envía en esa misma clase? – MikeW

1

¿Necesita enviar los mensajes del servidor al cliente? En este caso, eche un vistazo a las muestras de BlazeDS. Hay una muestra en una carpeta llamada traderdesktop. El trozo de código que está enviando los mensajes es el siguiente:

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

Gracias por su respuesta, Comel. ¿Cuál es el ID de cliente que necesito especificar? o de donde podría obtenerlo? – Teerasej

+0

del mismo ejemplo: String clientID = UUIDUtils.createUUID(); –

0

Si desea establecer la dirección URL a la corriente en tiempo de ejecución, haga lo siguiente:

//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); 

Sólo las cabezas para arriba. Esto tomó algunos golpes de cabeza para ponerse en marcha. Espero que esto ayude a alguien.

Cuestiones relacionadas