0

应用程序设置(简化)

我觉得我对 Java 中的并发非常熟悉,但我对 Java EE 及其注解还是比较陌生。

我有一个名为DataHandlerannotated 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(可能只是用于同步块?),还是这些注释现在取代它?

4

1 回答 1

0

当您编写 JavaEE 代码时,您应该避免synchronized和任何其他手动并发实现。不要创建线程和锁。而不是使用JSR 236(EE 并发实用程序)

于 2015-09-25T21:40:57.207 回答