문제

결함 내성 JMS 서버 역할을하기 위해 JBoss 5.1 서버 쌍이 모여 있습니다.

MySQL Datastore (MySQL-Persistence-Service.xml에서 클러스터링 설정을 활성화 함)를 사용하도록 구성했습니다. Destinations-Service.xml에서 주제 MBean을 작성하여 다음을 정의했습니다.

   <mbean code="org.jboss.jms.server.destination.TopicService" name="jboss.messaging.destination:service=Topic,name=ECM-PRM-Topic" xmbean-dd="xmdesc/Topic-xmbean.xml">
    <depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>
    <depends>jboss.messaging:service=PostOffice</depends>
    <attribute name="Clustered">true</attribute>
    <attribute name="SecurityConfig">
            <security>
                    <role name="ecm-role" write="true" />
                    <role name="prm-role" read="true" create="true" />
            </security>
    </attribute>

내 클라이언트 (J2SE!)는 다음을 사용 하여이 JMS 서버에 연결하고 있습니다.

            // Step 1. Create an initial context to perform the JNDI lookup.
        initialContext = new InitialContext(p);
        // Step 3. Perform a lookup on the Connection Factory
        ConnectionFactory cf = (ConnectionFactory)initialContext.lookup("/ClusteredConnectionFactory");
        // Step 2. Perfom a lookup on the queue
        Destination target = (Destination)initialContext.lookup("/topic/ECM-PRM-Topic");

다음과 같은 일련의 이벤트가 발생하는 경우 :

  1. Node1이 상승하고 Node2가 다운되었습니다.
  2. 클라이언트는 JMS에 연결하고 "ECM-PRM-Topic"주제에 대해 내구성있는 가입자를 만듭니다.
  3. 클라이언트는 내구성있는 구독을 떠나는 연결을 끊습니다.
  4. 다른 클라이언트는 "ECM-PRM-Topic"이라는 주제에 대한 메시지를 게시합니다.
  5. Node1이 내려갑니다.
  6. Node2가 올라갑니다.
  7. 다른 클라이언트는 "ECM-PRM-Topic"이라는 주제에 대한 메시지를 다시 게시합니다.
  8. 클라이언트는 내구성있는 구독에 다시 연결합니다.
  9. 클라이언트 연결이 끊어집니다
  10. 노드 1이 올라갑니다.
  11. 클라이언트는 내구성있는 구독에 다시 연결합니다.

4 단계에 게시 된 메시지는 데이터베이스에 저장되며 클라이언트가 다시 연결되기를 기다리고 있습니다 (MySQL에서 볼 수 있음). (괜찮아)

6 단계에서 시작된 노드는 해당 주제에 대한 내구성있는 구독을 모릅니다. (왜??)

7 단계에 게시 된 메시지는 즉시 사라집니다. (알려진 내구성이 없거나 클라이언트가 연결되어 있지 않기 때문에)

8 단계에서 클라이언트가 연결되면 새로운 내구성이 생기고 메시지가 전달되지 않습니다 (그러나 MySQL에는 여전히 메시지가 있습니다).

10 단계에서 클라이언트는 7 단계의 메시지를 제외한 내구성에서 모든 메시지를 수신합니다.

메시지를 잃을 수 없다는 100% 확신을 갖고 싶습니다. 모든 메시지는 클라이언트가 소비 할 때까지 내구성과 MySQL 데이터베이스에 저장되어야합니다.

어떤 제안이란 무엇입니까?

XML 파일의 JBOSS에서 내구성있는 구독을 구성하는 방법이 있습니까 (클라이언트가 내구버이 서브 서브를 생성하기 전에)?

내가 사용하는 전체 클라이언트 코드는입니다 여기

도움이 되었습니까?

해결책

우리는 Jboss가 그러한 상황을 올바르게 처리하는 것이 불가능하다는 것을 알았습니다.

"내구성 구독"제작의 사실은 모든 노드에 방송됩니다. 노드 중 하나가 다운되면 다른 노드에서 생성 된 내구성있는 구독을 알지 못합니다. 이로 인해 위에서 설명한 상황에서 데이터 손실이 발생합니다.

http://community.jboss.org/message/517448#517448

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top