without the error trace, hard to say why it crashes ...
But your rules can be simplified/clarified :
- "and" to connect conditions is not needed
- in your first 'not' condition, which you add to test that no other event
takes place between the two objects matched in previous patterns, you should test the two
response types, as you don't want *any* response ...
- again in your first 'not' condition, the after/before should not be in a
interval. Why not using after/before only ? For timeout ? Should be a third rule to me ...
and should add a rule to handle response coming after the timeout too.
- I cant see the utility of you second 'not' pattern (may be because of my
previous remarks)
Another question : why don't you retract the response too ? Is it because you want to
keep them ?
To me it is better to retract it, especially if it takes place between another initial
EventRequest and its response. at least mark the response as treated and ignore the
treated responses in your conditions
So, your rules will become 2 groups of rules : first group to handle the response that
correspond to a request, second group to handle the timeout cases :
rule event_success_case
when
$req : EventRecord( type=EventRequest, $user : user )
$resp : EventRecord( type=EventResponseSuccess, user=$user, this after $req )
not (EventRecord( type=EventResponseSuccess || EventResponseFailure, user=$user,
this != $resp, this after $req , this before $resp)))
# 'this != $resp' is not mandatory as you test after/before (which are
strict), but it does not harm ...
then
System.out.println("Success case for user " + $req.getUser());
retract($req);
retract($resp);
end
rule event_failure_case : same but testing the other status
rule event_timeout_case
when
$req : EventRecord( type=EventRequest, $user : user )
not (EventRecord( type=EventResponseSuccess || EventResponseFailure, user=$user,
this after[0,10s] $req))) // assuming 10s for timeout
then
System.out.println("Timeout case for user " + $req.getUser());
retract($req);
end
rule event_response_after_timeout_case
when
$resp: EventRecord( type=EventResponseSuccess || EventResponseFailure, $user : user )
not (EventRecord( type=EventRequest, user=$user,
this before $resp)))
then
System.out.println("Response coming after timeout case for user " +
$req.getUser());
retract($resp);
end