Spring 3 HornetQ 2.1集成教程

通過Spring框架使用JBoss的新超高性能消息傳遞系統。

HornetQ是一個開放源代碼項目,用于構建多協議,可嵌入,非常高性能的集群異步消息傳遞系統。 它是用Java編寫的,并且可以在具有Java 5或更高版本運行時的任何平臺上運行。 HornetQ一流的高性能日志以非持久消息傳遞通常看到的速度提供持久消息傳遞性能。 非持久消息傳遞性能也非常高。 HornetQ除了其他“性感”功能外,還提供服務器復制和自動客戶端故障轉移功能,以消除服務器故障時丟失或重復的消息,可以配置成群集使用,其中HornetQ服務器的地理位置分散的群集知道如何負載均衡消息并提供全面的信息。管理API,用于管理和監視所有HornetQ服務器。

在本教程中,我們將向您展示如何通過Spring框架利用HornetQ 。 為了使事情變得更有趣,我們將從上一篇關于Spring GWT Hibernate JPA Infinispan集成的文章的 結尾處繼續 。 我們將使用我們的GWTSpringInfinispan項目,并通過消息傳遞功能對其進行授權! 當然,您可以閱讀本文,將基于Spring的項目與HornetQ集成。

我們將使用HornetQ 2.1.0.Final版本,您可以從此處下載。 我們還將需要jboss-logging-spi庫。 將使用JBoss Logging SPI 2.1.1.GA版本,您可以在此處從JBoss Maven存儲庫下載該版本。

為了在運行時正確地集成Spring和HornetQ ,我們必須為Web應用程序提供所有必需的庫。 因此,復制下面在/ war / WEB-INF / lib下列出的文件(如果使用的是不同版本,請復制相關文件)

從HornetQ發行

  • /lib/hornetq-bootstrap.jar
  • /lib/hornetq-core.jar
  • /lib/hornetq-jms.jar
  • /lib/hornetq-logging.jar
  • /lib/jnpserver.jar
  • /lib/netty.jar

JBoss Logging SPI庫

  • jboss-logging-spi-2.1.1.GA.jar

最后,為了使HornetQ在運行時正常運行,Web應用程序的類路徑中必須有幾個配置文件。 如本教程的介紹部分所述,我們可以創建HornetQ服務器集群,以實現負載平衡和高可用性消息傳遞,也可以在非集群環境中使用HornetQ 。 兩種情況都需要不同的配置。 HornetQ發行版包含/ config目錄下的所有配置文件。 我們將使用jboss-as-5集群配置,以便能夠使用消息傳遞平臺的全部功能。 將以下文件從/ config / jboss-as-5 / clustered目錄復制到應用程序/ resources包中:

  • hornetq-configuration.xml –這是主要的HornetQ配置文件
  • hornetq-jms.xml –服務器端JMS服務配置文件

除非您要在JBoss應用服務器中進行部署,否則請編輯hornetq-configuration.xml文件,并將“ $ {jboss.server.data.dir}”替換為“ $ {data.dir:../ data}”。

將以下文件從/ config / stand-alone / clustered目錄復制到應用程序/ resources包中:

  • hornetq-users.xml – HornetQ安全管理器的用戶憑證文件

在繼續實際的集成和客戶端實現示例之前,讓我們確定一些有關HornetQ服務器體系結構和上述配置文件的有用信息。

HornetQ服務器不會講JMS ,實際上對JMS一無所知,它是一種協議不可知的消息傳遞服務器,旨在與多種不同的協議一起使用。 HornetQ客戶端(可能在不同的物理計算機上)與HornetQ服務器交互。 HornetQ當前提供兩種API來在客戶端進行消息傳遞:

  • 核心客戶端API。 這是一個簡單而直觀的Java API,可在沒有JMS某些復雜性的情況下提供完整的消息傳遞功能集
  • JMS客戶端API。 標準的JMS API在客戶端可用

JMS語義由客戶端上的瘦JMS外觀層實現。 當用戶在客戶端上使用JMS API時,所有JMS交互都將轉換為HornetQ核心客戶端API上的操作,然后再使用HornetQ有線格式通過有線傳輸。 服務器始終只處理核心API交互。

標準的獨立消息傳遞服務器配置包括核心消息傳遞服務器, JMS服務和JNDI服務。

JMS服務的作用是將任何服務器端hornetq-jms.xml配置文件中的任何JMS Queue,Topic和ConnectionFactory實例部署并綁定到JNDI 。 它還提供了用于創建和銷毀隊列,主題和ConnectionFactory實例的簡單管理API,可以通過JMX或連接對其進行訪問。 由于核心服務器與JMS無關,因此它是HornetQ核心服務器的一項獨立服務。 如果您不想通過服務器端XML配置部署任何JMS Queue,Topic或ConnectionFactory實例,并且不需要在服務器端使用JMS管理API,則可以禁用此服務。

還包括一個JNDI服務器,因為在使用JMS查找隊列,主題和ConnectionFactory實例時, JNDI是常見的要求。 如果您不需要JNDI,則也可以禁用此服務。 HornetQ允許您直接在客戶端上以編程方式創建JMS和核心對象,而不是從JNDI查找它們,因此JNDI服務器并不總是必需的。

HornetQ附帶了一個基本的安全管理器實現,該實現可獲取用戶憑證
從hornetq-users.xml文件中。 該文件包含用戶,密碼和角色信息。

我們將使用HornetQ JMS服務,并在與命名服務器相同的JVM中執行JMS客戶端代碼,因此我們必須創建一個“ jndi.properties”文件,并將其與上述其余HornetQ配置文件一起放在我們的application / resources包下。 “ jndi.properties”文件的內容應如下所示:

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory

在繼續之前,我們必須注意Eclipse項目的依賴關系。 以下jar應包含在項目的Java構建路徑中:

  • jms.jar

現在讓我們將Spring與HornetQ集成。 找到您的applicationContext.xml文件/ war / WEB-INF文件夾,然后添加以下bean:

<bean name="namingServerImpl" class="org.jnp.server.NamingBeanImpl" init-method="start" destroy-method="stop" /><bean name="namingServer" class="org.jnp.server.Main" init-method="start" destroy-method="stop"><property name="namingInfo" ref="namingServerImpl" /><property name="port" value="1099" /><property name="bindAddress" value="localhost" /><property name="rmiPort" value="1098" /><property name="rmiBindAddress" value="localhost" />
</bean><bean name="mbeanServer" class="java.lang.management.ManagementFactory" factory-method="getPlatformMBeanServer" /><bean name="fileConfiguration" class="org.hornetq.core.config.impl.FileConfiguration" init-method="start" destroy-method="stop" /><bean name="hornetQSecurityManagerImpl" class="org.hornetq.spi.core.security.HornetQSecurityManagerImpl" /><!-- The core server -->
<bean name="hornetQServerImpl" class="org.hornetq.core.server.impl.HornetQServerImpl"><constructor-arg ref="fileConfiguration" /><constructor-arg ref="mbeanServer" /><constructor-arg ref="hornetQSecurityManagerImpl" />
</bean><!-- The JMS server -->
<bean name="jmsServerManagerImpl" class="org.hornetq.jms.server.impl.JMSServerManagerImpl" init-method="start" destroy-method="stop" depends-on="namingServer"><constructor-arg ref="hornetQServerImpl" />
</bean>

如果您打算在獨立環境中配置Spring和HornetQ ,則上述配置就足夠了。 在我們的例子中,當我們在Apache – Tomcat上部署Web應用程序時,應進行一些小的修改。

Apache – Tomcat為所有已部署的Web應用程序提供JNDI服務,以配置環境屬性和資源。 此外,由于環境和資源管理是使用部署描述符文件(例如web.xml和context.xml)完成的,因此在運行時可用的命名上下文是只讀的。 另外,在啟動時, Apache – Tomcat使用系統屬性初始化其JNDI環境。 結果,使用JNDI InitialContext類(不提供構造函數環境參數)的“在VM中”客戶端執行命名操作,總是檢索Apache – Tomcat JNDI實現Context接口。

為了使HornetQ JNDI服務器與Apache-Tomcat命名服務和HornetQ JMS服務共存,以便將隊列,主題和ConnectionFactory實例綁定到JNDI ,我們必須執行以下操作:

  • 對我們的Web應用程序禁用Apache – Tomcat命名服務
  • 將HornetQ JNDI服務器配置為不使用現有的JNDI服務(如果可用),但始終創建??一個新的服務

要為我們的Web應用程序禁用Apache – Tomcat命名服務,我們必須執行以下操作:

  • 在我們項目的/ war文件夾下創建一個META-INF文件夾
  • 創建一個包含以下context指令的context.xml文件:
<Context override="true" useNaming="false" />

要配置HornetQ JNDI服務器不使用現有的JNDI服務(如果可用),我們必須在Spring bean的“ namingServerImpl”中添加以下屬性:

<property name="useGlobalService" value="false" />

為了通過Spring使用HornetQ消息服務,我們可以創建一個連接工廠,也可以從JNDI查找一個。 下面提供了連接工廠和“ JmsTemplate”示例:

<bean name="connectionFactory" class="org.hornetq.jms.client.HornetQConnectionFactory" ><constructor-arg><bean class="org.hornetq.api.core.TransportConfiguration"><constructor-arg value="org.hornetq.integration.transports.netty.NettyConnectorFactory" /><constructor-arg><map key-type="java.lang.String" value-type="java.lang.Object"><entry key="port" value="5445"></entry></map></constructor-arg></bean></constructor-arg>
</bean><bean name="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"><property name="connectionFactory" ref="connectionFactory"></property>
</bean>

連接工廠示例的JNDI查找如下所示:

<bean id="inVMConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean" depends-on="jmsServerManagerImpl"><property name="jndiName"><value>java:/ConnectionFactory</value></property>
</bean>

我們將使用JNDI查找方法來獲取連接工廠,因此將上述配置添加到applicationContext.xml文件中。

這就是我們要做的所有配置,讓我們繼續使用我們新集成的消息傳遞服務實施假設的業務案例。 我們的Web應用程序提供了添加,更新和檢索“員工”數據的功能。 假設我們希望在每次添加或更改“員工”數據時都收到通知。 為了簡單起見,該通知將是Apache – Tomcat控制臺上的日志。 我們將實現一個JMS生產者,以便在用戶每次對“雇員”數據進行更新時將消息發送到“通知”隊列。 另外,必須實現JMS使用者,以便處理“通知”隊列消息并登錄到控制臺。

要創建“通知”隊列并將其綁定到名稱為“ / queue / Notifications”的JNDI ,請將以下內容添加到hornetq-jms.xml文件中:

<queue name="Notifications"><entry name="/queue/Notifications"/>
</queue>

為了能夠通過Spring bean使用新創建的“ Notifications”隊列,請將以下JNDI查找指令添加到applicationContext.xml文件中:

<bean id="notificationsQueue" class="org.springframework.jndi.JndiObjectFactoryBean" depends-on="jmsServerManagerImpl"><property name="jndiName"><value>/queue/Notifications</value></property>
</bean>

由于JMS生產者和使用者都是服務器端組件,因此必須將它們放在我們應用程序的/ server子包下。 我們選擇在/ server / utils子包下創建它們,因為它們本質上是實用程序類。 下面提供了示例JMS生產者和消費者類:

package com.javacodegeeks.gwtspring.server.utils;import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service("notificationsProducer")
public class NotificationsProducer {@AutowiredQueue notificationsQueue;@AutowiredConnectionFactory inVMConnectionFactory;private Connection notificationsQueueConnection;private Session notificationsQueueSession;private MessageProducer notificationsQueueProducer;@PostConstructpublic void init() throws Exception {notificationsQueueConnection = inVMConnectionFactory.createConnection();notificationsQueueSession = notificationsQueueConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);notificationsQueueProducer = notificationsQueueSession.createProducer(notificationsQueue);notificationsQueueProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);}@PreDestroypublic void destroy() throws Exception {if(notificationsQueueConnection != null)notificationsQueueConnection.close();}public void sendNotification(final String message) throws Exception {TextMessage textMessage = notificationsQueueSession.createTextMessage(message);notificationsQueueProducer.send(textMessage);}}

還有消費者

package com.javacodegeeks.gwtspring.server.utils;import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service("notificationsConsumer")
public class NotificationsConsumer implements MessageListener {@AutowiredQueue notificationsQueue;@AutowiredConnectionFactory inVMConnectionFactory;private Connection notificationsQueueConnection;@PostConstructpublic void init() throws Exception {notificationsQueueConnection = inVMConnectionFactory.createConnection();Session notificationsQueueSession = notificationsQueueConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);MessageConsumer notificationsQueueConsumer = notificationsQueueSession.createConsumer(notificationsQueue);notificationsQueueConsumer.setMessageListener(this);notificationsQueueConnection.start();}@PreDestroypublic void destroy() throws Exception {if(notificationsQueueConnection != null)notificationsQueueConnection.close();}@Overridepublic void onMessage(Message message) {if (message instanceof TextMessage) {try {String text = ((TextMessage) message).getText();System.out.println("The Notification Message is : \n" + text);} catch (JMSException ex) {throw new RuntimeException(ex);}} else {throw new IllegalArgumentException("Message must be of type TextMessage");}}}

總結我們的示例業務案例,我們必須修改“ employeeService” Spring bean,以便在用戶每次請求保存或更新“ employee”數據時使用“ notificationsProducer”實用程序bean發送通知消息。 我們使用“ @Autowire”注釋在“ employeeService”內部連接“ notificationProducer”,并從“ notificationProducer”調用“ sendNotification”操作,以便每次請求“ employeeService”的saveOrUpdateEmployee“操作時發送通知。 完整的代碼如下所示:

package com.javacodegeeks.gwtspring.server.services;import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;import com.javacodegeeks.gwtspring.server.dao.EmployeeDAO;
import com.javacodegeeks.gwtspring.server.utils.NotificationsProducer;
import com.javacodegeeks.gwtspring.shared.dto.EmployeeDTO;
import com.javacodegeeks.gwtspring.shared.services.EmployeeService;@Service("employeeService")
public class EmployeeServiceImpl implements EmployeeService {@Autowiredprivate EmployeeDAO employeeDAO;@AutowiredNotificationsProducer notificationsProducer;@PostConstructpublic void init() throws Exception {}@PreDestroypublic void destroy() {}@Transactional(propagation=Propagation.SUPPORTS, rollbackFor=Exception.class)public EmployeeDTO findEmployee(long employeeId) {return employeeDAO.findById(employeeId);}@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)public void saveEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception {EmployeeDTO employeeDTO = employeeDAO.findById(employeeId);if(employeeDTO == null) {employeeDTO = new EmployeeDTO(employeeId, name,surname, jobDescription);employeeDAO.persist(employeeDTO);}}@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)public void updateEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception {EmployeeDTO employeeDTO = employeeDAO.findById(employeeId);if(employeeDTO != null) {employeeDTO.setEmployeeName(name);employeeDTO.setEmployeeSurname(surname);employeeDTO.setJob(jobDescription);}}@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)public void deleteEmployee(long employeeId) throws Exception {EmployeeDTO employeeDTO = employeeDAO.findById(employeeId);if(employeeDTO != null)employeeDAO.remove(employeeDTO);}@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)public void saveOrUpdateEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception {EmployeeDTO employeeDTO = new EmployeeDTO(employeeId, name,surname, jobDescription);employeeDAO.merge(employeeDTO);notificationsProducer.sendNotification("Save Or Update Employee with values : \nID : " + employeeId + "\nName : " + name + "\nSurname : " + surname + "\nJob description : " + jobDescription);}}

而已! 要部署Web應用程序,只需將/ war文件夾復制到Apache – Tomcat “ webapps”文件夾中。 您可以將war文件夾的名稱更改為您喜歡的名稱,最好在項目名稱之后將其重命名,例如GWTSpringInfinispanHornetQ

在午餐之前,應用程序不要忘記創建數據庫模式,這里是“ javacodegeeks”。

午餐應用程序將您的瀏覽器指向以下地址

http:// localhost:8080 / GWTSpringInfinispanHornetQ /

如果一切順利,您應該會看到您的主頁。 應該顯示兩個文本框,每個文本框后面都有一個按鈕。 在第一個文本框中,您可以將雇員保存或更新到數據庫。 作為輸入,提供ID,名稱,姓氏和職位描述,并用空格字符分隔。 單擊“ SaveOrUpdate”按鈕,將提供的信息存儲到數據庫中。 對于現有的“員工”條目(相同的ID),將執行更新。 在這兩種情況下,都應記錄一個通知日志。 日志格式應如下:

通知消息為:
使用值保存或更新員工:
編號:xxx 名稱:xxx 姓:xxx 職位描述:xxx

其中“ xxx”應為您提供的“員工”信息。 請查看日志文件(catalina.out)。 第二個文本框用于檢索現有的“雇員”條目。 提供一個“雇員” ID,然后單擊“檢索”按鈕。 如果“雇員”存在,則應看到“雇員” ID,姓名,姓氏和職位描述。

您可以從此處下載該項目(如開頭所述,并且不包含先前的文章,所需的第三方庫)

玩得開心!

賈斯汀

相關文章 :
  • GWT 2 Spring 3 JPA 2 Hibernate 3.5教程
  • GWT Spring和Hibernate進入數據網格世界
  • Spring3 RESTful Web服務
  • GWT 2 Spring 3 JPA 2 Hibernate 3.5教程– Eclipse和Maven 2展示
  • 帶有Spring和Maven教程的JAX–WS

翻譯自: https://www.javacodegeeks.com/2010/06/spring-3-hornetq-21-integration.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374670.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374670.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374670.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

B/S和C/S架構圖解

軟件&#xff1a;B/S和C/S兩種架構模式。接下來用三張圖片解釋&#xff0c;什么是B/S什么是C/S。 圖片一&#xff1a;軟件架構模式 圖片二&#xff1a;C/S結構模式 圖片三&#xff1a;B/S結構模式 相信圖解勝過冗長文字的解釋&#xff0c;什么是B/S什么是C/S一目了然。 轉載于:…

557. 反轉字符串中的單詞 III

給定一個字符串&#xff0c;你需要反轉字符串中每個單詞的字符順序&#xff0c;同時仍保留空格和單詞的初始順序。 class Solution {public String reverseWords(String s) {StringBuffer res new StringBuffer();int length s.length();int i 0;while(i < length){int …

休眠陷阱

我已經使用Hibernate已有一段時間了&#xff0c;當我一段時間不使用Hibernate項目時&#xff0c;發現自己犯的錯誤與上次相同。 因此&#xff0c;這是我的監視清單&#xff0c;希望對其他人也有用。 實現hashCode和equals 一般而言&#xff0c;應該始終實現這些方法&#xff…

HDU 5371 Hotaru's problem (Manacher,回文串)

題意&#xff1a;給一個序列&#xff0c;找出1個連續子序列&#xff0c;將其平分成前&#xff0c;中&#xff0c;后等長的3段子序列&#xff0c;要求【前】和【中】是回文&#xff0c;【中】和【后】是回文。求3段最長為多少&#xff1f;由于平分的關系&#xff0c;所以答案應該…

bash 與 dash

Ubuntu 的 bash和dash的區別 什么是bash &#xff1f; Bash(GNU Bourne-Again Shell)是許多Linux平臺的內定Shell&#xff0c;事實上&#xff0c;還有許多傳統UNIX上用的Shell&#xff0c;像tcsh、csh、ash、bsh、ksh等 等&#xff0c;Shell Script大致都類同&#xff0c;當您學…

350. 兩個數組的交集 II

給你兩個整數數組 nums1 和 nums2 &#xff0c;請你以數組形式返回兩數組的交集。返回結果中每個元素出現的次數&#xff0c;應與元素在兩個數組中都出現的次數一致&#xff08;如果出現次數不一致&#xff0c;則考慮取較小值&#xff09;。可以不考慮輸出結果的順序。 來源&a…

Eclipse:如何附加Java源代碼

在Eclipse中&#xff0c;當您按Ctrl按鈕并單擊任何類名稱時&#xff0c;IDE會將您帶到該類的源文件。 這是項目中具有的類的正常行為。 但是&#xff0c;如果您也希望Java核心類具有相同的行為&#xff0c;則可以通過將Java源代碼附加到Eclipse IDE來實現。 一旦附加了源代碼&a…

【樹狀數組】

問題的提出&#xff1a;是否可以用線性數據結構的方法解決動態統計子樹權和的問題呢&#xff1f; 有的&#xff0c;樹狀數組。 假設當前數組為a[]&#xff0c;元素個數為n。 1. 子區間的權和數組為sum&#xff0c;那么數組a[]中 i 到 j這段區間的數組元素和為sum[i,j] a[k]的累…

2013VS快捷鍵

VS2013常用快捷鍵&#xff1a; 1.回到上一個光標位置/前進到下一個光標位置 1&#xff09;回到上一個光標位置&#xff1a;使用組合鍵“Ctrl -”&#xff1b; 2&#xff09;前進到下一個光標位置&#xff1a;“Ctrl Shift - ”。 2.復制/剪切/刪除整行代碼 1&#xff09;如果…

GWT,GWT-Ext(SmartGWT),GXT(Ext GWT)常見任務

我在我們的JCG合作伙伴之一UI-Programming博客上瀏覽了一些舊文章&#xff0c;并注意到有很多簡短的文章&#xff0c;介紹了如何使用GWT&#xff0c;GWT-Ext&#xff08;SmartGWT&#xff09;和GXT&#xff08;Ext GWT&#xff09;執行一些常見任務。 &#xff09;。 我相信它們…

h.264 去塊濾波

塊效應及其產生原因 我們在觀看視頻的時候&#xff0c;在運動劇烈的場景常能觀察到圖像出現小方塊&#xff0c;小方塊在邊界處呈現不連續的效果&#xff08;如下圖&#xff09;&#xff0c;這種現象被稱為塊效應&#xff08;blocking artifact&#xff09;。 首先我們需要搞清楚…

android開發的知識點(一)

1.android中背景圖的設置&#xff1a; 將背景圖放入到項目中的res/drawable-hdpi或res/drawable-mdpi或res/drawable-xhdpi或res/drawable-xxhdpi等任一文件夾下。然后在layout的xml文件夾下使用android:background"drawable/背景圖名"&#xff0c;其中背景圖必須是p…

566. 重塑矩陣

在 MATLAB 中&#xff0c;有一個非常有用的函數 reshape &#xff0c;它可以將一個 m x n 矩陣重塑為另一個大小不同&#xff08;r x c&#xff09;的新矩陣&#xff0c;但保留其原始數據。 給你一個由二維數組 mat 表示的 m x n 矩陣&#xff0c;以及兩個正整數 r 和 c &…

RabbitMQ播放模塊! 構架

RabbitMQ提供了具有可預測且一致的吞吐量和延遲的高可用性&#xff0c;可伸縮和便攜式消息系統。 RabbitMQ是AMQP &#xff08;業務消息傳遞的開放標準&#xff09;的領先實現 &#xff0c;并且通過適配器支持XMPP&#xff0c;SMTP&#xff0c;STOMP和HTTP來進行輕量級Web消息傳…

Cyclic Nacklace - HDU 3746(next求循環節)

題目大意&#xff1a;給你一些串&#xff0c;問如果想讓這個串里面的循環節至少循環兩次&#xff0c;需要添加幾個字符&#xff08;只能在最前面或者最后面添加&#xff09;。比如ababc 需要添加5個就是添加ababc。 分析&#xff1a;其實字符串的長度len-next[len] 最小循環節…

Xuggler開發教程

大家好&#xff0c; 在這篇文章中&#xff0c;我想介紹JavaCodeGeeks上的一些很酷的新教程。 他們將討論與Xuggler &#xff0c; FFmpeg和Wowza進行媒體&#xff08;音頻/視頻&#xff09;操縱的方式。 我將在這篇文章中跟蹤所有相關的教程。 您可以通過查看Pat較早的關于使用…

739. 每日溫度

請根據每日 氣溫 列表 temperatures &#xff0c;請計算在每一天需要等幾天才會有更高的溫度。如果氣溫在這之后都不會升高&#xff0c;請在該位置用 0 來代替。 代碼一 單調棧 class Solution {public int[] dailyTemperatures(int[] temperatures) {int length temperatur…

一個非常好的性格切割問題

結伙stackoverflow看到一道非常不錯的問題。遂拿來分享之。 題目要求&#xff1a;我有一個非常長的字符串&#xff1a; String s1"This is my world. This has to be broken." 我要把上面的字符串打亂以固定的長度&#xff08;比如10&#xff09;使得輸出為&#xff…

Cajo,用Java完成分布式計算的最簡單方法

摘自Jonas Boner在2006年5月1日發布在TheServerSide.com上的文章“ Distributed Computing Easy”中的介紹部分&#xff1a; 分布式計算在企業應用程序開發世界中變得越來越重要。 如今&#xff0c;開發人員不斷需要解決以下問題&#xff1a;如何通過將應用程序擴展到單個節點之…

Java中Integer.parseInt()用法

1.先看看該方法的實現 public static int parseInt(String s) throws NumberFormatException {return parseInt(s,10);}2.事實上他可以有兩個參數&#xff0c; public static int parseInt(String s,int radix)意味著將字符串s按照radix進制轉換成整數。太抽象了&#xff0c;…