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 番目のサーバーがアプリケーションを提供できます。
誰でもこの問題について私を助けることができますか?