我想实现在服务器上上传的某些文件的可恢复的即时哈希生成.这些文件很大所以我正在使用MessageDigest类的update(byte [])方法(如下所述,例如:我如何生成MD5哈希?),因为新字节来自HttpServletRequest的InputStream.
一切都进展顺利,但是,当我想添加可恢复的上传支持时,它变得越来越有趣.如果上载过早终止,则不完整的文件将存储在磁盘上.但是,控制器(和底层服务)退出,因此MessageDigest对象丢失.在此之前,我可以将MessageDigest对象序列化到磁盘(或DB,无关紧要)的方式,当我再次反序列化对象时,它将记住它的临时状态,所以当我恢复上传(从确切它之前被终止的地方,所以没有字节冗余,也没有一些字节丢失)并继续update()反序列化的MessageDigest,最终我得到的结果(哈希)就像文件一次上传完整一样?
我试图从注入的EntityManager中解开Hibernate Session,因为我需要使用Hibernate的原生Criteria API.
当我尝试使用Criteria时,我得到以下异常:
Caused by: java.lang.IllegalStateException: No transactional EntityManager available
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:224)
at com.sun.proxy.$Proxy28.unwrap(Unknown Source)
at sk.uniba.ais2.fajr.dao.impl.PouzivatelDAOHibernate.findByLogin(PouzivatelDAOHibernate.java:22)
at sk.uniba.ais2.fajr.bo.PouzivatelService.findByLogin(PouzivatelService.java:20)
at sk.uniba.ais2.fajr.mvc.controller.FooController.getFoooFOO(FooController.java:38)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:690)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
... 62 more
Run Code Online (Sandbox Code Playgroud)
但是,当我使用EntityManager本身的Query api时,一切正常.
我的配置:
db.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
default-autowire="byName" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- Scans within …Run Code Online (Sandbox Code Playgroud) 我们目前正在开发一种新软件,我们认为OSGi模块化非常有用,因为软件本身可以很好地分解为模块化结构,以避免将来代码混乱,并能够轻松添加新功能并挂钩现有的.
我一直在玩两个(可能是最受欢迎的)OSGi平台,Eclipse Equinox(带有Gemini Blueprint)和Apache Felix(带Aries).基本上我现在正在做出决定,我们应该使用哪一个.
我们对Spring有很多经验,所以我们希望继续使用它,以及注释(例如@Autowired在SAME包中自动装配bean,@ServiceReference用于跨包的自动装配),一些特定的Spring插件(例如Data JPA),Hibernate as一个JPA提供者(到目前为止,我们只有Hibernate作为JPA实现的经验,它具有我们需要的所有功能,因此我们希望避免必须切换到其他东西),JMS消息传递(使用ActiveMQ客户端)和其他一些功能.稍后,我们还希望能够实现我们自己的安全管理器(以控制对某些捆绑包的访问,例如基于其数字签名,其中嵌入了权限的证书)
到目前为止,我已经能够制作两个测试包(一个使用来自另一个的服务)并将它们视为Equinox上的Spring Beans与Gemini BP.但是,我在注释方面遇到了一些问题(我并不喜欢在XML中使用布线bean,特别是在架构不那么复杂的情况下 - 大多数都是Singletons).
我也尝试过Aries(但是没有成功在那里启用Spring;可能还没有花足够的时间在那上面:)).
您为此类用例推荐了哪个OSGi平台?
我正在尝试为Vert.x开发一个概念验证 - 一个简单的实时浏览器游戏.
让我们想象一下类似于在线扑克的游戏 - 你有一个大厅,你可以加入许多现有的游戏.您还可以创建一个新游戏(因此该游说中的游戏数量是可变的).在此之前,您有一个玩家连接的异步http服务器(集群).特别是在特定游戏中,一切都是实时的,所以当玩家执行某些动作时,其他人立即看到它而不刷新或定期进行ajax轮询.
我在想如何将这个功能分解为Verticle.我的第一个想法是创建一个Verticle来处理http连接(并设置http服务器以将事件总线上的选定事件暴露给http客户端),另一个Verticle表示游戏大厅和第三个Verticle来表示实际游戏.大厅和游戏Verticle只会知道事件总线,他们根本不会处理http.
我唯一不清楚的是这些Verticle的范围,特别是游戏Verticle,因为会有更多(动态数量)游戏.默认情况下,您部署固定数量的特定Verticle实例(在简单的应用程序中,通常只有一个).在这种情况下,这一个Verticle必须在事件总线上监听游戏事件,决定该事件属于哪个游戏,反序列化游戏状态,更改它,序列化并再次存储.然后通知所有连接的玩家.
我想做的是,每个游戏实例范围都有一个Verticle.我的意思是,当在大厅中创建新游戏时,大厅Verticle将启动游戏Verticle的新实例,以某种方式将其传递给新游戏ID(因此它可以仅绑定到该游戏ID的事件)并且这个游戏Verticle将在其实例变量中存储该特定游戏在内存中的状态.当游戏结束时,Verticle会指示连接的浏览器返回大厅并自行销毁.
我的想象方式是正确的吗?如果是这样,实现这一目标的最佳方法是什么?特别是关于动态创建和销毁Verticle实例的部分,将一些信息(ID等)传递给新创建的Verticle?
一个额外的问题 - 如何限制玩家只能从他所属的游戏中收听(和发送)事件?这样他就不会影响其他游戏.与传统Java Servlet/EE应用程序中的会话/访问管理基本类似.
我一直在尝试使用Karaf上的OSGi声明服务(以及蓝图等)中的一些示例.我现在要解决的问题是如何在运行时获取对某些服务的引用(因此注释和/或XML在这里不是一个真正的选项)
我将解释我的用例:
我正在尝试设计(到目前为止只在我脑海中,这就是为什么我仍然只是试验OSGi :))一个系统来控制工业中的某些自动化过程.为了与设备通信,正在使用一组特殊的协议.为了使组件尽可能可重用,我设计了一个基于层的通信模型(例如用于网络的ISO/OSI模型,但更简单)
要将其转换为OSGi,我系统的每一层都将由一组包组成.一个用于该层的接口,然后是该层的每个实现的一个插件(想象这是OSI的传输层上的TCP与UDP).
要引用此类网络中的任何设备,将使用自定义地址格式(此类地址的两个示例可以是xpa://12.5/03FE或xpb://12.5/03FE).此类地址包含有关访问所请求设备所需的层及其值的所有信息.您可以猜到,此地址的每个部分代表我的网络模型的一层.
这些地址将存储在某个配置数据库中(因此,同样,简单的.cfg或.properties文件不是一个选项),以便可以在运行时远程更改它们.
我正在考虑创建一个Factory,它将解析这个地址,并根据其所有组件创建一个对象链(从OSGi获取适当的服务),实现所有层并相应地配置它们.
由于可以有更多单层实现(因此,实现单个接口的服务更多),这个工厂需要在运行时(当它获取设备地址作为字符串传递时)决定选择哪个特定实现(根据服务将声明的其他属性).
如何在OSGi中实现?对于这个,DS,蓝图或其他什么方法更好?