对于我应该如何在SpringIntegration中构建我的消息?感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解spring怎么创建,并且为您提供关于org.springframework
对于我应该如何在Spring Integration中构建我的消息?感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解spring怎么创建,并且为您提供关于org.springframework.boot.actuate.metrics.integration.SpringIntegrationMetricReader的实例源码、php – 我应该如何在ACL中构建我的资源树?、Spring AMQP 1.4.4/Spring Integration 3.0.7/4.0.7/4.1.3 发布、Spring Integration的宝贵知识。
本文目录一览:- 我应该如何在Spring Integration中构建我的消息?(spring怎么创建)
- org.springframework.boot.actuate.metrics.integration.SpringIntegrationMetricReader的实例源码
- php – 我应该如何在ACL中构建我的资源树?
- Spring AMQP 1.4.4/Spring Integration 3.0.7/4.0.7/4.1.3 发布
- Spring Integration
我应该如何在Spring Integration中构建我的消息?(spring怎么创建)
我有一个我编码的应用程序,我正在对其进行重构以更好地利用Spring Integration。该应用程序处理文件的内容。
问题(如我所见)是我当前的实现通过Files
了Messages
,而不是Spring IntegrationMessages
。
为了避免进一步滚动我自己的代码(以后必须维护),我想知道在Spring
Integration中是否存在用于构造Messages的推荐结构。我想知道的是,是否建议将某些建议channel
与类似的东西结合MessageBuilder
使用。
流程/代码(最终)
我还没有配置它的代码,但是我想用以下组件/过程结束:
- 接收文件,删除文件的页眉和页脚,每行并将其转换为
Message<String>
(似乎实际上是一个Splitter
),然后发送至… - 通道/端点向路由器发送消息
- 路由器在有效负载中检测格式字符串,并路由到类似于此处的订购路由器的适当通道…
- 然后,选定的通道将构建适当类型的消息,特别是键入的消息。例如,我有以下构建器来构建消息…
公共类ShippedBoxMessageBuilder实现CustomMessageBuilder {
@Override public Message buildMessage(String input){ShippedBox
transportationBox
=(ShippedBox)ShippedBoxFactory.manufactureShippedFile(input);
返回MessageBuilder.withPayload(shippedBox).build(); } …
- 消息按类型路由到适当的处理通道
我想要的解决方案似乎确实使它复杂化了。但是,我有目的地分离了两个任务:1)将文件分成多行,Messages<String>
以及2)转换Messages<String>
为Messages<someType>
。因此,我认为第二个任务需要一个额外的路由器/消息生成器。
答案1
小编典典实际上,MessageBuilder
Spring
Integration中有支持。
这种框架的一般目的是帮助后端开发人员将其域代码与消息传递基础结构分离。最后,要使用Spring Integration,您需要遵循POJO和方法调用原则。
您编写自己的服务,转换器和域模型。然后,您只需使用一些开箱即用的组件(例如<int-file:inbound-channel-adapter>
),然后从那里引用您的POJO,反之则不然。
我建议您阅读《Spring Integration in
Action》一书,以获取更多有关此问题的图片。
您能解释一下直接处理Spring Integration组件的原因吗?
更新
1)将文件分成多行消息
这<splitter>
是给你的。您应该编写一些POJO来返回List<String>
-文件中没有标题和页脚的行。如何从中读取行File
不是Spring
Integration的任务。特别是,如果“行”是逻辑的,则不是实际的文件行。
2)将消息转换为消息
再过一次:没有理由建立Message
对象。这足以payload
在某些转换器(再次为POJO)中构建新内容并将其框架包装到要发送的消息中。
Payload TypeRouter
不言而喻:它检查有效载荷类型,而不检查消息类型。当然,payload
也可以是Message,甚至任何标头也可以。
无论如何,您的Builder
快照最后都会精确显示纯Spring Integration
Message的创建。就像我说的:仅将一个有效负载转换为另一个有效负载并从某个POJO中返回它就足够了,您可以将其用作转换器参考。
org.springframework.boot.actuate.metrics.integration.SpringIntegrationMetricReader的实例源码
@Bean @ConditionalOnMissingBean(name = "springIntegrationPublicmetrics") public MetricReaderPublicmetrics springIntegrationPublicmetrics( IntegrationMBeanExporter exporter) { return new MetricReaderPublicmetrics( new SpringIntegrationMetricReader(exporter)); }
@Bean @ConditionalOnMissingBean(name = "springIntegrationPublicmetrics") public MetricReaderPublicmetrics springIntegrationPublicmetrics( IntegrationMBeanExporter exporter) { return new MetricReaderPublicmetrics( new SpringIntegrationMetricReader(exporter)); }
@Bean @ConditionalOnMissingBean public MetricReaderPublicmetrics springIntegrationPublicmetrics( IntegrationMBeanExporter exporter) { return new MetricReaderPublicmetrics( new SpringIntegrationMetricReader(exporter)); }
php – 我应该如何在ACL中构建我的资源树?
使用PHP和Zend_ACL,我想创建一个非常灵活的权限系统.我希望能够为特定类型的所有对象以及这些对象的实例分配权限.如果查询对象的特定实例并且资源树中不存在该对象,则可以使用“通用”对象的权限集.我的问题是,这需要嵌套,我无法找到一种方法来做到没有多重继承,Zend_ACL不支持.
一个例子就是这样.一个有学院,课程和活动的在线学习网站.每个活动都属于一门课程,每门课程都属于一个教师.我希望能够允许每个教师角色访问所有课程(和继承的事件),但特定教师希望他们的材料是私人的.因此,我使我的资源树的结构具有每个教师的资源节点,并且每个课程都属于教师节点的教师分支,而不是从通用课程节点分支,这为每个课程提供了默认权限.使用新结构,我如何应用我的通用课程权限?对于课程下面的事件也是如此,如果我希望每个事件只有在父课程可读时才可读,但我还想对每个事件应用一组默认权限,我如何组织树以使每个事件继承从它的父和它的通用节点没有多重继承?
对于不同系统的任何问题或意见或建议都是非常受欢迎的.
解决方法:
您的多重继承问题在您的脑海中 – 除非当然可以在多个院系中 – 等等.构建一个额外的“父资源”,可以从基础“课程”中更改ACL.
您不希望课程直接继承教师权限;你可能希望有人能够编辑该教师的课程(TA或其他东西) – 但教师本身不是吗?
faculties, courses, and events. Each
event belongs to a course, and each
course to a faculty
Parent -> middleman -> child
Courses -> Courses:Faculty2 -> Courses:Faculty2:Course1
Events -> Events:Course1 -> Events:Course1:Event3
等等
这将为教师提供课程组,但仍继承默认课程权限.当您添加每个资源时 – 只需将其作为其资源的父资源,该资源是整个资源的父资源.
如果您希望隐藏特定课程的所有活动 – 您只需在活动上设置权限:课程#
如果您希望能够为教师的所有事件设置权限,您可以在事件:Course1上面添加另一个“中间人”父母,该课程也按教师分组事件:事件:教师2:课程1:事件3
我找到了10个权限系统,你不需要(或想要混淆)多重继承.如果您的访问控制比简单树更复杂,则应重新评估访问控制.
Spring AMQP 1.4.4/Spring Integration 3.0.7/4.0.7/4.1.3 发布
Spring Integration/AMQP 团队同时发布了一些维护版本:
Spring AMQP 1.4.4
Spring Integration 3.0.7
Spring Integration 4.0.7
Spring Integration 4.1.3
以上所有版本都提供在 Release Repository 和 Maven 库。
AMQP 团队正在开发 Spring AMQP 1.5
版本,过几周会发布第一个里程碑版本,包括一些新特性:支持 RabbitMQ Management HTTP API,兼容 RabbitMQ 3.5
,还有其他改进。
Spring Integration 4.2
Milestone 1 计划一个月后发布,支持 Spring Framework 4.2
,,支持 STOMP 和 Zookeeper adapters,还有 JMX metrics 改进等等。
相关链接:
Spring AMQP Home Page | JIRA | Contributions | StackOverflow (spring-amqp
)
Spring Integration Home Page | JIRA | Contributions | StackOverflow (spring-integration
)
Spring AMQP 是基于 Spring 框架的 AMQP 消息解决方案,提供模板化的发送和接收消息的抽象层,提供基于消息驱动的 POJO。同时有 Java 和 .NET 的版本。
Spring Integration能在基于Spring的应用中进行简单的消息通信,并通过简单的适配器与外部系统集成。这些适配器提供了一个更高级别的抽象,超越 了Spring对远程调用、消息和调度的支持。其主要目标是在保持关注点分离的同时,为构建企业集成解决方案提供一个简单的模型,该模型对产出可维护、可 测试的代码来说是必不可少的。
文档地址
Spring Integration
- Spring Integration 主要解决的问题是不同系统之间交互的问题,通过异步消息驱动来达到系统交互时系统之间的松耦合。
- Spring Integration 主要由 Message,Channel 和 Message EndPoint 组成。
- Message:用来在不同部分之间传递的数据。由消息体(payload)和消息头(header)。消息体可以是任何数据类型(xml,json,Java 对象);消息头的元数据就是解释消息体的内容。
- Channel:消息发送者发送消息到通道,消息接收者从通道接收消息。
-
Message EndPoint:是真正处理 xiao 消息的组件,还可以控制通道的路由。可用的消息端点有:
(1)Channel Adapter:是一种连接外部或传输协议的端点,分为入站(inbound)和出站(outbound),通道适配器是单向的,入站通道适配器只支持接收消息,出站通道适配器只支持输出消息。
6. Spring Integration Java DSL :Spring Integration 提供 IntegrationFlow 来定义系统继承流程,
通过 IntegrationFlows 和 IntegrationFlowBuilder 来实现使用 Fluent API 来定义流程。
一个简单的流程定义如下:
@Bean public IntegrationFlow demoFlow() { return IntegrationFlows.from("input")//从Channel input获取消息 .<SyndEntry, String> transform(Integer::parseInt)//将消息转换成整数 .get();//获取集成流程并注册为Bean }
完整示例:
package com.integration; import com.rometools.rome.feed.synd.SyndEntry; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.core.io.Resource; import org.springframework.integration.dsl.IntegrationFlow; import org.springframework.integration.dsl.IntegrationFlows; import org.springframework.integration.dsl.channel.MessageChannels; import org.springframework.integration.dsl.core.Pollers; import org.springframework.integration.dsl.file.Files; import org.springframework.integration.dsl.mail.Mail; import org.springframework.integration.feed.inbound.FeedEntryMessageSource; import org.springframework.integration.file.support.FileExistsMode; import org.springframework.integration.scheduling.PollerMetadata; import java.io.File; import java.io.IOException; import static java.lang.System.getProperty; @SpringBootApplication public class IntegrationApplication { //自动获得资源 @Value("https://spring.io/blog.atom") Resource resource; public static void main(String[] args) { SpringApplication.run(IntegrationApplication.class, args); } //配置默认的轮询方式 @Bean(name = PollerMetadata.DEFAULT_POLLER) public PollerMetadata poller() { return Pollers.fixedRate(500).get(); } @Bean public FeedEntryMessageSource feedMessageSource() throws IOException { FeedEntryMessageSource messageSource = new FeedEntryMessageSource(resource.getURL(), "news"); return messageSource; } @Bean public IntegrationFlow myFlow() throws IOException { return IntegrationFlows.from(feedMessageSource()) //通过route来选择路由,消息体(payload)的类型为SyndEntry,判断条件类型为String //判断的值通过payload获得的分类(Categroy) //不同的分类值转向不同的消息通道 .<SyndEntry, String>route(payload -> payload.getCategories().get(0).getName(), mapping -> mapping.channelMapping("releases", "releasesChannel") .channelMapping("engineering", "engineeringChannel") .channelMapping("news", "newsChannel")) .get();//获得IntegrationFlow实体,配置为Spring的Bean } //releases流程 @Bean public IntegrationFlow releasesFlow() { return IntegrationFlows.from(MessageChannels.queue("releasesChannel", 10)) //从releasesChannel获取数据 .<SyndEntry, String>transform( //transform方法做数据转换,payload类型为SynEntry,将其转换为字符串类型, // 并自定义数据的格式 payload -> "《" + payload.getTitle() + "》" + payload.getLink() + getProperty("line.separator")) //handle方法处理file的出站适配器,Files类是由Spring Integration Java DSL提供的 // Fluent API 用来构造文件输出的适配器 .handle(Files.outboundAdapter(new File("g:/springblog")) .fileExistsMode(FileExistsMode.APPEND) .charset("UTF-8") .fileNameGenerator(message -> "releases.txt") .get()) .get(); } //engineering流程,与releases流程相同 @Bean public IntegrationFlow engineeringFlow() { return IntegrationFlows.from(MessageChannels.queue("engineeringChannel", 10)) .<SyndEntry, String> transform( e -> "《" + e.getTitle() + "》" + e.getLink() + getProperty("line.separator")) .handle(Files.outboundAdapter(new File("g:/springblog")) .fileExistsMode(FileExistsMode.APPEND) .charset("UTF-8") .fileNameGenerator(message -> "engineering.txt") .get()) .get(); } //news流程 @Bean public IntegrationFlow newsFlow() { return IntegrationFlows.from(MessageChannels.queue("newsChannel", 10)) .<SyndEntry, String> transform( payload -> "《" + payload.getTitle() + "》" + payload.getLink() + getProperty("line.separator")) //提供enrichHeaders方法增加消息头的信息 .enrichHeaders( Mail.headers() .subject("来自Spring的新闻") .to("guang2_tan@126.com") .from("guang2_tan@126.com")) //邮件发送的相关信息通过Spring Integration Java DSL提供的Mail的headers方法来构造 //使用handle方法自定义邮件发送的出站适配器,使用Spring Integration Java DSL提供的Mail.outboundAdapter来构造 //使用guang2_tan@126.com向自己发送邮件 .handle(Mail.outboundAdapter("smtp.126.com") .port(25) .protocol("smtp") .credentials("guang2_tan@126.com", "abc1234") .javaMailProperties(p -> p.put("mail.debug", "false")), e -> e.id("smtpOut")) .get(); } }
可能会出现:javax.mail.AuthenticationFailedException: 550
解决办法:可能邮箱没有开通 pop/stmp 协议
关于我应该如何在Spring Integration中构建我的消息?和spring怎么创建的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于org.springframework.boot.actuate.metrics.integration.SpringIntegrationMetricReader的实例源码、php – 我应该如何在ACL中构建我的资源树?、Spring AMQP 1.4.4/Spring Integration 3.0.7/4.0.7/4.1.3 发布、Spring Integration等相关知识的信息别忘了在本站进行查找喔。
本文标签: