<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
  <title></title>
</head>
<body bgcolor="#ffffff" text="#000000">
Hi Dave,<br>
<br>
Apologies for the delayed response again. This one's a bit tricky and
I'm still thinking about it. The only thing I'm sure of ATM is I'd
prefer a dedicated @Group annotation instead of the addition of
group="" to existing annotations. I think it allows better reuse and
typesafety.<br>
<br>
Generally I think the new annotation(s) should go into API, and generic
scanning code goes into SPI, delegating to SPI-defined interfaces which
are then implemented by providers (currently only QueuJ for the new
stuff). See how SeamCronExtension uses CDI to "scan" for observer
methods and delegates the processing to the CronSchedInstaller
interface, which is implemented by the quartz provider. If you have to
introduce a new interface/method (similar to CronSchedInstaller) not
handled by the existing providers and it causes them to stop building
properly that's fine, I can deal with that when I merge your pull
request. Just as long as API, SPI and your providers compile and pass
tests.<br>
<br>
Will try to have a more thorough response by COP tomorrow (so about
24hours from now).<br>
<br>
Cheers,<br>
<br>
Pete.<br>
<br>
<br>
Dave Oxley wrote:
<blockquote cite="mid:201107051217.35197.dave@daveoxley.co.uk"
 type="cite">
  <meta name="qrichtext" content="1">
  <style type="text/css">
p, li { white-space: pre-wrap; }
  </style>
  <p style="margin: 0px; text-indent: 0px;">Hi Pete,</p>
  <p style="margin: 0px; text-indent: 0px;"><br>
  </p>
  <p style="margin: 0px; text-indent: 0px;">I have raised and am trying
to implement SEAMCRON-33 which adds concurrency control to Seam Cron.
The API's I was thinking of implement are:</p>
  <p style="margin: 0px; text-indent: 0px;"><br>
  </p>
  <p style="margin: 0px; text-indent: 0px;"><span
 style="font-family: 'courier 10 pitch';"> @AsyncRestriction(group =
"test_group")</span></p>
  <p style="margin: 0px; text-indent: 0px;"><span
 style="font-family: 'courier 10 pitch';"> public boolean
canRun(StatusIndexes indexes) {</span></p>
  <p style="margin: 0px; text-indent: 0px;"><span
 style="font-family: 'courier 10 pitch';"> HasLessThan max = new
HasLessThan(MAX_CONCURRENT);</span></p>
  <p style="margin: 0px; text-indent: 0px;"><span
 style="font-family: 'courier 10 pitch';"> max =
indexes.iterateRunningProcesses(max);</span></p>
  <p style="margin: 0px; text-indent: 0px;"><span
 style="font-family: 'courier 10 pitch';">
indexes.iterateWaitingToRunProcesses(max);</span></p>
  <p style="margin: 0px; text-indent: 0px;"><span
 style="font-family: 'courier 10 pitch';"> return max.hasLess();</span></p>
  <p style="margin: 0px; text-indent: 0px;"><span
 style="font-family: 'courier 10 pitch';"> }</span></p>
  <p style="margin: 0px; text-indent: 0px;">StatusIndexes will be an
interface providing various methods to interrogate the state of other
jobs in the queue and true or false should be returned to run or not
run another.</p>
  <p style="margin: 0px; text-indent: 0px;"><br>
  </p>
  <p style="margin: 0px; text-indent: 0px;">And reference the group
with a new attribute on the Asynchronous annotation:</p>
  <p style="margin: 0px; text-indent: 0px;"><span
 style="font-family: 'courier 10 pitch';"> @Asynchronous(group =
"test_group")</span></p>
  <p style="margin: 0px; text-indent: 0px;"><span
 style="font-family: 'courier 10 pitch';"> public void doWork() {</span></p>
  <p style="margin: 0px; text-indent: 0px;"><span
 style="font-family: 'courier 10 pitch';"> ....</span></p>
  <p style="margin: 0px; text-indent: 0px;"><span
 style="font-family: 'courier 10 pitch';"> }</span></p>
  <p style="margin: 0px; text-indent: 0px;">or a scheduled annotation:</p>
  <p style="margin: 0px; text-indent: 0px;"><span
 style="font-family: 'courier 10 pitch';"> public void
every40Seconds(@Observes @Every(group = "test_group", nth = 40, value =
Interval.SECOND) Trigger t) {</span></p>
  <p style="margin: 0px; text-indent: 0px;"><span
 style="font-family: 'courier 10 pitch';"> ....</span></p>
  <p style="margin: 0px; text-indent: 0px;"><span
 style="font-family: 'courier 10 pitch';"> }</span></p>
  <p style="margin: 0px; text-indent: 0px;">I have a few questions:</p>
  <p style="margin: 0px; text-indent: 0px;">1. Are you ok with the API
changes? Do you have a better/different idea for the API changes?</p>
  <p style="margin: 0px; text-indent: 0px;">2. @AsynRestriction is a
new feature for asynchronous or scheduling methods. Therefore it
doesn't really make sense to be a new spi. But then if I implement it
in the QueuJ scheduling and asynchronous as a new feature it will just
be an unimplemented feature for the Quartz provider. How would you want
this handled? Just document that it only works for the QueuJ provider?</p>
  <p style="margin: 0px; text-indent: 0px;">3. We will need to scan all
classes on the classpath for methods marked with the @AsynRestriction
annotation at startup. Is there a utility to do this or some example
code?</p>
  <p style="margin: 0px; text-indent: 0px;"><br>
  </p>
  <p style="margin: 0px; text-indent: 0px;">Cheers,<br>
Dave.</p>
</blockquote>
</body>
</html>