2013-08-13 5 views
1

JBoss ESB의 Drools에서 컨텐트 기반 라우팅을 사용하고 있습니다. 메시지의 내용을 기준으로 대상을 선택하는 몇 가지 규칙이 있습니다. 들어오는 메시지의 내용이 인식되지 않으면이 메시지는 오류 처리 서비스로 라우팅됩니다. 아래는 내 Drools 규칙입니다.Drools를 사용하는 JBoss ESB 컨텐트 기반 라우팅의 기본 대상

global java.util.List destinations; 

rule "A" 
when 
    Message (body.get("data") != null && body.get("data").class == A.class) 
then 
    destinations.add("a"); 
end 

rule "B" 
when 
    Message (body.get("data") != null && body.get("data").class == B.class) 
then 
    destinations.add("b"); 
end 

rule "Unknown" 
when 
    eval(destinations.isEmpty()) 
then 
    destinations.add("unknown"); 
end 

문제는 모든 메시지 즉 unknown 항상 destinations에 추가되고, 오류 처리 서비스로 연결된다는 점이다. 내 이해에서 규칙은 위에서 아래로 실행됩니다. 위의 규칙 중 하나가 실행되면 마지막 규칙이 실행되지 않아야합니다.

이 문제는 어떻게 해결해야합니까? 일부 Google 검색 결과에 salience을 사용해야한다고 나와 있는데, 이것이 올바른 해결책입니까?

+0

돌출 부분은 기본/"알 수 없음"규칙에 다른 규칙보다 낮은 우선 순위를 부여하는 가장 간단한 해결 방법입니다. 그것은 돌출 성이 drools이 제공하는 기능이라는 의미에서 "올바른"해결책이 될 것입니다. –

답변

1

나는 또한이 문제에 직면했을 때 멍청했다. 귀하의 예에서 eval()은 Drools 사실에 의존하지 않으므로 "알 수 없음"에 부정적인 영향을 미치는 문제가 아니라 우선 수행됩니다.

다음 해결책은 대상이 상호 배타적이라고 가정합니다. 그것은 당신이 당신의 메시지는하지만 결코 세 가지의 조합으로, a, b 또는 unknown로 라우팅 할 의미 다음 activation-group이 상호 배타적 인 관계를 선언

import org.jboss.soa.esb.message.Message; 
import org.jboss.soa.esb.message.Body; 

global java.util.List destinations; 

rule "A" 
activation-group "destinations" 
when 
    Message (body.get("data") != null && body.get("data").class == A.class) 
then 
     destinations.add("a"); 
end 

rule "B" 
activation-group "destinations" 
when 
    Message (body.get("data") != null && body.get("data").class == B.class) 
then 
     destinations.add("b"); 
end 

rule "Unknown" 
activation-group "destinations" 
salience -9000 
when 
    eval(destinations.isEmpty()) 
then 
     destinations.add("unknown"); 
end 

; 그러한 규칙 그룹은 순서 (중요성)와 사실에 따라 해고 될 것이고 그룹의 한 규칙이 해고되면 다른 규칙은 무시 될 것이다.

답변에서 얻은 것은 Drools - rule hierarchy and conditional execution입니다.

관련 문제