需要在Java中存储会话/事务的数据

时间:2015-09-24 14:40:09

标签: java session factory-pattern

我公开了一些WebServices(Weblogic Jdk 1.6),并且在这些方法的XML请求中有一个MarketType元素。

这个Xml元素值我需要在一些工厂POJO中访问,所以我的工厂他们自己知道对于这个“会话/事务”,MarketType是ABC,所以当Code需要来自Factory的Object时,Factory返回MarketType特定对象..
现在需要在所有代码和所有层中“拖动”MarketType值,因为工厂在代码中称为不同的位置需要该值。

那么我如何/在哪里存储这个值?以及如何以安全的方式访问它?

这里有一些代码:

interface DataFactory {
    PriceCalulator getPriceCalculator(MarketType type);
}

class DataFactoryImpl implements DataFactory {

    public PriceCalulator getPriceCalculator(MarketType type) {
        switch(type) {
            case : DK   {
                return new DKPriceCalculator();
            }
            case : NL {
                return new NLPriceCalculator();
            }    
        }  
    }
}

我希望能够做类似

的事情
public XmlCalcResult price(XmlRequest request) {
    ServicePrice impl = new ServicePrice();
    // Set MarkeType in "Global/Session" ..
    MarketType type = SessionScope.setMarketType(request.getMarketType()) 

    return impl.executePrice(ctx, session, request);
}

class ServicePrice {
    public XmlCalcResult executePrice(ctx, session, request) {
       PriceCalulator calc = DataFactoryImpl.getPriceCalculator();

       return new XmlCalcResult(calc.doCalculation()) ;
    }
}

interface DataFactory {
    PriceCalulator getPriceCalculator();
}

class DataFactoryImpl implements DataFactory {

    // Get from "Global/Session" ..
   MarketType type = SessionScope.getMarketType()  


    public PriceCalulator getPriceCalculator() {
        switch(type) {
            case : DK   {
                return new DKPriceCalculator();
            }
            case : NL {
                return new NLPriceCalculator();
            }    
        }  
    }
}

1 个答案:

答案 0 :(得分:1)

一个选项是将MarketType元素存储在ThreadLocal中,以便可以从该行的不同位置访问它。始终在线程完成其任务之前调用ThreadLocal实例上的remove()。这很重要,因为在servlet容器中,如果未清除ThreadLocal,则会重用线程并导致内存泄漏。调用set和remove的适当位置可以是过滤器。