0

Linux server1 と server2 で独立して実行されている qoute という Java プロセスがあります。

この qoute プロセスは、Spring Rmi を使用して QuotingThread を作成し、そのスレッドで「quotableSet」コレクションと PriorityBlockingQueue の「addSymQ」を一連のシンボルで更新するために使用されます。

<bean id="quotes-core" class="com.process.quotes.QuotesHandler" scope="singleton" init-method="init">
      <constructor-arg>
         <bean id="continuousQuotingThread" class="com.process.quotes.QuotingThread" scope="singleton" >
            <property name="futureTaskUtil" ref="futureTaskUtil" />
            <property name="continueToProcess" ref="continueToProcess" />
            <property name="addSymQ" ref="addSymQ" />
         </bean>
      </constructor-arg>
   </bean>

   <bean class="org.springframework.remoting.rmi.RmiServiceExporter">
      <property name="serviceName" value="Quotes-Core" />
      <property name="service" ref="quotes-core" />
      <property name="serviceInterface" value="com.remote.QuotesHandlerIF" />
      <property name="registryPort" value="${${quotes-processor-port}}" />
   </bean>

QuotingThread は、このように構成された QuotesClient からのシンボルに基づいて、「quotableSet」と「addSymQ」を更新します。

<bean id="quotes" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
        <property name="serviceUrl" value="rmi://${${quotes-processor-host}}:${${quotes-processor-port}}/Quotes-Core" />
        <property name="serviceInterface" value="com.remote.QuotesHandlerIF" />
        <property name="refreshStubOnConnectFailure" value="true" />
        <property name="lookupStubOnStartup" value="false" />
</bean>

Spring Rmi を使用して各見積もりプロセスによって 2 つの別個の QuotingThread が作成されるため、

たとえば、シンボル a、b、c は quote process1 によって「quotableSet」、「addSymQ」に追加され、シンボル e、f、g は quote process2 によって「quotableSet」、「addSymQ」に追加されます。

追加はこのように行われます。

QuotingThread:
--------------------------------
    public void addSymbols(String commaDelimSymbolsList) {
        if (null != commaDelimSymbolsList && commaDelimSymbolsList.length() > 0) {
            String[] symAr = commaDelimSymbolsList.split(",");
            for (int i = 0; i < symAr.length; i++) {
                    addSymQ.add(sec.getUniqueSymbol());             
            }
        }
    }

public void run() {

        while (continueToProcess.get()) {
            try {
                while (addSymQ.peek() != null) {
                    String symbol = addSymQ.poll();
                    quotableSet.add(symbol);                    
                    // some usage with quotable set                                         
                }
                Iterator<String> ite = quotableSet.iterator();
                while (ite.hasNext()) {
                    String symbol = ite.next();
                    if (symbol != null && symbol.trim().length() > 0) {
                        // some usage with quotable set 
                    }
                }
                Thread.sleep(2000);
            } catch (Exception e) {
                logger.error("Exception : ", e);
            }
        }
    }

'quotableSet' と 'addSymQ' はこのように宣言されています。

private Set<String> quotableSet = Collections.synchronizedSet(new HashSet<String>(Arrays.asList("DJ!DJI,NQ!COMP,CX!SPX,RU!RUT,CX!VIX,CX!TNX");




 private PriorityBlockingQueue<String> addSymQ;

必要なのは、スレッドの「quotableSet」コレクションと「addSymQ」コレクションの両方でシンボルを複製する必要があることです。

つまり、シンボル a、b、c、e、f、g を両方のスレッド 'quotableSet' と 'addSymQ' コレクションに均等に追加する必要があります。

そのため、1 つのサーバーがダウンした場合、2 番目のサーバーがアプリケーションを提供できます。

誰でもこの問題について私を助けることができますか?

4

1 に答える 1

0

これを正しく理解しているかどうか見てみましょう。

2 つのサーバーがあり、それぞれが見積もりプロセスの 1 つのインスタンスを実行しています。これらのコレクションを処理する見積もりプロセスには 2 つのスレッドがあります。「スレッドの 'quotableSet' コレクションと 'addSymQ' コレクションの両方で複製する必要がある」というのは、引用プロセスで 2 つのスレッド間でコレクションを共有したいという意味ですか? もしそうなら、私がこれから得たものよりもはるかに簡単です-「1つのサーバーがダウンした場合、2番目のサーバーがアプリケーションをサーバー化できます」これは、2つのスレッドではなく、2つのサーバー間でコレクションを同期させたいことを示しています.

それとも、スレッドとプロセスの両方を同期するよう求めていますか? または、コレクション自体がサーバー間で複製される限り、2 つのスレッドがコレクション内で異なる値を持つことはできますか?

それぞれのヒントを次に示します。

1) スレッド間で同期。コレクションを 2 つのスレッド間で共有リソースで使用できるようにするだけで、コレクションが同期されていることを確認できます。そして、そこに行きます。

2) プロセス間で同期。2 つのプロセス間にソケットのような接続を確立して、相互にコレクション値を送受信できるようにする必要があります。これを処理するには、見積もりプロセスに追加のスレッドが必要になります。

幸運を。

于 2012-11-28T14:05:21.470 に答える