2009-12-09 14 views
5

मैं अपने फ्लेक्स एप्लिकेशन प्रोजेक्ट में डेटा-पुश सुविधा के लिए BlazeDS का उपयोग कर रहा हूं। आधिकारिक ट्यूटोरियल से, Getting started with BlazeDS, यह एपीआई से निर्माता/उपभोक्ता के साथ संदेश उदाहरण दिखाता है।फ्लेक्स क्लाइंट से संदेश प्राप्त किए बिना BlazeDS से डेटा को कैसे धक्का देना है?

लेकिन मैं सर्वर पक्ष को कैसे कार्यान्वित कर सकता हूं जिसे फ्लेक्स क्लाइंट से आमंत्रित करने की आवश्यकता नहीं है, बल्कि सर्वर-साइड के अंदर से। मुझे कुछ विचार आया लेकिन मुझे नहीं पता कि कैसे करना है क्योंकि मैं फ्लेक्स डेवलपर हूं, जावा डेवलपर नहीं, इसलिए मुझे लगता है कि आप मेरी मदद कर सकते हैं। गूगल में

  1. , वहाँ एक ट्यूटोरियल शो के बारे में मैं जावा साइड, जो Invoke विधि फैली में ServiceAdapter वर्ग का विस्तार करने की जरूरत है। क्या मुझे इसके बजाय अन्य वर्ग का विस्तार करने की आवश्यकता है जो मैं चाहता हूं?

  2. उपरोक्त वर्णित परिणाम प्राप्त करने के लिए message-config.xml को कॉन्फ़िगर कैसे करें?

+1

सलाह का टुकड़ा, किसी को इसे देखने और व्याकरण को सही करने के लिए प्राप्त करें। पालन ​​करना बहुत मुश्किल है। – cwallenpoole

उत्तर

8

यहां परीक्षण कोड है जिसे मैंने कभी-कभी लिखा है और हमारे क्लाइंट को डेटा भेजने का परीक्षण करने के लिए उपयोग किया है। यह एक एडेप्टर कार्यान्वयन का एक संक्षिप्त, नंगे हड्डियों जावा उदाहरण है। यह वेब पर मौजूदा उदाहरणों से बहुत अनावश्यक कोड हटा देता है। यह संकलित करता है, काम करता है और मैं अक्सर परीक्षण में इसका उपयोग करता हूं।

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

आपको इसे काम करने के लिए टोमकैट में कुछ गुण सेट करने की आवश्यकता है।

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

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

है कि एक ही messaging-config.xml फ़ाइल को यह गंतव्य जोड़ें:

मौजूदा <adapters> टैग में यह पंक्ति जोड़ दें:

messaging-config.xml में, आप एक एडाप्टर और गंतव्य जोड़ने की जरूरत

अंत में, सुनिश्चित करें कि "मेरा-स्ट्रीमिंग-एएमएफ" चैनल services-config.xml में परिभाषित किया गया है, जैसा कि:

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

ध्यान दें कि BlazeDS में, इन दो config फ़ाइलें (मैसेजिंग-config.xml और सेवाओं-config.xml) निम्न निर्देशिका में स्थित हैं:

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

जहां [nameOfYourApp] निर्देशिका अपने webapp है में रहता है

मुझे उम्मीद है कि इससे मदद मिलती है!

-kg

+0

यह कमाल है। क्या आप उसी वर्ग में भेजे गए संदेश को प्राप्त करना भी संभव होगा? – MikeW

1

क्या आपको सर्वर से सर्वर से संदेशों को धक्का देने की आवश्यकता है? इस मामले में BlazeDS नमूने में एक नज़र डालें। Traderdesktop नामक फ़ोल्डर में एक नमूना है। संदेश भेजने वाला कोड का टुकड़ा नीचे दिया गया है:

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

आपके उत्तर के लिए धन्यवाद, कॉमेल। मुझे निर्दिष्ट करने के लिए क्लाइंट आईडी क्या है? या मैं इसे कहां से प्राप्त कर सकता हूं? – Teerasej

+0

उसी नमूने से: स्ट्रिंग क्लाइंट आईडी = UUIDUtils.createUUID(); –

0

आप रनटाइम पर धारा के लिए url सेट करना चाहते हैं निम्नलिखित है:

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

बस एक सिर ऊपर। यह जाने के लिए कुछ सिर टक्कर लगी। मुझे उम्मीद है कि यह किसी की मदद करेगा।

संबंधित मुद्दे