الربيع الاختبارات: الصفقة لن التراجع بعد طريقة الاختبار أعدمت

StackOverflow https://stackoverflow.com/questions/2063511

سؤال

وأنا أحاول خلق تجارب التكامل لتطبيق إرث المنتشرة على يبلوغيتش 8.1 باستخدام فئة فرعية من AbstractTransactionalJUnit4SpringContextTests.

ولي طريقة اختبار له شروح التالية:

@Test
@Rollback(true)
public void testDeployedEJBCall throws Exception {...}

وبلدي اختبار الطبقة أيضا إشارات الفاصوليا من نوع org.springframework.ejb.access.SimpleRemoteStatelessSessionProxyFactoryBean، التي وكيل لل EJBs نشرت في خدمة بلدي يبلوغيتش.

عند أدعو الأساليب على هذا الفول وكيل بطريقة sequencial في بلدي طريقة الاختبار، لفات المعاملة مرة أخرى بشكل صحيح في نهاية الاختبار.

ومنها مثلا. :

@Test
@Rollback(true)
public void testDeployedEJBCall throws Exception {
    Long result1 = myejb.method(100L);
    Long result2 = myejb.method(200L);
    ...
}

ومع ذلك، أود أن جعل 2 المكالمات موازية لنفس الأسلوب EJB. لذلك أنا قمت بها الطبقة الداخلية التي تنفذ للاستدعاء، من أجل الدعوة أساليبي في 2 المواضيع المختلفة والأمل لتشغيل هذه في نفس الوقت.
ومع ذلك، يبدو أن القيام بذلك لجعل الطرق المنظمة بتبني ليتم استدعاؤها خارج معاملتي، ويتم إرجاع أي شيء إلى الوراء.

وهنا هو ما يود الطبقة اختبار كامل عند تشغيل المكالمات الأسلوب في موازاة:

import org.springframework.test.annotation.*;

@RunWith(SpringJUnit4ClassRunner.class)
@Transactional
@ContextConfiguration(locations = {"classpath:path/to/tests-config.xml"})
@TransactionConfiguration(defaultRollback=true)
public final class IntegrationTests extends AbstractTransactionalJUnit4SpringContextTests {
    @Autowired
    protected JndiTemplate jndiTemplate;
    @Resource
    protected Proxy myEJB;

    public IntegrationTests() {
        super();
        this.logger = Logger.getLogger(IntegrationTests.class);
    }

    @Test
    @Rollback(true)
    public void testDeployedEJBCall() throws Exception {
        // Create a thread pool for parallel execution. 
        ExecutorService exec = Executors.newFixedThreadPool(2);

        // Prepare the tasks for parallel execution
        List<CallEJBTask> tasks = new ArrayList<CallEJBTask>();
        tasks.add(new CallEJBTask(100L, this.myEJB));
        tasks.add(new CallEJBTask(200L, this.myEJB));

        // Execute all pending tasks in the exec Threadpool
        List<Future<Long>> results = exec.invokeAll(tasks);

        // Get the results of each task
        Long result1 = results.get(0).get();
        Long result2 = results.get(1).get();

        ...
    }
}

private class CallEBJTask implements Callable<Long> {
    private final Long valueToTest;
    private final MyEJB myEJB;

    public CallEJBTask(Long valueToTest, Proxy myEJBProxy)
        this.valueToTest = valueToTest;
        this.myEJB = (MyEJB)myEJBProxy;
    }

    public Long call() throws Exception {
        return getResult();
    }

    public Long getResult() {
        Long result = null;

        try {
            result = this.myEJB.method(this.patient);

        } catch (Exception e) {
            ...
        }
        return result;   
    } 
}

هل هناك طريقة لجعل هذا التراجع ؟؟؟

وشكرا لمساعدتكم.

والتحيات،

وفيليب

هل كانت مفيدة؟

المحلول

وليس تلقائيا، لا. المشكلة هي أن المواضيع إضافية اثنين لا تشارك في هذه الصفقة، وبالتالي أفعالهم لا التراجع.

ما هو الغرض من اثنين من الإعدام موازية؟ هل سيكون من غير المرجح قادرة على اختبار لمشكلات التوافق مع هذا النهج، إذا كان هذا هو ما كنت تهدف ل.

تحرير: والمشكلة هي أن اختبار للمشكلات التوافق من الصعب جدا، لأن الاختبارات الخاصة بك، في أحسن الأحوال، احتمالي - النجاح أو الفشل يتوقف على القضايا توقيت الدقيقة التي قد السطح فقط على المدى المليار . انظر هذه المادة جانب الخادم للحصول على ملخص خير الأساسيات.

ويجب أن تكون القاعدة الأساسية لتجنب الترميز ناحية الترابط كلما كان ذلك ممكنا، كما أنه من الصعب الحصول على الحق ويصعب اختبار. إذا كنت تستطيع، تجنب المشتركة بين دولة المواضيع، وإذا كان هناك أي وسيلة من حوله، والاعتماد على هياكل البيانات المتزامنة ومنفذي غير متزامن من حزمة java.util.concurrent.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top