需要在 Java 中存储会话/事务数据
Need to store data for session/ transaction in Java
我公开了一些 Web 服务 (Weblogic Jdk 1.6),在这些方法的 XML 请求中有一个 MarketType 元素。
我需要在一些工厂 POJO 中访问这个 Xml 元素值,所以我的工厂他们自己知道对于这个 "session/transaction" 市场类型是 ABC,所以当代码需要一个来自工厂,工厂 returns MarketType 特定对象..
现在,所有代码和所有层的 MarketType 值都需要 'dragged',因为在代码中调用不同位置的工厂需要该值。
那么 how/where 我要存储这个值吗?以及如何以安全的方式访问它?
这里是一些今天的代码:
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();
}
}
}
}
一种选择是将 MarketType 元素存储在 ThreadLocal 中,以便可以从不同位置向下访问它。始终在线程完成其任务之前对 ThreadLocal 实例调用 remove()。这一点很重要,因为在 servlet 容器中,线程会被重用,如果不清除 ThreadLocal 可能会导致内存泄漏。调用 set 和 remove 的适当位置可以是过滤器。
我公开了一些 Web 服务 (Weblogic Jdk 1.6),在这些方法的 XML 请求中有一个 MarketType 元素。
我需要在一些工厂 POJO 中访问这个 Xml 元素值,所以我的工厂他们自己知道对于这个 "session/transaction" 市场类型是 ABC,所以当代码需要一个来自工厂,工厂 returns MarketType 特定对象..
现在,所有代码和所有层的 MarketType 值都需要 'dragged',因为在代码中调用不同位置的工厂需要该值。
那么 how/where 我要存储这个值吗?以及如何以安全的方式访问它?
这里是一些今天的代码:
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();
}
}
}
}
一种选择是将 MarketType 元素存储在 ThreadLocal 中,以便可以从不同位置向下访问它。始终在线程完成其任务之前对 ThreadLocal 实例调用 remove()。这一点很重要,因为在 servlet 容器中,线程会被重用,如果不清除 ThreadLocal 可能会导致内存泄漏。调用 set 和 remove 的适当位置可以是过滤器。