0

我有一个名为 qoute 的 java 进程在 linux server1 和 server2 上独立运行。

此 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 被引用进程 1 添加到 'quotableSet'、'addSymQ' 中,符号 e、f、g 被引用进程 2 添加到 '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' 集合中。

因此,如果一台服务器出现故障,第二台服务器可以为应用程序提供服务。

谁能帮我解决这个问题?

4

1 回答 1

0

让我看看我是否理解正确。

您有两台服务器,每台都运行一个报价流程实例。报价流程中有 2 个线程为这些集合提供服务。现在我感到困惑的是,您说“应该在两个线程的 'quotableSet' 和 'addSymQ' 集合上复制”这是否意味着您希望在报价过程中的 2 个线程之间共享集合?如果是这样,那比我从中得到的要容易得多-“如果一台服务器出现故障,第二台服务器可以为应用程序提供服务”,这表明您希望在两台服务器之间同步集合,而不是两个线程。

或者您是否要求同步线程和进程?或者,只要集合本身在服务器之间复制,这两个线程是否可以在集合中具有不同的值?

以下是每个方面的一些提示:

1) 跨线程同步。只需使集合在两个线程的共享资源中可用,确保您已同步集合。你去吧。

2) 跨进程同步。您将需要在两个进程之间建立一些连接,如套接字,以允许它们相互发送和接收集合值。这将需要在报价过程中打开一个额外的线程来处理这个问题。

祝你好运。

于 2012-11-28T14:05:21.470 回答