OSGi的新R4.2规范描述了Blueprint服务,用于依赖注入和服务连接.
Blueprint是否取代声明性服务(它仍然是规范的一部分),或者它们是否打算一起工作?
蓝图是否已经可用于流行的实现(Felix和Equinox)?
在blueprint.xml,我用这种方式声明一个可选的依赖:
<reference id="RepositoryListener"
interface="ru.focusmedia.odp.server.datastore.api.RepositoryListener"
availability="optional" />
<bean id="Repository"
class="ru.focusmedia.odp.server.datastore.jpa.repository.RepositoryImpl">
<jpa:context property="entityManager" unitname="ODP_Server" />
<tx:transaction method="*" value="Required" />
<property name="repositoryListener" ref="RepositoryListener" />
</bean>
Run Code Online (Sandbox Code Playgroud)
在RepositoryImpl,我有
public void setRepositoryListener(RepositoryListener repositoryListener) {
logger.info("Repository listener set");
this.repositoryListener = repositoryListener;
}
Run Code Online (Sandbox Code Playgroud)
即使没有RepositoryListener可用的服务,Blueprint也会调用此方法,如预期的那样.问题是,我怎么能后检查是否存在是一个服务?
if (repositoryListener != null) {
repositoryListener.notifyDelete(node);
} else {
logger.warn("No repository listener set!");
}
Run Code Online (Sandbox Code Playgroud)
不起作用,因为repositoryListener不是null,但是蓝图代理.
关于Spring配置和OSGi Blueprint(例如Gemini Blueprint)的组合是否有任何良好/最佳实践?您使用哪些XML文件?你把它们放在OSGi包中的哪个位置(META-INF/spring,OSGi-INF)?以下哪种做法可以让您将捆绑包与蓝图的非Gemini实施结合使用?
背景:我们正在从Spring/Spring DM切换到Spring/Blueprint.我知道定义<bean>元素的蓝图.但是,我们偶尔会遇到蓝图规范的有限bean定义功能无法满足我们所有需求的情况.因此,在我们的捆绑包中使用Spring配置和通过OSGi服务连接捆绑包的Blueprint似乎是一个不错的选择.
我正在寻找一个安全框架,它允许OSGi服务以及CXF Web服务的基于角色的安全性.前段时间我已经使用了弹簧安全性,但是现在我们已经切换到蓝图,据我所知,它不再是一种选择.要配置访问规则,我想主要使用标准的@RolesAllowed注释.那么我最好的出发点是什么?我也想过将自己作为蓝图扩展来实现,但我更喜欢现有的解决方案.
我是阿帕奇骆驼的新手。我正在尝试将交换从 java 方法发送到路由,但它给出了“由 org.apache.camel.component.direct.DirectConsumerNotAvailableException:端点上没有可用消费者”错误。我想了解这个错误到底是什么以及我们什么时候收到这个错误?
@EndpointInject(uri = "direct:reportRoute")
private ProducerTemplate templatereportRoute;
public void saveDataFromExchange(Map<String, Object> DataMap){
List<Map<String, Object>> paramList = new ArrayList<Map<String, Object>>();
List<Map<String, Object>> rows = templatereportRoute.requestBody("direct:reportReport", DataMap, List.class);
Run Code Online (Sandbox Code Playgroud)
<from uri="direct:reportRoute"/>
<log message=" - ${body}" loggingLevel="INFO"/>
<setProperty propertyName="DataMap">
<simple>${body}</simple>
</setProperty>
Run Code Online (Sandbox Code Playgroud) 我有一个要求,我需要每天重新加载我的osgi捆绑4次.重新加载bundle意味着重新创建静态实例Bean,重新加载camel路由,重新创建和注入线程池,数据库连接池..etc(其他spring xml东西).我尝试通过ssh刷新我的包,但我需要捆绑ID,以便可以改变加班.所以,我写了一个Manager Bundle,它通过符号名称获取捆绑包,并每天刷新它们4次
osgi impl : felix
container : apache-servicemix-4.4.1-fuse-03-06
Service Dependency spec : Blueprint
Run Code Online (Sandbox Code Playgroud)
有3个包和一个帮助包.帮助包包含所有使用的公共类和服务接口.这三个捆绑包之间没有代码共享(它们都没有导出任何包).所有这些捆绑包都通过camel vm端点和服务进行交互.我只刷新其他3个捆绑包,帮助捆绑包不提供任何服务.
现在,问题是当我对这3个捆绑包进行更新时,它们启动并正常工作,但我看到每次执行此操作时jconsole上增加了800-900个类.强制gc似乎也没有清理这些对象.那么,这些旧的有线物体会是什么呢?服务依赖项应该自动更新,并且bundle之间没有代码依赖关系.我检查了更新之前和之前的类数量的差异.
我可以看到一些类的数量增加了一倍,如org.apache.activemq.camel.component.VmComponent, org.apache.commons.dbcp.BasicDataSource ..etc和我在我的camel路由中定义的一些自定义bean.我依赖于camel-core,blueprint,quartz等容器.在camel-context中使用bean,VM端点等等,以及在更新时在blueprint-config xml中定义的组件.我知道一旦更新捆绑包,建议调用FrameworkWiring.refreshBundles().但是,我没有捆绑之间的代码共享,我推测任何其他依赖容器应该处理我认为现在是错误的.我不确定servicemix中当前的felix框架实现是否支持FrameworkWiring.refreshBundles()(ref),我无法让它工作.我该如何解决这个问题?
谢谢你好
我正在尝试将OSGI蓝图XML文件导入到另一个OSGi蓝图XML文件中.
例如:blueprint1.xml:
<?xml version="1.0" encoding="UTF-8"?>
<blueprint ....>
<bean id="myBean1" class="com.company.Class1"/>
<bean id="myBean2" class="com.company.Class2"/>
</blueprint>
</xml>
Run Code Online (Sandbox Code Playgroud)
blueprint2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<blueprint ....>
<!-- DOES NOT WORK -->
<import resource="blueprint1.xml" />
</blueprint>
Run Code Online (Sandbox Code Playgroud)
<import>春天的作品,但不是蓝图.
有没有人知道在OSGi蓝图XML文件中这样做的方法?
我编写了一个带有Field LoginId和Password的权限类.
Iam使用AES_ENCRYPT加密passwrd并在db中加载它.
我想只检索解密的密码.所以,我在OPen JPA 2.0中使用NAEDQueryis使用AES_DECRYPT.
我写的查询是:
Query q = em.createNativeQuery("select AES_DECRYPT(l.password,?2) from loginDetails l where l.loginID = ?1");
q.setParameter(1, loginId);
q.setParameter(2, getKey());
String s = q.getSingleResult();
Run Code Online (Sandbox Code Playgroud)
但我得到以下例外:
java.lang.ClassCastException: [B cannot be cast to java.lang.String
at com.rcs.chef.validation.UserValidation.decryptedPasswordForID(UserValidation.java:99)
at com.rcs.chef.validation.UserValidation.validateUser(UserValidation.java:81)
at com.rcs.chef.validation.UserValidation.activate(UserValidation.java:72)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.aries.blueprint.utils.ReflectionUtils.invoke(ReflectionUtils.java:226)
at org.apache.aries.blueprint.container.BeanRecipe.invoke(BeanRecipe.java:824)
at org.apache.aries.blueprint.container.BeanRecipe.runBeanProcInit(BeanRecipe.java:636)
at org.apache.aries.blueprint.container.BeanRecipe.internalCreate(BeanRecipe.java:724)
at org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:64)
at org.apache.aries.blueprint.container.BlueprintRepository.createInstances(BlueprintRepository.java:219)
at org.apache.aries.blueprint.container.BlueprintRepository.createAll(BlueprintRepository.java:147)
at org.apache.aries.blueprint.container.BlueprintContainerImpl.instantiateEagerComponents(BlueprintContainerImpl.java:640)
at org.apache.aries.blueprint.container.BlueprintContainerImpl.doRun(BlueprintContainerImpl.java:331)
at org.apache.aries.blueprint.container.BlueprintContainerImpl.run(BlueprintContainerImpl.java:227)
Run Code Online (Sandbox Code Playgroud)
我甚至试过这个:
Query q = em.createNativeQuery("select AES_DECRYPT(l.password,?2) from loginDetails l where …Run Code Online (Sandbox Code Playgroud) 我正在使用侦听"控制路径"的自定义处理器动态创建路由.它根据发送到控制路由的消息内容创建路由.它用于由另一个系统动态创建FTP /文件端点.
我在ServiceMix和Hawtio中使用Camel作为蓝图包来控制路由的状态(例如暂停它们).
它工作正常,但(逻辑上)如果重新启动camel上下文,则无法识别这些路由,因为没有持久路由配置.
有关如何坚持路线的最佳做法吗?
我正在考虑通过读取文件端点的目录结构或使用数据库来保留路由及其状态来重新创建路由.
我正在使用 Windows 批处理文件调用 Pentaho 数据集成作业,间歇性地,该作业无限期挂起。
Pentaho 日志中的错误信息如下:
06:43:37,951 ERROR [BlueprintContainerImpl] Unable to start blueprint container for bundle pdi-dataservice-server-plugin due to unresolved dependencies [(objectClass=org.pentaho.metaverse.api.ILineageClient)]
java.util.concurrent.TimeoutException
at org.apache.aries.blueprint.container.BlueprintContainerImpl$1.run(BlueprintContainerImpl.java:336)
at org.apache.aries.blueprint.utils.threading.impl.DiscardableRunnable.run(DiscardableRunnable.java:48)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(Unknown Source)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
我能够在类似的行中找到一些问题,这表明这是一个缓存问题。请帮忙 !
blueprint-osgi ×10
osgi ×6
java ×4
apache-camel ×3
jpa ×1
jpa-2.0 ×1
kettle ×1
openjpa ×1
osgi-ds ×1
pentaho ×1
security ×1
spring ×1
spring-camel ×1
spring-dm ×1