Hi Mike, Yes, IMHO there’s no problem on Karaf (sorry for the delay in my answer, the situation is "complicated" here ;) ): it just does the interrupt correctly.
It mainly depends how you deal with interrupt in your piece of code. I’m happy it works now. Regards JB > Le 15 mars 2020 à 00:22, Mike Hummel <m...@mhus.de> a écrit : > > Hello Guillaume, > > thank you for the hint. I already tried Thread.interrupted() but found my > problem in flag clearing if another wait() is called. > > To be sure to interrupt a loop I have to check Thread.interrupted() before > each Thread.sleep() in the loop. Like this > > public static void sleepInLoop(long _millisec) throws > InterruptedException { > if (Thread.interrupted()) > throw new InterruptedException(); > Thread.sleep(_millisec); > } > > And this will solfe the problem! > > Thx, > > Mike > > > >> On 14. Mar 2020, at 21:51, Guillaume Nodet <gno...@apache.org >> <mailto:gno...@apache.org>> wrote: >> >> The Ctrl+C default behavior in Karaf is to to call Thread.interrupt(). >> The effect depends on what the thread is doing, you'll find more information >> at [1]. >> If you want the command to be interrupted, the code needs to support it >> correctly. >> >> [1] >> https://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html >> <https://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html> >> >> Cheers, >> Guillaume Nodet >> >> >> Le sam. 14 mars 2020 à 20:45, Mike Hummel <m...@mhus.de >> <mailto:m...@mhus.de>> a écrit : >> The problem is if I not listen to ctrl-c in the moment of the interrupt >> >> while(true) { >> 1) do something >> 2) Thread.sleep() >> } >> >> And the 'Interrupt' is while (1) and not in (2) then the cmd will not be >> interrupted. - I tested it. >> >> (The interrupt will be thrown in Thread.sleep() and (I think) in >> Object.wait(), but not in 'normal' executon or if try {} (catch Throwable) >> is used) >> >> It will not break the command loop but will move the command in background >> (correct: status == Done) and the cmd will not stop working. >> >> something like this would be nice >> >> while(true) { >> 1) something >> 2) Thread.sleep() >> 3) if (is canceled) break; >> } >> >> But (in 3) for the command it's not possible to check the status of >> execution. It's in org.apache.felix.gogo.runtime.CommandSessionImpl >> >> So using crtl-c to cancel the command execution is like roulette. >> >> >> >>> On 14. Mar 2020, at 20:28, Jean-Baptiste Onofre <j...@nanthrax.net >>> <mailto:j...@nanthrax.net>> wrote: >>> >>> CTRL-C just works fine in Karaf commands (including the one creating thread >>> like log:tail). >>> >>> So, your use case is about intercepting CTRL-C yourself, right ? What’s the >>> use case you want to achieve ? >>> >>> Regards >>> JB >>> >>>> Le 14 mars 2020 à 18:26, Mike Hummel <m...@mhus.de <mailto:m...@mhus.de>> >>>> a écrit : >>>> >>>> Looks like it's not possible to block the ctrl-c event. It's implemented >>>> in felix gogo shell ans since every cmd (in a pipe) is executed in a >>>> separate thread it's not clear witch one should do the interruption control >>>> >>>> Maybe the feature "IGNORE_INTERRUPS" should not be offered. >>>> >>>> But felix should inform the commands if the execution is canceled. For >>>> example by checking for the Closeable interface and calling the close() >>>> method. >>>> >>>> >>>>> On 14. Mar 2020, at 11:09, Jean-Baptiste Onofre <j...@nanthrax.net >>>>> <mailto:j...@nanthrax.net>> wrote: >>>>> >>>>> Hi Mike, >>>>> >>>>> Let me take a look. >>>>> >>>>> Thanks for the report. >>>>> >>>>> Regards >>>>> JB >>>>> >>>>>> Le 14 mars 2020 à 09:03, Mike Hummel <m...@mhus.de >>>>>> <mailto:m...@mhus.de>> a écrit : >>>>>> >>>>>> Hello, >>>>>> >>>>>> I did a little bit research for IGNORE_INTERRUPTS in the karaf sources. >>>>>> I found in master and karaf-4.2.x the same results. >>>>>> >>>>>> The const is defined in 'Sessio'n and 'SessionProperties', but only used >>>>>> from 'Session'. >>>>>> >>>>>> It is only used to enable the behaviour but never used to implement some >>>>>> kind of behaviour. >>>>>> >>>>>> Is there someone how can can prove this? And what is the background for >>>>>> two definitions of the same const? If I have the background I could look >>>>>> for a fix. >>>>>> >>>>>> Just now I created KARAF-6645 to track the problem. >>>>>> >>>>>> Best Regards, >>>>>> >>>>>> Mike >>>>>> >>>>>> >>>>>> >>>>>> >>>>>>> On 5. Mar 2020, at 09:53, Mike Hummel <m...@mhus.de >>>>>>> <mailto:m...@mhus.de>> wrote: >>>>>>> >>>>>>> It's not easy to say ... In 4.2.3 it's broken and in 4.1.x it was ok. >>>>>>> >>>>>>> I testet the flag IGNORE_INTERRUPTS in 4.2.7 and it was not working as >>>>>>> I imagine. I'm even not sure if the flag is exact what I want to do. >>>>>>> >>>>>>> >>>>>>>> On 4. Mar 2020, at 09:18, Guillaume Nodet <gno...@apache.org >>>>>>>> <mailto:gno...@apache.org>> wrote: >>>>>>>> >>>>>>>> Could you be more specific about "older releases" ? Do you know in >>>>>>>> which release it broke ? >>>>>>>> >>>>>>>> Le mer. 4 mars 2020 à 09:14, Mike Hummel <m...@mhus.de >>>>>>>> <mailto:m...@mhus.de>> a écrit : >>>>>>>> Hello, >>>>>>>> >>>>>>>> I try to break my karaf commands with Ctrl-C (e.g. by using >>>>>>>> Thread.sleep()). In older releases this was no problem, but since the >>>>>>>> shell starts every command in a separate thread the Cltr-C is also >>>>>>>> caught by gogo and it will unlock the command from the console. >>>>>>>> >>>>>>>> I also tried this >>>>>>>> >>>>>>>> session.put(Session.IGNORE_INTERRUPTS, Boolean.TRUE); >>>>>>>> >>>>>>>> but it gets not the effect. >>>>>>>> >>>>>>>> Is there a way to recognise if the current command is separated from >>>>>>>> the current gogo command line? >>>>>>>> >>>>>>>> A sample snipped: >>>>>>>> >>>>>>>> Object oldIgnoreInterrupts = >>>>>>>> session.get(Session.IGNORE_INTERRUPTS); >>>>>>>> try { >>>>>>>> session.put(Session.IGNORE_INTERRUPTS, Boolean.TRUE); >>>>>>>> return doExecute(this, cmd, parameters); >>>>>>>> } finally { >>>>>>>> session.put(Session.IGNORE_INTERRUPTS, >>>>>>>> oldIgnoreInterrupts); >>>>>>>> } >>>>>>>> >>>>>>>> public Object doExecute(CmdShitYo base, String cmd, String[] >>>>>>>> parameters) throws Exception { >>>>>>>> if (cmd.equals("ctrl-c")) { >>>>>>>> try { >>>>>>>> while (true) { >>>>>>>> System.out.println("Wait for Ctrl-C - off"); >>>>>>>> MThread.sleep(3000); >>>>>>>> } >>>>>>>> } catch (InterruptedException e) { >>>>>>>> System.out.println("Interrupted !!!!"); >>>>>>>> } >>>>>>>> } >>>>>>>> } >>>>>>>> >>>>>>>> MThread: >>>>>>>> public static void sleep(long _millisec) { >>>>>>>> try { >>>>>>>> Thread.sleep(_millisec); >>>>>>>> } catch (InterruptedException e) { >>>>>>>> log.i(e); >>>>>>>> } >>>>>>>> } >>>>>>>> >>>>>>>> This will output >>>>>>>> >>>>>>>> Wait for Ctrl-C - off >>>>>>>> Wait for Ctrl-C - on >>>>>>>> Wait for Ctrl-C - off >>>>>>>> Wait for Ctrl-C - on >>>>>>>> ... >>>>>>>> >>>>>>>> If I interrupt, it will be separated from gogo shell and iterate for >>>>>>>> ever. - And I see the interrupted exception in the log. >>>>>>>> >>>>>>>> Thx, >>>>>>>> >>>>>>>> Mike >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> ------------------------ >>>>>>>> Guillaume Nodet >>>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>> >> >> >> >> -- >> ------------------------ >> Guillaume Nodet >> >