Доступ к Apache ActiveMQ без Spring.NET - PullRequest
2 голосов
/ 13 марта 2009

Я надеюсь, что кто-то здесь сможет помочь мне в моей борьбе с интеграцией с ActiveMQ из C #. Вот что я сделал до сих пор:

using Apache.NMS;
using Apache.NMS.ActiveMQ;
namespace JMSTest {
  class Program {
    static void Main(string[] args) {
      IConnectionFactory factory = new ConnectionFactory("tcp://localhost:61616/");
      IConnection connection = factory.CreateConnection();
      ISession session = connection.CreateSession();
    }
  }
}

Довольно простые вещи: просто создайте фабрику соединений, затем используйте ее для создания соединения и в конце создайте сеанс. Теперь, когда я выполняю этот код, это исключение, которое выдается:

System.ArgumentOutOfRangeException: Index and length must refer to a location within the string.
Parameter name: length
   at System.String.InternalSubStringWithChecks(Int32 startIndex, Int32 length, Boolean fAlwaysCopy)
   at System.String.Substring(Int32 startIndex, Int32 length)
   at Apache.NMS.ActiveMQ.OpenWire.StringPackageSplitter.StringPackageSplitterEnumerator.System.Collections.IEnumerator.get_Current()
   at Apache.NMS.ActiveMQ.OpenWire.OpenWireBinaryWriter.Write(String text)
   at Apache.NMS.ActiveMQ.OpenWire.BaseDataStreamMarshaller.LooseMarshalString(String value, BinaryWriter dataOut)
   at Apache.NMS.ActiveMQ.OpenWire.V2.ConnectionIdMarshaller.LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
   at Apache.NMS.ActiveMQ.OpenWire.OpenWireFormat.LooseMarshalNestedObject(DataStructure o, BinaryWriter dataOut)
   at Apache.NMS.ActiveMQ.OpenWire.BaseDataStreamMarshaller.LooseMarshalCachedObject(OpenWireFormat wireFormat, DataStructure o, BinaryWriter dataOut)
   at Apache.NMS.ActiveMQ.OpenWire.V2.ConnectionInfoMarshaller.LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
   at Apache.NMS.ActiveMQ.OpenWire.OpenWireFormat.Marshal(Object o, BinaryWriter ds)
   at Apache.NMS.ActiveMQ.Transport.Tcp.TcpTransport.Oneway(Command command) : Transport connection error: Index and length must refer to a location within the string.
Parameter name: length

Кто-нибудь знает, что происходит? Я использую Apache ActiveMQ версии 5.2.0 (свежая загрузка с их веб-сайта).

Ответы [ 3 ]

5 голосов
/ 13 марта 2009

Я попробовал то же самое, что у вас здесь, и, похоже, это сработало. Кто-то на веб-сайте ответил на ваш запрос о Nabble, что там была ошибка (где?), Которая была исправлена. Возможно, загрузите последнюю версию Apache.NMS / Apache.NMS.ActiveMQ и попробуйте снова.

Apache.NMS поставляется с Spring.NET - это, вероятно, лучший и самый простой способ получить Apache.NMS.

1 голос
/ 22 сентября 2010

Просто для ответа на комментарий «Кажется излишним использовать каркас размером более 25 МБ просто для отправки и получения сообщений из / в очередь сообщений».

Я, конечно, согласен, и это действительно проблема с упаковкой, мы включаем скомпилированные двоичные файлы для справочных документов .NET 1.1 до 3.0 (сборки отладки и выпуска с .pdbs), примеры приложений и так далее. Если вы посмотрите на размер .dll, который вам нужен для создания приложения Spring.NET на базе ActiveMQ NMS, то это

Common.Logging 28 КБ, Spring.Aop 152 КБ, Spring.Core 744 КБ, Spring.Data 340 КБ и Spring.Messaging.Nns 104 КБ на общую сумму ~ 1,4 МБ.

Mark

1 голос
/ 13 марта 2009

Ну, проблема решена. Это заняло некоторое время, но с помощью сообщения, которое прислал Энди Уайт, я смог запустить его так, как я хотел.

Проблема, конечно, заключалась в том, что те библиотеки, которые в настоящее время доступны на http://svn.apache.org/viewvc/activemq/activemq-dotnet/, просто сломаны и не работают вообще.

Спасибо, Энди!

...