应用程序设置(简化)
我觉得我对 Java 中的并发非常熟悉,但我对 Java EE 及其注解还是比较陌生。
我有一个名为DataHandler
annotated with的类@Singleton
,它为我的应用程序执行一些业务逻辑。这个类被注入到一个用@WebService
. 当调用 Web 服务的方法之一时,DataHandler
调用parseFiles()
解析一些文件的方法,并将数据存储在DataHandler
. 之后,它对内部的吸气剂进行了一些调用DataHandler
:
@WebService(portName = "portName",
serviceName = "MyService",
endpointInterface = "com.myco.MyPortType",
wsdlLocation = "WEB-INF/wsdl/MyWSDL.wsdl",
targetNamespace = "targetNamespace")
public class MyServiceImpl implements MyPortType {
@EJB
private DataHandler dataHandler;
@Override
public ResponseType doStuff(RequestType request) {
// code
// ....
dataHandler.parseFiles();
// ....
// more code
Map<String, CustomType> map = dataHandler.getCustomTypeMap();
Map<String, CustomType2> map2 = dataHandler.getCustomType2Map();
}
现在我还有一个消息驱动的 bean,它接收关于一个名为 UpdateTopic 的主题的一些数据,然后将其转换为另一种类型并将其存储在DataHandler
:
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),
@ActivationConfigProperty(propertyName = "destination", propertyValue = "UpdateTopic")
})
public class UpdateTopicMDB implements MessageListener {
@EJB
DataHandler dataHandler;
@Override
public void onMessage(Message message) {
try {
if (message instanceof ObjectMessage) {
ObjectMessage objMessage = (ObjectMessage) message;
Serializable data = objMessage.getObject();
if (data instanceof UpdateType) {
dataHandler.convertAndStore((UpdateType) data);
}
}
} catch(Exception e) {
// log Exception
}
}
我想同步parseFiles()
方法、convertAndStore()
方法和两个 getter,以便所有数据在访问时都是最新的。
我简单地做了所有四种方法synchronized
来实现这一点。我的理解是,如果文件正在被解析并且更新进入 MDB,那么该convertAndStore()
方法将被锁定直到parseFiles()
完成。同样,如果正在转换和存储更新,并且 Web 服务正在尝试访问两个地图之一,它会一直等到convertAndStore()
完成。如果我在其中任何一个方面错了,请纠正我。
我的问题
说了这么多,我最近才读到@ConcurrencyManagement
和@Lock
注释。而不是同步这四种方法。现在似乎我应该只注释parseFiles()
and convertAndStore()
,@Lock(LockType.WRITE)
因为它们正在修改 bean 的状态和两个 getter @Lock(LockType.READ)
。
我应该这样做并synchronized
完全避免使用关键字吗?是否有任何用途synchronized
(可能只是用于同步块?),还是这些注释现在取代它?