একক প্রযোজক একক গ্রাহক এখন আমি একাধিক ভোক্তাদের প্রয়োজন

আমার একটি পরিস্থিতি আছে যেখানে আমি ব্লুটুথ থেকে ডেটাংশের অংশে পড়ার জন্য একটি সহজ প্রযোজক কনজিউমার মডেল লিখেছিলাম, তারপর আমি প্রতি 10k বাইট ফাইল লিখতে লিখি। আমি আমার বার্তা ধারক হিসাবে একটি ভেক্টর ব্যবহার করে একটি আদর্শ পি-সি মডেল ব্যবহার। তাই আমি কিভাবে এই পরিবর্তন করব যাতে একাধিক থ্রেড গ্রাহক একই বার্তা পড়তে পারে, আমি মনে করি এই শব্দটি মাল্টিকাস্টার হবে? আমি আসলেই এন্ড্রয়েড ফোনে এটি ব্যবহার করছি তাই JMS সম্ভবত একটি বিকল্প নয়।

static final int MAXQUEUE = 50000; 
private Vector messages = new Vector(); 

/**
 * Put the message in the queue for the Consumer Thread
 */
private synchronized void putMessage(byte[] send) throws InterruptedException { 

    while ( messages.size() == MAXQUEUE ) 
        wait(); 
    messages.addElement( send ); 
    notify(); 
} 


/**
 * This method is called by the consumer to see if any messages in the queue
 */
public synchronized byte[] getMessage()throws InterruptedException { 
    notify(); 
    while ( messages.size() == 0 && !Thread.interrupted()) {
        wait(1); 
    }
    byte[] message = messages.firstElement(); 
    messages.removeElement( message ); 
    return message; 
} 

আমি একটি ওরেলি বই বার্তা পার্সার বিভাগ থেকে কোড উল্লেখ করছি

1

3 উত্তর

Pub-sub mechanism স্পষ্টভাবে আপনি চান কি অর্জন করার উপায়। আমি নিশ্চিত নই যে কেন অ্যান্ড্রয়েডের জন্য ডেভেলপমেন্ট আপনাকে JMS ব্যবহার করা থেকে সীমাবদ্ধ করবে, যা এটি যতটা সহজ হবে ততই সহজ। চেক আউট এই থ্রেড এ SO।

1
যোগ
হ্যাঁ কিন্তু বেশিরভাগই জেএমএস ব্যবহার সম্পর্কে কথা বলে যা আমি ফোনের অ্যাপ্লিকেশন পাঠানোর জন্য যা কিছু প্রয়োজন তার জন্য ওভারবোর্ডের মতো।
যোগ লেখক JPM, উৎস
যে ক্ষেত্রে, আপনার ভেক্টর (অথবা একটি কুইউ হিসাবে হ্যানো বাইণ্ডার প্রস্তাবিত) একটি পর্যবেক্ষক/পর্যবেক্ষক প্যাটার্ন মধ্যে সহজ মোড়ানো হবে?
যোগ লেখক mazaneicha, উৎস

আপনি অবশ্যই ভেক্টর </এর পরিবর্তে একটি সারি ব্যবহার করতে হবে। কোড>!
প্রতিটি থ্রেড তার নিজের সারি দিন এবং, যখন একটি নতুন বার্তা প্রাপ্ত হয়, যোগ() প্রতিটি থ্রেডের সারিতে নতুন বার্তা। নমনীয়তা জন্য, একটি শ্রোতা প্যাটার্ন খুব দরকারী হতে পারে।

সম্পাদনা:

ঠিক আছে, আমি মনে করি আমিও একটি উদাহরণ যোগ করা উচিত:
(ক্লাসিকাল পর্যবেক্ষক প্যাটার্ন)

এই ইন্টারফেস, সব ভোক্তাদের বাস্তবায়ন করা আবশ্যক:

public interface MessageListener {
  public void newMessage( byte[] message );
}

একটি প্রযোজক এই মত চেহারা হতে পারে:

public class Producer {
  Collection listeners = new ArrayList();


 //Allow interested parties to register for new messages
  public void addListener( MessageListener listener ) {
    this.listeners.add( listener );
  }

  public void removeListener( Object listener ) {
    this.listeners.remove( listener );
  }

  protected void produceMessages() {
    byte[] msg = new byte[10];

   //Create message and put into msg

   //Tell all registered listeners about the new message:
    for ( MessageListener l : this.listeners ) {
      l.newMessage( msg );
    }

  }
}

এবং একটি ভোক্তা বর্গ হতে পারে (একটি ব্লকিং সারি ব্যবহার করে যা অপেক্ষা করুন) ing এবং অবহিত() আমাদের জন্য ইঙ্গিত করে):

public class Consumer implements MessageListener {

  BlockingQueue< byte[] > queue = new LinkedBlockingQueue< byte[] >();

 //This implements the MessageListener interface:
  @Override
  public void newMessage( byte[] message ) {
    try {
      queue.put( message );
    } catch (InterruptedException e) {
       //won't happen.
    }
  }

   //Execute in another thread:       
    protected void handleMessages() throws InterruptedException {
        while ( true ) {
            byte[] newMessage = queue.take();

           //handle the new message.
        }
    }


}
0
যোগ
ভেক্টর এবং সারি উভয় বস্তু ধারণ করতে পারে, primtives না। ব্লকিং লাইনগুলি ব্যবহার করুন এবং আপনার পুরো কোডটি সারি queue.put (message) এবং queue.take() হিসাবে সহজ হয়ে যায়।
যোগ লেখক JimmyB, উৎস
আমি SettableFuture এক কাজ করতে পারছি না, কারণ আমি আপনার উদাহরণ দিকে আরো leaning করছি।
যোগ লেখক JPM, উৎস
আমি সবসময় শোনোয়ারদের সাথে এমন কিছু পরিচালনা করতাম, এমনকি একটি JMS সিস্টেম থেকে রিয়েল টাইম ডেটা গ্রহণ করার জন্য এবং এই রাষ্ট্র পরিবর্তনগুলির সাথে কাস্টম উপাদানগুলি আপডেট করার জন্য সমগ্র GUI স্টেট শ্রোতা সিস্টেমটি লিখেছিলাম।
যোগ লেখক JPM, উৎস

কিছু কোড দিয়ে digging এবং কিছু বিদ্যমান উদাহরণ modifiying যখন আমি যেমন একটি উদাহরণ হিসাবে সঙ্গে এসেছিলেন।

package test.messaging;

import java.util.ArrayList;
import java.util.concurrent.LinkedBlockingQueue;

public class TestProducerConsumers {

    static Broker broker;

    public TestProducerConsumers(int maxSize) {
        broker = new Broker(maxSize);
        Producer p = new Producer();
        Consumer c1 = new Consumer("One");
        broker.consumers.add(c1);
        c1.start();

        Consumer c2 = new Consumer("Two");
        broker.consumers.add(c2);
        c2.start();

        p.start();
    }

   //Test Producer, use your own message producer on a thread to call up
   //broker.insert() possibly passing it the message instead.
    class Producer extends Thread {

        @Override
        public void run() {
            while (true) {
                try {
                    broker.insert();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    class Consumer extends Thread {
        String myName;
        LinkedBlockingQueue queue;

        Consumer(String m) {
            this.myName = m;
            queue = new LinkedBlockingQueue();
        }

        @Override
        public void run() {
            while(!Thread.interrupted()) {
                try {
                    while (queue.size() == 0 && !Thread.interrupted()) {
                        ;
                    }
                    while (queue.peek() == null && !Thread.interrupted()) {
                        ;
                    }
                    System.out.println("" + myName + " Consumer: " + queue.poll());
                } catch (Exception e) { }
            }
        }
    }

    class Broker {
        public ArrayList consumers = new ArrayList();

        int n;
        int maxSize;

        public Broker(int maxSize) {
            n = 0;
            this.maxSize = maxSize;
        }

        synchronized void insert() throws InterruptedException {
                   //only here for testing don't want it to runaway and 
                    //memory leak, only testing first 100 samples.
            if (n == maxSize)
                wait();
            System.out.println("Producer: " + n++);
            for (Consumer c : consumers) {
                c.queue.add("Message " + n);
            }
        }

    }

    public static void main(String[] args) {
        TestProducerConsumers pc = new TestProducerConsumers(100);

    }
}
0
যোগ
ব্যস্ত অপেক্ষা করতে সময় (...) লুপগুলি ব্যবহার করবেন না! যে সত্যিই খারাপ কোডিং। একটি ব্লকিং সারি সন্নিবেশ()অপেক্ষা() এ থাকা > এর জন্য আপনার সমস্তকিছু পরিচালনা করবে। (যেভাবেই অবহিত() কোনটি কল করুন?)
যোগ লেখক JimmyB, উৎস
তাহলে, তার সাথে কি আছে "যদি (n == max size) অপেক্ষা করুন ();"?
যোগ লেখক JimmyB, উৎস
ভোক্তাদের অপেক্ষা করা হয় না হিসাবে আপনি সন্নিবেশ উপর অবহিত করার প্রয়োজন নেই() 'পরীক্ষার জন্য আছে। আমি কিছু ঘুমানোর পরিবর্তে ভোক্তাদের অপেক্ষা করতে থাকি কারণ আমার বার্তাগুলি রিয়েল টাইম হওয়ার দরকার নেই।
যোগ লেখক JPM, উৎস
আবার পরীক্ষার শুধুমাত্র 100 বার্তা চেয়েছিলেন
যোগ লেখক JPM, উৎস