Транзакции EJB в локальных вызовах метода

Я мало знаю о деталях низкого уровня; но, учитывая, что в python 2.6 API предлагает возможность ждать потоков и завершать процессы, как запустить процесс в отдельном потоке?

import subprocess, threading

class Command(object):
    def __init__(self, cmd):
        self.cmd = cmd
        self.process = None

    def run(self, timeout):
        def target():
            print 'Thread started'
            self.process = subprocess.Popen(self.cmd, shell=True)
            self.process.communicate()
            print 'Thread finished'

        thread = threading.Thread(target=target)
        thread.start()

        thread.join(timeout)
        if thread.is_alive():
            print 'Terminating process'
            self.process.terminate()
            thread.join()
        print self.process.returncode

command = Command("echo 'Process started'; sleep 2; echo 'Process finished'")
command.run(timeout=3)
command.run(timeout=1)

Вывод этого фрагмента на моей машине:

Thread started
Process started
Process finished
Thread finished
0
Thread started
Process started
Terminating process
Thread finished
-15

, где можно видеть, что при первом выполнении процесс завершился правильно (код возврата 0), а во втором - завершение процесса (код возврата -15).

Я не тестировал в окнах; но, помимо обновления команды примера, я думаю, что она должна работать, поскольку я не нашел в документации ничего, что говорит о том, что thread.join или process.terminate не поддерживается.

20
задан 9 January 2009 в 09:02
поделиться

2 ответа

Ваш вызов к methodB() является обычным вызовом метода, не прерванного контейнером EJB; во времени выполнения контейнер EJB введет прокси и не экземпляр Вашего класса, это - способ, которым это прерывает вызовы, и установите среду прежде, чем назвать Ваш метод. Если Вы используете this, Вы называете метод непосредственно а не через прокси. Следовательно оба метода будут использовать ту же транзакцию, независимо к тому, что определяется в ejb-jar.xml для вызовов через интерфейсы EJB.

35
ответ дан 29 November 2019 в 22:53
поделиться

Они будут использовать ту же транзакцию.

, Если я помню хорошо, транзакция запускается контейнером, "прежде чем" метод будет вызываться и фиксироваться после него "конец".

, Так как "a" называет "b", "b" использовал бы ту же транзакцию.

:S

я предполагаю лучшую вещь, которую можно сделать, протестировать его для проверки его! :)

3
ответ дан 29 November 2019 в 22:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: