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 <[email protected]> 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 <[email protected]
> <mailto:[email protected]>> 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 <[email protected]
>> <mailto:[email protected]>> 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 <[email protected] <mailto:[email protected]>> 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 <[email protected]
>>>> <mailto:[email protected]>> wrote:
>>>>
>>>> Hi Mike,
>>>>
>>>> Let me take a look.
>>>>
>>>> Thanks for the report.
>>>>
>>>> Regards
>>>> JB
>>>>
>>>>> Le 14 mars 2020 à 09:03, Mike Hummel <[email protected] <mailto:[email protected]>>
>>>>> 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 <[email protected]
>>>>>> <mailto:[email protected]>> 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 <[email protected]
>>>>>>> <mailto:[email protected]>> 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 <[email protected]
>>>>>>> <mailto:[email protected]>> 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
>